123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- // (C) Copyright Jeremy Siek 2001.
- // Distributed under the Boost Software License, Version 1.0. (See
- // accompanying file LICENSE_1_0.txt or copy at
- // http://www.boost.org/LICENSE_1_0.txt)
- #ifndef BOOST_SET_ADAPTOR_HPP
- #define BOOST_SET_ADAPTOR_HPP
- #include <set>
- #include <boost/unordered_set.hpp>
- namespace boost
- {
- template < class K, class C, class A, class T >
- bool set_contains(const std::set< K, C, A >& s, const T& x)
- {
- return s.find(x) != s.end();
- }
- template < class K, class H, class C, class A, class T >
- bool set_contains(const boost::unordered_set< K, H, C, A >& s, const T& x)
- {
- return s.find(x) != s.end();
- }
- template < class K, class C, class A >
- bool set_equal(const std::set< K, C, A >& x, const std::set< K, C, A >& y)
- {
- return x == y;
- }
- // Not the same as lexicographical_compare_3way applied to std::set.
- // this is equivalent semantically to bitset::operator<()
- template < class K, class C, class A >
- int set_lex_order(const std::set< K, C, A >& x, const std::set< K, C, A >& y)
- {
- typename std::set< K, C, A >::iterator xi = x.begin(), yi = y.begin(),
- xend = x.end(), yend = y.end();
- for (; xi != xend && yi != yend; ++xi, ++yi)
- {
- if (*xi < *yi)
- return 1;
- else if (*yi < *xi)
- return -1;
- }
- if (xi == xend)
- return (yi == yend) ? 0 : -1;
- else
- return 1;
- }
- template < class K, class C, class A > void set_clear(std::set< K, C, A >& x)
- {
- x.clear();
- }
- template < class K, class C, class A >
- bool set_empty(const std::set< K, C, A >& x)
- {
- return x.empty();
- }
- template < class K, class C, class A, class T >
- void set_insert(std::set< K, C, A >& x, const T& a)
- {
- x.insert(a);
- }
- template < class K, class C, class A, class T >
- void set_remove(std::set< K, C, A >& x, const T& a)
- {
- x.erase(a);
- }
- template < class K, class C, class A >
- void set_intersect(const std::set< K, C, A >& x, const std::set< K, C, A >& y,
- std::set< K, C, A >& z)
- {
- z.clear();
- std::set_intersection(
- x.begin(), x.end(), y.begin(), y.end(), std::inserter(z));
- }
- template < class K, class C, class A >
- void set_union(const std::set< K, C, A >& x, const std::set< K, C, A >& y,
- std::set< K, C, A >& z)
- {
- z.clear();
- std::set_union(x.begin(), x.end(), y.begin(), y.end(), std::inserter(z));
- }
- template < class K, class C, class A >
- void set_difference(const std::set< K, C, A >& x, const std::set< K, C, A >& y,
- std::set< K, C, A >& z)
- {
- z.clear();
- std::set_difference(
- x.begin(), x.end(), y.begin(), y.end(), std::inserter(z, z.begin()));
- }
- template < class K, class C, class A >
- bool set_subset(const std::set< K, C, A >& x, const std::set< K, C, A >& y)
- {
- return std::includes(x.begin(), x.end(), y.begin(), y.end());
- }
- // Shit, can't implement this without knowing the size of the
- // universe.
- template < class K, class C, class A >
- void set_compliment(const std::set< K, C, A >& /*x*/, std::set< K, C, A >& z)
- {
- z.clear();
- }
- } // namespace boost
- #endif // BOOST_SET_ADAPTOR_HPP
|