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