summaryrefslogtreecommitdiff
path: root/utils/Chain.h
diff options
context:
space:
mode:
Diffstat (limited to 'utils/Chain.h')
-rw-r--r--utils/Chain.h111
1 files changed, 111 insertions, 0 deletions
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 ITEM> 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 ITEM> class CcuChainIterOf : public CcuChainIter {
+public:
+inline CcuChainIterOf (const CcuChainOf <ITEM>& l) : CcuChainIter (l) { }
+inline ITEM* operator * () const { return (ITEM*) CcuChainIter::operator * (); }
+};
+
+#endif /* CPLUS_BUG19 */
+
+#endif /* Chain_H_ */
+