OCC22143 Optimization of memory usage and developing tools for catching memory leaks...
[occt.git] / src / NCollection / NCollection_BaseList.cxx
1 // File:        NCollection_BaseList.cxx
2 // Created:     Tue Apr 23 09:16:44 2002
3 // Author:      Alexander KARTOMIN (akm)
4 //              <a-kartomin@opencascade.com>
5 // Purpose:     Implementation of the BaseList class
6
7 #include <NCollection_BaseList.hxx>
8
9 //=======================================================================
10 //function : PClear
11 //purpose  : Deletes all nodes from the list
12 //=======================================================================
13
14 void NCollection_BaseList::PClear 
15   (NCollection_DelListNode fDel,
16    Handle(NCollection_BaseAllocator)& theAllocator)
17
18   NCollection_ListNode* pCur  = myFirst;
19   NCollection_ListNode* pNext = NULL;
20   while(pCur) 
21   {
22     pNext = pCur->Next();
23     fDel (pCur,theAllocator);
24     pCur = pNext;
25   }
26   myLength = 0;
27   myFirst = myLast = NULL;
28 }
29
30 //=======================================================================
31 //function : PAppend
32 //purpose  : Appends one item at the end
33 //=======================================================================
34
35 void NCollection_BaseList::PAppend (NCollection_ListNode* theNode)
36
37   if (myLength) 
38     myLast->Next() = theNode;
39   else 
40     myFirst = theNode;
41   theNode->Next() = NULL;
42   myLast = theNode;
43   myLength++;
44 }
45
46 //=======================================================================
47 //function : PAppend
48 //purpose  : Appends another list at the end
49 //=======================================================================
50
51 void NCollection_BaseList::PAppend (NCollection_BaseList& theOther)
52
53   if (this == &theOther || theOther.IsEmpty()) 
54     return;
55   
56   if (IsEmpty())
57     myFirst = theOther.myFirst;
58   else
59     myLast->Next() = theOther.myFirst;
60   myLast = theOther.myLast;
61   theOther.myFirst = theOther.myLast = NULL;
62
63   myLength += theOther.myLength;
64   theOther.myLength = 0;
65 }
66
67 //=======================================================================
68 //function : PPrepend
69 //purpose  : Prepends one item at the beginning
70 //=======================================================================
71
72 void NCollection_BaseList::PPrepend (NCollection_ListNode* theNode)
73
74   theNode->Next() = myFirst;
75   myFirst = theNode;
76   if (myLast==NULL)
77     myLast = myFirst;
78   myLength++;
79 }
80
81 //=======================================================================
82 //function : PPrepend
83 //purpose  : 
84 //=======================================================================
85
86 void NCollection_BaseList::PPrepend (NCollection_BaseList& theOther)
87
88   if (this == &theOther || theOther.IsEmpty()) 
89     return;
90
91   if (IsEmpty())
92     myLast = theOther.myLast;
93   else
94     theOther.myLast->Next() = myFirst;
95   myFirst = theOther.myFirst;
96   theOther.myFirst = theOther.myLast = NULL;
97
98   myLength += theOther.myLength;
99   theOther.myLength = 0;
100 }
101
102 //=======================================================================
103 //function : PRemoveFirst
104 //purpose  : 
105 //=======================================================================
106
107 void NCollection_BaseList::PRemoveFirst 
108   (NCollection_DelListNode fDel,
109    Handle(NCollection_BaseAllocator)& theAllocator) 
110 {
111   Standard_NoSuchObject_Raise_if(IsEmpty(),
112                                  "NCollection_BaseList::PRemoveFirst");
113   NCollection_ListNode* pItem = myFirst;
114   myFirst = pItem->Next();
115   fDel (pItem, theAllocator);
116   myLength--;
117   if (myLength == 0) 
118     myLast = NULL;
119 }
120
121 //=======================================================================
122 //function : PRemove
123 //purpose  : 
124 //=======================================================================
125
126 void NCollection_BaseList::PRemove 
127   (Iterator& theIter, 
128    NCollection_DelListNode fDel,
129    Handle(NCollection_BaseAllocator)& theAllocator) 
130 {
131   Standard_NoSuchObject_Raise_if(!theIter.More(),
132                                  "NCollection_BaseList::PRemove");
133   if (theIter.myPrevious == NULL) 
134   {
135     PRemoveFirst (fDel,theAllocator);
136     theIter.myCurrent = myFirst;
137   }
138   else 
139   {
140     NCollection_ListNode* pNode = (theIter.myCurrent)->Next();
141     (theIter.myPrevious)->Next() = pNode;
142     fDel (theIter.myCurrent,theAllocator);
143     theIter.myCurrent = pNode;
144     if (pNode == NULL) 
145       myLast = theIter.myPrevious;
146     myLength--;
147   }
148 }
149
150 //=======================================================================
151 //function : PInsertBefore
152 //purpose  : 
153 //=======================================================================
154
155 void NCollection_BaseList::PInsertBefore (NCollection_ListNode* theNode,
156                                           Iterator& theIter)
157 {
158   Standard_NoSuchObject_Raise_if(!theIter.More(),
159                                  "NCollection_BaseList::PInsertBefore");
160   if (theIter.myPrevious == NULL) 
161   {
162     PPrepend(theNode);
163     theIter.myPrevious = myFirst;
164   }
165   else 
166   {
167     (theIter.myPrevious)->Next() = theNode;
168     theNode->Next() = theIter.myCurrent;
169     theIter.myPrevious = theNode;
170     myLength++;
171   }
172 }
173
174 //=======================================================================
175 //function : PInsertBefore
176 //purpose  : 
177 //=======================================================================
178
179 void NCollection_BaseList::PInsertBefore (NCollection_BaseList& theOther,
180                                           Iterator& theIter)
181 {
182   Standard_NoSuchObject_Raise_if(!theIter.More(),
183                                  "NCollection_BaseList::PInsertBefore");
184   if (theIter.myPrevious == NULL) 
185   {
186     theIter.myPrevious = theOther.myLast;
187     PPrepend(theOther);
188   }
189   else if (!theOther.IsEmpty())
190   {
191     myLength += theOther.myLength;
192     (theIter.myPrevious)->Next() = theOther.myFirst;
193     (theOther.myLast)->Next() = theIter.myCurrent;
194     theIter.myPrevious = theOther.myLast;
195     theOther.myLast = theOther.myFirst = NULL;
196     theOther.myLength = 0;
197   }
198 }
199
200 //=======================================================================
201 //function : PInsertAfter
202 //purpose  : 
203 //=======================================================================
204
205 void NCollection_BaseList::PInsertAfter (NCollection_ListNode* theNode,
206                                          Iterator& theIter)
207 {
208   Standard_NoSuchObject_Raise_if(!theIter.More(),
209                                  "NCollection_BaseList::PInsertAfter");
210   if (theIter.myCurrent == myLast)
211   {
212     PAppend(theNode);
213   }
214   else
215   {
216     theNode->Next() = (theIter.myCurrent)->Next();
217     (theIter.myCurrent)->Next() = theNode;
218     myLength++;
219   }
220 }
221
222 //=======================================================================
223 //function : PInsertAfter
224 //purpose  : 
225 //=======================================================================
226
227 void NCollection_BaseList::PInsertAfter(NCollection_BaseList& theOther,
228                                         Iterator& theIter)
229 {
230   Standard_NoSuchObject_Raise_if(!theIter.More(),
231                                  "NCollection_BaseList::PInsertAfter");
232   if (theIter.myCurrent == myLast)
233   {
234     PAppend(theOther);
235   }
236   else if (!theOther.IsEmpty())
237   {
238     myLength += theOther.myLength;
239     (theOther.myLast)->Next() = (theIter.myCurrent)->Next();
240     (theIter.myCurrent)->Next() = theOther.myFirst;
241     theOther.myLast = theOther.myFirst = NULL;
242     theOther.myLength = 0;
243   }
244 }
245
246 //=======================================================================
247 //function : PReverse
248 //purpose  : reverse the list
249 //=======================================================================
250
251 void NCollection_BaseList::PReverse ()
252 {
253   if (myLength > 1) {
254     NCollection_ListNode * aHead = myFirst->Next();
255     NCollection_ListNode * aNeck = myFirst;
256     aNeck->Next() = NULL;
257     while (aHead) {
258       NCollection_ListNode * aTmp = aHead->Next();
259       aHead->Next() = aNeck;
260       aNeck = aHead;
261       aHead = aTmp;
262     }
263     myLast  = myFirst;
264     myFirst = aNeck;
265   }
266 }