Proton  1.1.1
Make porting easy from Python to C++11
unordered_set.hpp
1 #ifndef PROTON_UNORDERED_SET_HEADER
2 #define PROTON_UNORDERED_SET_HEADER
3 
4 #include <unordered_set>
5 #include <iterator>
6 #include <iostream>
7 
8 namespace proton{
9 
10 namespace detail{
11 
12 template<typename T, typename H, typename C, typename A>
13 struct has_t<std::unordered_set<T,H,C,A> >{
14  template<typename V> static bool result(const std::unordered_set<T,H,C,A>& x, V&& v)
15  {
16  return x.find(v)!=x.end();
17  }
18 };
19 
20 } // ns detail
21 
22 template <typename T, typename H, typename C, typename A, typename V >
23 std::unordered_set<T,H,C,A>& operator<<(std::unordered_set<T,H,C,A>& x, V&& val)
24 {
25  x.insert(val);
26  return x;
27 }
28 
29 template <typename T, typename H, typename C, typename A, typename V >
30 std::unordered_set<T,H,C,A>& operator>>(std::unordered_set<T,H,C,A>& x, V& val)
31 {
32  PROTON_THROW_IF(x.empty(), "want to pop an empty set.");
33  val=*x.begin();
34  x.erase(x.begin());
35  return x;
36 }
37 
38 template <typename T, typename H, typename C, typename A>
39 std::ostream& operator<<(std::ostream& s, const std::unordered_set<T,H,C,A>& x)
40 {
41  s << "{";
42  bool first=true;
43  for(auto& t: x){
44  if(first)
45  first=false;
46  else
47  s <<", ";
48  s << t;
49  }
50  s << "}";
51  return s;
52 }
53 
54 template <typename T, typename H, typename C, typename A>
55 std::unordered_set<T,H,C,A> operator&(const std::unordered_set<T,H,C,A>& x, const std::unordered_set<T,H,C,A>& y)
56 {
57  std::unordered_set<T,H,C,A> z;
58  if(x.size()<y.size()){
59  for(auto& t:x){
60  if(has(y,t))
61  z << t;
62  }
63  return z;
64  }
65  else{
66  for(auto& t: y){
67  if(has(x,t))
68  z << t;
69  }
70  return z;
71  }
72 }
73 
74 template <typename T, typename H, typename C, typename A>
75 std::unordered_set<T,H,C,A> operator|(const std::unordered_set<T,H,C,A>& x, const std::unordered_set<T,H,C,A>& y)
76 {
77  std::unordered_set<T,H,C,A> z;
78  for(auto& t: x){
79  z << t;
80  }
81  for(auto& t: y){
82  z << t;
83  }
84  return z;
85 }
86 
87 template <typename T, typename H, typename C, typename A>
88 std::unordered_set<T,H,C,A>& operator&=(std::unordered_set<T,H,C,A>& x,
89  const std::unordered_set<T,H,C,A>& y)
90 {
91  auto it=x.begin(), end=x.end();
92  while(it!=end){
93  if(!has(y,*it)){
94  auto it1=it;
95  ++it;
96  x.erase(it1);
97  }
98  else
99  ++it;
100  }
101  return x;
102 }
103 
104 template <typename T, typename H, typename C, typename A>
105 std::unordered_set<T,H,C,A>& operator|=(std::unordered_set<T,H,C,A>& x,
106  const std::unordered_set<T,H,C,A>& y)
107 {
108  for(auto& t: y){
109  x << t;
110  }
111  return x;
112 }
113 
114 }
115 
116 #endif // PROTON_UNORDERED_SET_HEADER