/*
  Sets
*/

%fragment("StdSetTraits","header",fragment="StdSequenceTraits")
%{
  namespace swig {
    template <class T>
    struct traits_asptr<std::set<T> >  {
      static int asptr(PyObject *obj, std::set<T> **s) {
	return traits_asptr_stdseq<std::set<T> >::asptr(obj, s);
      }
    };

    template <class T>
    struct traits_from<std::set<T> > {
      static PyObject *from(const std::set<T>& vec) {
	return traits_from_stdseq<std::set<T> >::from(vec);
      }
    };
  }
%}

// A set of Python objects takes anything, so the catch-all __contains__ overload is redundant
%ignore std::set<swig::SwigPtr_PyObject>::__contains__(PyObject *);

%define %swig_set_methods(set...)
  %swig_sequence_iterator(set);
  %swig_container_methods(set);

#if defined(SWIGPYTHON_BUILTIN)
  %feature("python:slot", "mp_subscript", functype="binaryfunc") __getitem__;
  %feature("python:slot", "sq_contains", functype="objobjproc") __contains__;
#endif

  %extend {
     void append(value_type x) {
       self->insert(x);
     }
  
     bool __contains__(value_type x) {
       return self->find(x) != self->end();
     }

     bool __contains__(PyObject *) {
       return false;
     }

     value_type __getitem__(difference_type i) const throw (std::out_of_range) {
       return *(swig::cgetpos(self, i));
     }

     void add(value_type x) {
       self->insert(x);
     }

     void discard(value_type x) {
       self->erase(x);
     }
  }
%enddef

%include <std/std_set.i>
