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