summaryrefslogtreecommitdiff
path: root/ace/Containers.h
diff options
context:
space:
mode:
authorjxh <jxh@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1998-09-09 21:18:50 +0000
committerjxh <jxh@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1998-09-09 21:18:50 +0000
commitc8326051ee074025473d5e2ada7b4ef2d6cef1e9 (patch)
tree3f5d3b0bd58bbb09de1282a1424a9fb9c2a387b4 /ace/Containers.h
parentf196c5612051f85f38c496ef11810f605f5f29c1 (diff)
downloadATCD-c8326051ee074025473d5e2ada7b4ef2d6cef1e9.tar.gz
Created a new container class ACE_DLList.
Diffstat (limited to 'ace/Containers.h')
-rw-r--r--ace/Containers.h139
1 files changed, 138 insertions, 1 deletions
diff --git a/ace/Containers.h b/ace/Containers.h
index 6cbd4e42f08..dd9255decb2 100644
--- a/ace/Containers.h
+++ b/ace/Containers.h
@@ -216,9 +216,10 @@ public:
~ACE_DNode (void);
// This isn't necessary, but it keeps the compiler happy.
-private:
+//private:
// = Initialization methods
+ ACE_DNode (void) {};
ACE_DNode (const T &i, ACE_DNode<T> *n = 0, ACE_DNode<T> *p = 0);
ACE_DNode<T> *next_;
@@ -677,6 +678,142 @@ protected:
// Allocation Strategy of the queue.
};
+//
+// I found ACE_Double_Linked_List really difficult to use. So, I create
+// another layer of abstraction on top of it to make it easier to use.
+// -- jxh
+template <class T> class ACE_DLList;
+template <class T> class ACE_DLList_Iterator;
+
+template <class T>
+class ACE_DLList_Node : public ACE_DNode<T*>
+{
+friend ACE_DLList<T>;
+friend ACE_DLList_Iterator<T>;
+
+public:
+ ACE_DLList_Node (void)
+ : next_ ((ACE_DLList_Node<T> *) ACE_DNode<T*>::next_),
+ prev_ ((ACE_DLList_Node<T> *) ACE_DNode<T*>::prev_)
+ {};
+ ACE_DLList_Node (T *const &i,
+ ACE_DLList_Node<T> *n = 0,
+ ACE_DLList_Node<T> *p = 0)
+ : ACE_DNode<T*> (i, (ACE_DNode<T*> *)n, (ACE_DNode<T*> *)p),
+ next_ ((ACE_DLList_Node<T> *) ACE_DNode<T*>::next_),
+ prev_ ((ACE_DLList_Node<T> *) ACE_DNode<T*>::prev_)
+ {};
+
+ ACE_DLList_Node<T> *next_;
+ ACE_DLList_Node<T> *prev_;
+};
+
+template <class T>
+class ACE_DLList
+ : private ACE_Double_Linked_List< ACE_DLList_Node<T> >
+{
+friend ACE_DLList_Node<T>;
+friend ACE_DLList_Iterator<T>;
+
+public:
+
+ typedef ACE_Double_Linked_List< ACE_DLList_Node<T> > DLList;
+ typedef ACE_DLList_Node<T> DLList_NODE;
+ typedef ACE_DLList_Iterator<T> DLList_ITERATOR;
+
+ void operator= (ACE_DLList<T> &l) { *(DLList *)this = l; };
+
+ // = Check boundary conditions.
+
+ int is_empty (void) const
+ { return ACE_Double_Linked_List< ACE_DLList_Node<T> >::is_empty (); };
+
+ int is_full (void) const
+ { return ACE_Double_Linked_List< ACE_DLList_Node<T> >::is_full (); };
+
+ // = Classic queue operations.
+
+ T *insert_tail (T *new_item);
+ T *insert_head (T *new_item);
+ T* delete_head (void);
+ T *delete_tail (void);
+
+ // = Additional utility methods.
+
+ void reset (void)
+ { ACE_Double_Linked_List< ACE_DLList_Node<T> >::reset (); };
+
+ int get (T *&item, size_t index = 0)
+ {
+ DLList_NODE *node;
+ int result
+ = ACE_Double_Linked_List< ACE_DLList_Node<T> >::get (node, index);
+ item = node->item_;
+ return result;
+ };
+
+ size_t size (void) const
+ { return ACE_Double_Linked_List< ACE_DLList_Node<T> >::size (); };
+
+ void dump (void) const
+ { ACE_Double_Linked_List< ACE_DLList_Node<T> >::dump (); };
+
+ ACE_ALLOC_HOOK_DECLARE;
+
+ // = Initialization and termination methods.
+ ACE_DLList (ACE_Allocator *alloc = 0)
+ : ACE_Double_Linked_List< ACE_DLList_Node<T> > (alloc) {};
+
+ ACE_DLList (ACE_DLList<T> &l)
+ : ACE_Double_Linked_List< ACE_DLList_Node<T> > ((DLList &)l) {};
+
+ ~ACE_DLList (void) { while (this->delete_head ()) ; };
+
+private:
+};
+
+template <class T>
+class ACE_DLList_Iterator
+ : private ACE_Double_Linked_List_Iterator< ACE_DLList_Node<T> >
+{
+friend ACE_DLList<T>;
+friend ACE_DLList_Node<T>;
+
+public:
+ // = Initialization method.
+ ACE_DLList_Iterator (ACE_DLList<T> &l)
+ : ACE_Double_Linked_List_Iterator< ACE_DLList_Node<T> > (l) {};
+
+ // = Iteration methods.
+
+ T *next (void) const
+ {
+ ACE_DLList_Node<T> *temp
+ = ACE_Double_Linked_List_Iterator< ACE_DLList_Node<T> >
+ ::next ();
+ return temp ? temp->item_ : 0;
+ };
+
+ int advance (void)
+ { return
+ ACE_Double_Linked_List_Iterator< ACE_DLList_Node<T> >::advance (); };
+
+ int first (void)
+ { return
+ ACE_Double_Linked_List_Iterator< ACE_DLList_Node<T> >::first (); };
+
+ int done (void) const
+ { return
+ ACE_Double_Linked_List_Iterator< ACE_DLList_Node<T> >::done (); };
+
+ void dump (void) const
+ { ACE_Double_Linked_List_Iterator< ACE_DLList_Node<T> >::dump (); };
+
+ ACE_ALLOC_HOOK_DECLARE;
+
+};
+
+
template <class T>
class ACE_Unbounded_Set_Iterator
{