set_adaptor.hpp 3.4 KB

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