diff --git a/src/libCom/cxxTemplates/tsDLList.h b/src/libCom/cxxTemplates/tsDLList.h index 2dd19643c..0e2c83c3f 100644 --- a/src/libCom/cxxTemplates/tsDLList.h +++ b/src/libCom/cxxTemplates/tsDLList.h @@ -37,8 +37,12 @@ template class tsDLList; template class tsDLIter; template class tsDLFwdIter; template class tsDLBwdIter; +template class tsDLIterConstBD; template class tsDLIterBD; +// +// class tsDLNode +// // // class tsDLNode // @@ -52,6 +56,7 @@ class tsDLNode { friend class tsDLIter; friend class tsDLFwdIter; friend class tsDLBwdIter; + friend class tsDLIterConstBD; friend class tsDLIterBD; public: tsDLNode(); @@ -134,6 +139,86 @@ private: tsDLList (const tsDLList &); }; +// +// class tsDLIterConstBD +// +// bi-directional const doubly linked list iterator +// +template +class tsDLIterConstBD { +public: + tsDLIterConstBD (const T *pInitialEntry); + + tsDLIterConstBD operator = (const T *pNewEntry); + + tsDLIterConstBD itemAfter (); + tsDLIterConstBD itemBefore (); + + bool operator == (const tsDLIterConstBD &rhs) const; + bool operator != (const tsDLIterConstBD &rhs) const; + + const T & operator * () const; + const T * operator -> () const; + //operator const T * () const; + + tsDLIterConstBD operator ++ (); // prefix ++ + tsDLIterConstBD operator ++ (int); // postfix ++ + tsDLIterConstBD operator -- (); // prefix -- + tsDLIterConstBD operator -- (int); // postfix -- + +# if defined(_MSC_VER) && _MSC_VER < 1200 + tsDLIterConstBD (const class tsDLIterConstBD ©In); +# endif + + // + // end of the list constant + // + static const tsDLIterConstBD eol (); + +protected: + union { + const T *pConstEntry; + T *pEntry; + }; +}; + +// +// class tsDLIterBD +// +// bi-directional doubly linked list iterator +// +template +class tsDLIterBD : private tsDLIterConstBD { +public: + tsDLIterBD (T *pInitialEntry); + + tsDLIterBD operator = (T *pNewEntry); + + tsDLIterBD itemAfter (); + tsDLIterBD itemBefore (); + + bool operator == (const tsDLIterBD &rhs) const; + bool operator != (const tsDLIterBD &rhs) const; + + T & operator * () const; + T * operator -> () const; + //operator T* () const; + + tsDLIterBD operator ++ (); // prefix ++ + tsDLIterBD operator ++ (int); // postfix ++ + tsDLIterBD operator -- (); // prefix -- + tsDLIterBD operator -- (int); // postfix -- + +# if defined(_MSC_VER) && _MSC_VER < 1200 + tsDLIterBD (const class tsDLIterBD ©In); +# endif + + // + // end of the list constant + // + static const tsDLIterBD eol (); +}; + // // tsDLIter // @@ -249,43 +334,6 @@ protected: }; -// -// class tsDLIterBD -// -// bi-directional doubly linked list iterator -// -template -class tsDLIterBD { -public: - tsDLIterBD (T *pInitialEntry); - - tsDLIterBD operator = (T *pNewEntry); - - bool operator == (const tsDLIterBD &rhs) const; - bool operator != (const tsDLIterBD &rhs) const; - - T & operator * () const; - T * operator -> () const; - operator T* () const; - - tsDLIterBD operator ++ (); // prefix ++ - tsDLIterBD operator ++ (int); // postfix ++ - tsDLIterBD operator -- (); // prefix -- - tsDLIterBD operator -- (int); // postfix -- - -# if defined(_MSC_VER) && _MSC_VER < 1200 - tsDLIterBD (const class tsDLIterBD ©In); -# endif - - // - // end of the list constant - // - static const tsDLIterBD eol (); - -private: - T *pEntry; -}; - /////////////////////////////////// // tsDLNode member functions /////////////////////////////////// @@ -580,8 +628,8 @@ int tsDLList::find (T &item) const tsDLNode *pItem; int itemNo=0; - while ( (pItem = iter.next()) ) { - if (pItem == &item) { + while ( ( pItem = iter.next () ) ) { + if ( pItem == &item ) { return itemNo; } itemNo++; @@ -589,13 +637,140 @@ int tsDLList::find (T &item) const return -1; } +////////////////////////////////////////// +// tsDLIterConstBD member functions +////////////////////////////////////////// +template +inline tsDLIterConstBD::tsDLIterConstBD (const T * pInitialEntry) : + pConstEntry (pInitialEntry) {} + +// +// This is apparently required by some compiler, but +// only causes trouble with MS Visual C 6.0. This +// should not be required by any compiler. I am assuming +// that this "some compiler" is a past version of MS +// Visual C. +// +# if defined(_MSC_VER) && _MSC_VER < 1200 + template + tsDLIterConstBD::tsDLIterConstBD (const class tsDLIterBD ©In) : + pConstEntry (copyIn.pEntry) {} +# endif + +template +inline tsDLIterConstBD tsDLIterConstBD::operator = (const T *pNewEntry) +{ + this->pConstEntry = pNewEntry; + return *this; +} + +template +inline bool tsDLIterConstBD::operator == (const tsDLIterConstBD &rhs) const +{ + return this->pConstEntry == rhs.pConstEntry; +} + +template +inline bool tsDLIterConstBD::operator != (const tsDLIterConstBD &rhs) const +{ + return this->pConstEntry != rhs.pConstEntry; +} + +template +inline const T & tsDLIterConstBD::operator * () const +{ + return *this->pConstEntry; +} + +template +inline const T * tsDLIterConstBD::operator -> () const +{ + return this->pConstEntry; +} + +//template +//inline tsDLIterConstBD::operator const T * () const +//{ + //return this->pConstEntry; + //return 0; +//} + +template +inline tsDLIterConstBD tsDLIterConstBD::itemAfter () +{ + const tsDLNode &node = *this->pConstEntry; + return tsDLIterConstBD (node.pNext); +} + +template +inline tsDLIterConstBD tsDLIterConstBD::itemBefore () +{ + const tsDLNode &node = *this->pConstEntry; + return tsDLIterConstBD (node.pPrev); +} + +// +// prefix ++ +// +template +inline tsDLIterConstBD tsDLIterConstBD::operator ++ () +{ + const tsDLNode &node = *this->pConstEntry; + this->pConstEntry = node.pNext; + return *this; +} + +// +// postfix ++ +// +template +inline tsDLIterConstBD tsDLIterConstBD::operator ++ (int) +{ + tsDLIterConstBD tmp = *this; + const tsDLNode &node = *this->pConstEntry; + this->pConstEntry = node.pNext; + return tmp; +} + +// +// prefix -- +// +template +inline tsDLIterConstBD tsDLIterConstBD::operator -- () +{ + const tsDLNode &entryNode = *this->pConstEntry; + this->pConstEntry = entryNode.pPrev; + return *this; +} + +// +// postfix -- +// +template +inline tsDLIterConstBD tsDLIterConstBD::operator -- (int) +{ + tsDLIterConstBD tmp = *this; + const tsDLNode &entryNode = *this->pConstEntry; + this->pConstEntry = entryNode.pPrev; + return tmp; +} + +// +// tsDLIterConstBD::eol +// +template +inline const tsDLIterConstBD tsDLIterConstBD::eol () +{ + return tsDLIterConstBD(0); +} + ////////////////////////////////////////// // tsDLIterBD member functions ////////////////////////////////////////// template inline tsDLIterBD::tsDLIterBD (T * pInitialEntry) : - pEntry(pInitialEntry) {} + tsDLIterConstBD (pInitialEntry) {} // // This is apparently required by some compiler, but @@ -607,26 +782,26 @@ inline tsDLIterBD::tsDLIterBD (T * pInitialEntry) : # if defined(_MSC_VER) && _MSC_VER < 1200 template tsDLIterBD::tsDLIterBD (const class tsDLIterBD ©In) : - pEntry(copyIn.pEntry) {} + tsDLIterConstBD (copyIn) {} # endif template inline tsDLIterBD tsDLIterBD::operator = (T *pNewEntry) { - this->pEntry = pNewEntry; - return *this; + tsDLIterConstBD::operator = (pNewEntry); + return *this; } template inline bool tsDLIterBD::operator == (const tsDLIterBD &rhs) const { - return (this->pEntry == rhs.pEntry); + return this->pEntry == rhs.pEntry; } template inline bool tsDLIterBD::operator != (const tsDLIterBD &rhs) const { - return (this->pEntry != rhs.pEntry); + return this->pEntry != rhs.pEntry; } template @@ -641,10 +816,24 @@ inline T * tsDLIterBD::operator -> () const return this->pEntry; } +//template +//inline tsDLIterBD::operator T * () const +//{ +// return this->pEntry; +//} + template -inline tsDLIterBD::operator T* () const +inline tsDLIterBD tsDLIterBD::itemAfter () { - return this->pEntry; + tsDLNode &node = *this->pEntry; + return tsDLIterBD (node.pNext); +} + +template +inline tsDLIterBD tsDLIterBD::itemBefore () +{ + tsDLNode &node = *this->pEntry; + return tsDLIterBD (node.pPrev); } // @@ -653,8 +842,7 @@ inline tsDLIterBD::operator T* () const template inline tsDLIterBD tsDLIterBD::operator ++ () { - tsDLNode &node = *this->pEntry; - this->pEntry = node.pNext; + this->tsDLIterConstBD::operator ++ (); return *this; } @@ -665,8 +853,7 @@ template inline tsDLIterBD tsDLIterBD::operator ++ (int) { tsDLIterBD tmp = *this; - tsDLNode &node = *this->pEntry; - this->pEntry = node.pNext; + this->tsDLIterConstBD::operator ++ (1); return tmp; } @@ -676,8 +863,7 @@ inline tsDLIterBD tsDLIterBD::operator ++ (int) template inline tsDLIterBD tsDLIterBD::operator -- () { - tsDLNode &entryNode = *this->pEntry; - this->pEntry = entryNode.pPrev; + this->tsDLIterConstBD::operator -- (); return *this; } @@ -688,8 +874,7 @@ template inline tsDLIterBD tsDLIterBD::operator -- (int) { tsDLIterBD tmp = *this; - tsDLNode &entryNode = *this->pEntry; - this->pEntry = entryNode.pPrev; + this->tsDLIterConstBD::operator -- (1); return tmp; } @@ -797,7 +982,6 @@ inline T * tsDLIter::current() return this->pCurrent; } - /////////////////////////////////////////// // tsDLBwdIter member functions /////////////////////////////////////////// @@ -878,21 +1062,6 @@ inline T * tsDLBwdIter::operator () () return this->tsDLIter::prev(); } -// -// tsDLBwdIter::prev () -// -template -inline T * tsDLBwdIter::prev () -{ - return this->tsDLIter::prev(); -} - -template -inline T * tsDLBwdIter::current() -{ - return this->tsDLIter::current (); -} - ////////////////////////////////////////// // tsDLFwdIter member functions //////////////////////////////////////////