/* * 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 IvlChainItem; class IvlChainIter; class IvlChain { friend class IvlChainIter; public: enum chain_status { NoError, WasEmpty, TooEarly, TooFar, BadIterator }; protected: IvlChainItem* LastLink; chain_status StatusFlag; inline IvlChain () : LastLink (0), StatusFlag (NoError) { } inline IvlChain (IvlChainItem* e) : LastLink (e), StatusFlag (NoError) { } virtual ~IvlChain (); virtual IvlChainItem* GetNext (IvlChainItem*) const = 0; virtual void SetNext (IvlChainItem*, IvlChainItem*) const = 0; virtual void Delete (IvlChainItem*) const = 0; IvlChainItem* GetPrevious (IvlChainItem*) ; public: inline chain_status GetStatus () const { return StatusFlag; } inline int IsEmpty () const { return !LastLink; } IvlChainItem* First (); IvlChainItem* Last (); IvlChainItem* Nth (int n); int Length () const; int Find (IvlChainItem*) const; void Append (IvlChainItem*); void Prepend (IvlChainItem*); inline IvlChain& operator << (IvlChainItem* it) { Append (it); return *this; } IvlChainItem* RemoveFirst (); IvlChainItem* RemoveLast (); int Remove (IvlChainItem*); int Remove (int (*) (IvlChainItem*)); void Clear (); void InsertAfter (const IvlChainIter&, IvlChainItem*); void InsertBefore (const IvlChainIter&, IvlChainItem*); IvlChainItem* RemoveAfter (const IvlChainIter&); void InsertAfter (IvlChainItem*, IvlChainItem*); void InsertBefore (IvlChainItem*, IvlChainItem*); IvlChainItem* RemoveAfter (IvlChainItem*); }; class IvlChainIter { friend class IvlChain; public: enum chainiter_status { Normal, StartOfChain, EndOfChain }; private: const IvlChain* TheChain; IvlChainItem* CurLink; chainiter_status StatusFlag; public: inline IvlChainIter (const IvlChain& l) : TheChain (&l), CurLink (0), StatusFlag (StartOfChain) { } inline void Reset () { CurLink = 0; StatusFlag = StartOfChain; } IvlChainIter& operator ++ (); IvlChainItem* operator * () const; int Find (IvlChainItem*); inline chainiter_status GetStatus () const { return StatusFlag; } inline operator int () const { return StatusFlag == Normal; } }; #ifndef CPLUS_BUG19 template class IvlChainOf : public IvlChain { protected: IvlChainItem* GetNext (IvlChainItem* i) const { return ((ITEM*) i)->GetNext (); } void SetNext (IvlChainItem* i, IvlChainItem* j) const { ((ITEM*) i)->SetNext ((ITEM*) j); } void Delete (IvlChainItem* i) const { delete (ITEM*) i; } public: inline IvlChainOf () : IvlChain () { } inline IvlChainOf (ITEM* e) : IvlChain (e) { } inline ~IvlChainOf () {} }; template class IvlChainIterOf : public IvlChainIter { public: inline IvlChainIterOf (const IvlChainOf & l) : IvlChainIter (l) { } inline ITEM* operator * () const { return (ITEM*) IvlChainIter::operator * (); } }; #endif /* CPLUS_BUG19 */ #endif /* Chain_H_ */