1 // (C) Copyright Jeremy Siek 2001. 2 // Distributed under the Boost Software License, Version 1.0. (See 3 // accompanying file LICENSE_1_0.txt or copy at 4 // http://www.boost.org/LICENSE_1_0.txt) 5 6 #ifndef BOOST_SET_ADAPTOR_HPP 7 #define BOOST_SET_ADAPTOR_HPP 8 9 #include <set> 10 #include <boost/unordered_set.hpp> 11 12 namespace boost { 13 14 template <class K, class C, class A, class T> set_contains(const std::set<K,C,A> & s,const T & x)15 bool set_contains(const std::set<K,C,A>& s, const T& x) { 16 return s.find(x) != s.end(); 17 } 18 19 template <class K, class H, class C, class A, class T> set_contains(const boost::unordered_set<K,H,C,A> & s,const T & x)20 bool set_contains(const boost::unordered_set<K,H,C,A>& s, const T& x) { 21 return s.find(x) != s.end(); 22 } 23 24 template <class K, class C, class A> set_equal(const std::set<K,C,A> & x,const std::set<K,C,A> & y)25 bool set_equal(const std::set<K,C,A>& x, 26 const std::set<K,C,A>& y) 27 { 28 return x == y; 29 } 30 31 // Not the same as lexicographical_compare_3way applied to std::set. 32 // this is equivalent semantically to bitset::operator<() 33 template <class K, class C, class A> set_lex_order(const std::set<K,C,A> & x,const std::set<K,C,A> & y)34 int set_lex_order(const std::set<K,C,A>& x, 35 const std::set<K,C,A>& y) 36 { 37 typename std::set<K,C,A>::iterator 38 xi = x.begin(), yi = y.begin(), xend = x.end(), yend = y.end(); 39 for (; xi != xend && yi != yend; ++xi, ++yi) { 40 if (*xi < *yi) 41 return 1; 42 else if (*yi < *xi) 43 return -1; 44 } 45 if (xi == xend) 46 return (yi == yend) ? 0 : -1; 47 else 48 return 1; 49 } 50 51 template <class K, class C, class A> set_clear(std::set<K,C,A> & x)52 void set_clear(std::set<K,C,A>& x) { 53 x.clear(); 54 } 55 56 template <class K, class C, class A> set_empty(const std::set<K,C,A> & x)57 bool set_empty(const std::set<K,C,A>& x) { 58 return x.empty(); 59 } 60 61 template <class K, class C, class A, class T> set_insert(std::set<K,C,A> & x,const T & a)62 void set_insert(std::set<K,C,A>& x, const T& a) { 63 x.insert(a); 64 } 65 66 template <class K, class C, class A, class T> set_remove(std::set<K,C,A> & x,const T & a)67 void set_remove(std::set<K,C,A>& x, const T& a) { 68 x.erase(a); 69 } 70 71 template <class K, class C, class A> set_intersect(const std::set<K,C,A> & x,const std::set<K,C,A> & y,std::set<K,C,A> & z)72 void set_intersect(const std::set<K,C,A>& x, 73 const std::set<K,C,A>& y, 74 std::set<K,C,A>& z) 75 { 76 z.clear(); 77 std::set_intersection(x.begin(), x.end(), 78 y.begin(), y.end(), 79 std::inserter(z)); 80 } 81 82 template <class K, class C, class A> set_union(const std::set<K,C,A> & x,const std::set<K,C,A> & y,std::set<K,C,A> & z)83 void set_union(const std::set<K,C,A>& x, 84 const std::set<K,C,A>& y, 85 std::set<K,C,A>& z) 86 { 87 z.clear(); 88 std::set_union(x.begin(), x.end(), 89 y.begin(), y.end(), 90 std::inserter(z)); 91 } 92 93 template <class K, class C, class A> set_difference(const std::set<K,C,A> & x,const std::set<K,C,A> & y,std::set<K,C,A> & z)94 void set_difference(const std::set<K,C,A>& x, 95 const std::set<K,C,A>& y, 96 std::set<K,C,A>& z) 97 { 98 z.clear(); 99 std::set_difference(x.begin(), x.end(), 100 y.begin(), y.end(), 101 std::inserter(z, z.begin())); 102 } 103 104 template <class K, class C, class A> set_subset(const std::set<K,C,A> & x,const std::set<K,C,A> & y)105 bool set_subset(const std::set<K,C,A>& x, 106 const std::set<K,C,A>& y) 107 { 108 return std::includes(x.begin(), x.end(), y.begin(), y.end()); 109 } 110 111 // Shit, can't implement this without knowing the size of the 112 // universe. 113 template <class K, class C, class A> set_compliment(const std::set<K,C,A> & x,std::set<K,C,A> & z)114 void set_compliment(const std::set<K,C,A>& x, 115 std::set<K,C,A>& z) 116 { 117 z.clear(); 118 119 } 120 121 } // namespace boost 122 123 #endif // BOOST_SET_ADAPTOR_HPP 124