#pragma once #include "chain.h" // Classes Defined in this file class Set; class SetIterator; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Set ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class Set : public Socket { friend class SetIterator; public: Logical TestInstance() const; // Constructor Set(Node *node); ~Set(); protected: Set& operator=(const Set &rhs); //STUBBED: UNKNOWN RB 1/15/07 //void // AddImplementation(Plug *plug); // Useful Set Operations Logical operator==(const Set &rhs); Set operator-(const Set &rhs) const; Set Union(const Set &rhs) const; Set Intersection(const Set &rhs) const; // Set membership Logical Exists(const Plug &element) const; private: Chain *contents; }; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ SetOf ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ template class SetOf: public Set { public: SetOf(Node *node); ~SetOf(); protected: SetOf(Set set): Set(set) { } public: // Public interface void Add(T *plug) {AddImplementation(plug);} // Useful Set Operations SetOf& operator=(const SetOf &rhs) { if (this==&rhs) return *this; Set::operator=(rhs); return *this; } Logical operator==(const SetOf &rhs) {return Set::operator==(rhs);} SetOf operator-(const SetOf rhs) const {return (SetOf) Set::operator-(rhs);} SetOf Union(const SetOf &rhs) const {return (SetOf) Set::Union(rhs);} SetOf Intersection(const SetOf &rhs) const {return (SetOf) Set::Intersection(rhs);} }; //~~~~~~~~~~~~~~~~~~~~~~~~~~~ SetOf templates ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ template SetOf::SetOf(Node *node): Set(node) { } template SetOf::~SetOf() { } //~~~~~~~~~~~~~~~~~~~~~~~~~~~ SetIterator ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class SetIterator: public ChainIterator { public: friend class Set; // //-------------------------------------------------------------------- //-------------------------------------------------------------------- // Public interface //-------------------------------------------------------------------- //-------------------------------------------------------------------- // // //-------------------------------------------------------------------- // Constructors, Destructor and testing //-------------------------------------------------------------------- // SetIterator(Set *set); SetIterator(const SetIterator &iterator); ~SetIterator(); protected: SetIterator(Chain *chain); // Used fot Set implementation to iterate on own contents }; //~~~~~~~~~~~~~~~~~~~~~~~~~~ SetIteratorOf ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ template class SetIteratorOf: public SetIterator { public: // //-------------------------------------------------------------------- //-------------------------------------------------------------------- // Public interface //-------------------------------------------------------------------- //-------------------------------------------------------------------- // // //-------------------------------------------------------------------- // Constructors and Destructor //-------------------------------------------------------------------- // SetIteratorOf(SetOf *chain); SetIteratorOf(SetOf &chain); SetIteratorOf(const SetIteratorOf &iterator); ~SetIteratorOf(); // //-------------------------------------------------------------------- // Iterator methods (see Iterator for full listing) //-------------------------------------------------------------------- // T* ReadAndNext() {return (T*)ReadAndNextImplementation();} T* ReadAndPrevious() {return (T*)ReadAndPreviousImplementation();} T* GetCurrent() {return (T*)GetCurrentImplementation();} T* GetNth(CollectionSize index) {return (T*)GetNthImplementation(index);} void Insert(T *plug) {InsertImplementation(plug);} SetIteratorOf& Begin() {return (SetIteratorOf&)BeginImplementation();} SetIteratorOf& End() {return (SetIteratorOf&)EndImplementation();} SetIteratorOf& Forward() {return (SetIteratorOf&)ForwardImplementation();} SetIteratorOf& Backward() {return (SetIteratorOf&)BackwardImplementation();} // //--------------------------------------------------- // Operators useful when it is know that the iterator // is a SetOf<> Iterator //--------------------------------------------------- // #if 0 Logical operator!() {return currentLink == NULL;} operator T*() {return GetCurrent();} T* operator->() {return GetCurrent();} T& operator*() {return *GetCurrent();} SetIteratorOf& operator++() {Next(); return *this;} SetIteratorOf& operator--() {Previous(); return *this;} T* operator++(int) {return ReadAndNext();} T* operator--(int) {return ReadAndPrevious();} #endif }; //~~~~~~~~~~~~~~~~~~~~~~~~~~ SetIteratorOf templates ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ template SetIteratorOf::SetIteratorOf(SetOf *set): SetIterator(chain) { } template SetIteratorOf::SetIteratorOf(SetOf &set): SetIterator(&chain) { } template SetIteratorOf::SetIteratorOf(const SetIteratorOf &iterator): SetIterator(iterator) { } template SetIteratorOf::~SetIteratorOf() { }