From 3a4838bed13b767132cbdf06364b2658da6cc356 Mon Sep 17 00:00:00 2001 From: chatty Date: Tue, 15 Dec 1992 10:55:33 +0000 Subject: Initial revision --- utils/Chain.h | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 utils/Chain.h (limited to 'utils/Chain.h') diff --git a/utils/Chain.h b/utils/Chain.h new file mode 100644 index 0000000..b9ecf61 --- /dev/null +++ b/utils/Chain.h @@ -0,0 +1,111 @@ +/* + * 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_ */ + -- cgit v1.1