#if ! defined _Bag_h #define _Bag_h 1 #include #include #include #include namespace omega { template class Bag : public Collection { public: virtual ~Bag(); Bag(); Bag(const Bag&); Bag & operator=(const Bag&); //! add elements in b virtual void operator |= (const Bag & b); Iterator *new_iterator(); bool empty() const; void remove(T); virtual void insert(T); void clear(); virtual bool contains(T) const; int size() const; T extract(); // protected: breaks g++ 261 List_Element* contents; }; template class Ordered_Bag : public Bag { public: Ordered_Bag(); Ordered_Bag(const Ordered_Bag& B) : Bag(B) {} void insert(T); //! add elements in b virtual void operator |= (const Ordered_Bag & b); //! add elements in b void operator |= (const Bag & b); bool contains(T) const; bool operator == (const Ordered_Bag&) const; bool operator != (const Ordered_Bag&) const; bool operator < (const Ordered_Bag&) const; }; template class Set : public Ordered_Bag { public: Set(); Set(T); Set(const Set& S) : Ordered_Bag(S) {} bool contains (const Set& b) const; bool contains (T t) const { return Ordered_Bag::contains(t); } // the above makes "standard" C++ happy //! add elements in b virtual void operator |= (const Set & b); //! add elements in b void operator |= (const Ordered_Bag & b); //! add elements in b void operator |= (const Bag & b); //! delete items also in b void operator -= (const Set & b); //! delete items not in b void operator &= (const Set & b); //! check for elements in common bool operator & (const Set &) const; }; } // namespace #if ! defined DONT_INCLUDE_TEMPLATE_CODE #include #endif #define instantiate_Bag(T) template class Bag; \ instantiate_List_Element(T); #define instantiate_Ordered_Bag(T) template class Ordered_Bag; \ instantiate_Bag(T) #define instantiate_Set(T) template class Set; \ instantiate_Ordered_Bag(T) #endif