0022815: Missing delete operator for placement new
[occt.git] / src / NCollection / NCollection_BaseList.hxx
1 // File:        NCollection_BaseList.hxx
2 // Created:     17.04.02 10:12:48
3 // Author:      Alexander Kartomin (akm)
4 //              <a-kartomin@opencascade.com>
5 // Copyright:   Open Cascade 2002
6 //              
7 // Purpose:     This is a base  class  for the  List, Set, Queue  and Stack
8 //              collections. It offers operations on abstract lists (of the
9 //              objects of class NCollection_ListNode).
10 //              Apart from this class being  brand new (in TCollection said
11 //              collections were independent, only using the same class for
12 //              node representation),  here is an  important new  feature - 
13 //              the  list  length is  continuously updated,  so the  method 
14 //              Extent is quite quick.
15 //              
16
17 #ifndef NCollection_BaseList_HeaderFile
18 #define NCollection_BaseList_HeaderFile
19
20 #include <Standard_NoSuchObject.hxx>
21 #include <NCollection_ListNode.hxx>
22
23 typedef void (* NCollection_DelListNode) 
24      (NCollection_ListNode*, Handle(NCollection_BaseAllocator)& theAl);
25
26 // ********************************************************** BaseList class
27 class NCollection_BaseList
28 {
29  public:
30   class Iterator
31   {
32   public:
33     // ******** Empty constructor
34     Iterator  (void) :
35       myCurrent (NULL),
36       myPrevious(NULL) {}
37     // ******** Constructor with initialisation
38     Iterator  (const NCollection_BaseList& theList) :
39       myCurrent (theList.myFirst),
40       myPrevious(NULL) {}
41     // ******** Initialisation
42     void Init (const NCollection_BaseList& theList)
43     {
44       myCurrent  = theList.myFirst;
45       myPrevious = NULL;
46     }
47     // ******** Initialisation
48     void Initialize (const NCollection_BaseList& theList)
49     {
50       Init(theList);
51     }
52     // ******** More
53     Standard_Boolean More (void) const
54     { return (myCurrent!=NULL); }
55     // ******** Assignment operator
56     Iterator& operator= (const Iterator& theIt)
57     {
58       if (&theIt != this)
59       {
60         myCurrent  = theIt.myCurrent;
61         myPrevious = theIt.myPrevious;
62       }
63       return * this;
64     }
65 //skt----------------------------------------------------
66     // ******** Comparison operator
67     Standard_Boolean operator== (const Iterator& theIt)
68     {
69       return myCurrent == theIt.myCurrent;
70     }
71 //-------------------------------------------------------
72   protected:
73     void Init (const NCollection_BaseList& theList,
74                NCollection_ListNode * const thePrev)
75     {
76       myCurrent  = thePrev ? thePrev -> Next() :
77                              (NCollection_ListNode *)theList.PLast();
78       myPrevious = thePrev;
79     }
80   public:
81     NCollection_ListNode * myCurrent; // Pointer to the current node
82     NCollection_ListNode * myPrevious;// Pointer to the previous one
83     friend class NCollection_BaseList;
84   }; // End of nested class Iterator
85
86  public:
87   // ---------- PUBLIC METHODS ------------
88   // ******** Extent
89   // Purpose: Returns the number of nodes in the list
90   Standard_Integer Extent (void) const
91   { return myLength; }
92
93   // ******** IsEmpty
94   // Purpose: Query if the list is empty
95   Standard_Boolean IsEmpty (void) const
96   { return (myFirst == NULL); }
97
98  protected:
99   // --------- PROTECTED METHODS ----------
100
101   // ******** Constructor
102   // Purpose: Initializes an empty list
103   NCollection_BaseList(void) :
104     myFirst(NULL),
105     myLast(NULL),
106     myLength(0) {}
107
108   // ******** PClear
109   // Purpose: deletes all nodes
110   Standard_EXPORT void PClear (NCollection_DelListNode fDel,
111                                Handle(NCollection_BaseAllocator)& theAllocator);
112
113   // ******** PFirst
114   // Purpose: Returns pointer to the first node
115   const NCollection_ListNode* PFirst (void) const
116   { return myFirst; }
117
118   // ******** PLast
119   // Purpose: Returns pointer to the last node
120   const NCollection_ListNode* PLast (void) const
121   { return myLast; }
122
123   // ******** PAppend
124   // Purpose: Appends theNode at the end
125   Standard_EXPORT void PAppend (NCollection_ListNode* theNode);
126
127   // ******** PAppend
128   // Purpose: Appends theNode at the end, returns iterator to the previous
129   void                 PAppend (NCollection_ListNode* theNode,
130                                 Iterator&             theIt)
131   {
132     NCollection_ListNode * aPrev = myLast;
133     PAppend (theNode);
134     theIt.Init (* this, aPrev);
135   }
136
137   // ******** PAppend
138   // Purpose: Appends theOther list at the end (clearing it)
139   Standard_EXPORT void PAppend (NCollection_BaseList& theOther);
140
141   // ******** PPrepend
142   // Purpose: Prepends theNode at the beginning
143   Standard_EXPORT void PPrepend (NCollection_ListNode* theNode);
144
145   // ******** PPrepend
146   // Purpose: Prepends theOther list at the beginning (clearing it)
147   Standard_EXPORT void PPrepend (NCollection_BaseList& theOther);
148
149   // ******** PRemoveFirst
150   // Purpose: Removes first node
151   Standard_EXPORT void PRemoveFirst 
152     (NCollection_DelListNode fDel,
153      Handle(NCollection_BaseAllocator)& theAllocator);
154
155   // ******** PRemove
156   // Purpose: Removes the node pointed by theIter[ator]
157   Standard_EXPORT void PRemove 
158     (Iterator& theIter,
159      NCollection_DelListNode fDel,
160      Handle(NCollection_BaseAllocator)& theAllocator);
161
162   // ******** PInsertBefore
163   // Purpose: Inserts theNode before one pointed by theIter[ator]
164   Standard_EXPORT void PInsertBefore (NCollection_ListNode* theNode,
165                                       Iterator& theIter);
166
167   // ******** PInsertBefore
168   // Purpose: Inserts theOther list before the node pointed by theIter[ator]
169   Standard_EXPORT void PInsertBefore (NCollection_BaseList& theOther,
170                                       Iterator& theIter);
171
172   // ******** PInsertAfter
173   // Purpose: Inserts theNode after one pointed by theIter[ator]
174   Standard_EXPORT void PInsertAfter (NCollection_ListNode* theNode,
175                                      Iterator& theIter);
176
177   // ******** PInsertAfter
178   // Purpose: Inserts theOther list after the node pointed by theIter[ator]
179   Standard_EXPORT void PInsertAfter (NCollection_BaseList& theOther,
180                                      Iterator& theIter);
181
182   // ******** PReverse
183   // Purpose: Reverse the list
184   Standard_EXPORT void PReverse     ();
185
186  protected:
187   // ------------ PRIVATE FIELDS ------------
188   NCollection_ListNode * myFirst;  // Pointer to the head
189   NCollection_ListNode * myLast;   // Pointer to the tail
190   Standard_Integer       myLength; // Actual length
191
192   // ------------ FRIEND CLASSES ------------
193   friend class Iterator;
194 };
195
196 #endif