/* * CENA C++ Utilities * * by Stephane Chatty * * Copyright 1992 * Centre d'Etudes de la Navigation Aerienne (CENA) * * generic chains of objects - to be updated * * $Id$ * $CurLog$ */ #ifndef Chain_H_ #define Chain_H_ #include "cplus_bugs.h" typedef void CcuChainItem; class CcuChainIter; class CcuChain { friend class CcuChainIter; public: enum chain_status { NoError, WasEmpty, TooEarly, TooFar, BadIterator }; protected: CcuChainItem* LastLink; chain_status StatusFlag; inline CcuChain () : LastLink (0), StatusFlag (NoError) { } inline CcuChain (CcuChainItem* e) : LastLink (e), StatusFlag (NoError) { } virtual ~CcuChain (); virtual CcuChainItem* GetNext (CcuChainItem*) const = 0; virtual void SetNext (CcuChainItem*, CcuChainItem*) const = 0; virtual void Delete (CcuChainItem*) const = 0; CcuChainItem* GetPrevious (CcuChainItem*) ; public: inline chain_status GetStatus () const { return StatusFlag; } inline int IsEmpty () const { return !LastLink; } CcuChainItem* First (); CcuChainItem* Last (); CcuChainItem* Nth (int n); int Length () const; int Find (CcuChainItem*) const; void Append (CcuChainItem*); void Prepend (CcuChainItem*); inline CcuChain& operator << (CcuChainItem* it) { Append (it); return *this; } CcuChainItem* RemoveFirst (); CcuChainItem* RemoveLast (); int Remove (CcuChainItem*); int Remove (int (*) (CcuChainItem*)); void Clear (); void InsertAfter (const CcuChainIter&, CcuChainItem*); void InsertBefore (const CcuChainIter&, CcuChainItem*); CcuChainItem* RemoveAfter (const CcuChainIter&); void InsertAfter (CcuChainItem*, CcuChainItem*); void InsertBefore (CcuChainItem*, CcuChainItem*); CcuChainItem* RemoveAfter (CcuChainItem*); }; class CcuChainIter { friend class CcuChain; public: enum chainiter_status { Normal, StartOfChain, EndOfChain }; private: const CcuChain* TheChain; CcuChainItem* CurLink; chainiter_status StatusFlag; public: inline CcuChainIter (const CcuChain& l) : TheChain (&l), CurLink (0), StatusFlag (StartOfChain) { } inline void Reset () { CurLink = 0; StatusFlag = StartOfChain; } CcuChainIter& operator ++ (); CcuChainItem* operator * () const; int Find (CcuChainItem*); inline chainiter_status GetStatus () const { return StatusFlag; } inline operator int () const { return StatusFlag == Normal; } }; #ifndef CPLUS_BUG19 template class CcuChainOf : public CcuChain { protected: CcuChainItem* GetNext (CcuChainItem* i) const { return ((ITEM*) i)->GetNext (); } void SetNext (CcuChainItem* i, CcuChainItem* j) const { ((ITEM*) i)->SetNext ((ITEM*) j); } void Delete (CcuChainItem* i) const { delete (ITEM*) i; } public: inline CcuChainOf () : CcuChain () { } inline CcuChainOf (ITEM* e) : CcuChain (e) { } inline ~CcuChainOf () {} }; template class CcuChainIterOf : public CcuChainIter { public: inline CcuChainIterOf (const CcuChainOf & l) : CcuChainIter (l) { } inline ITEM* operator * () const { return (ITEM*) CcuChainIter::operator * (); } }; #endif /* CPLUS_BUG19 */ #endif /* Chain_H_ */