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