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