// (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
