eac7a633416b3e5fd78497c89c3797c8d73daef2
[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   theOther.myLast->Next() = myFirst;
92   myFirst = theOther.myFirst;
93   theOther.myFirst = theOther.myLast = NULL;
94
95   myLength += theOther.myLength;
96   theOther.myLength = 0;
97 }
98
99 //=======================================================================
100 //function : PRemoveFirst
101 //purpose  : 
102 //=======================================================================
103
104 void NCollection_BaseList::PRemoveFirst 
105   (NCollection_DelListNode fDel,
106    Handle(NCollection_BaseAllocator)& theAllocator) 
107 {
108   Standard_NoSuchObject_Raise_if(IsEmpty(),
109                                  "NCollection_BaseList::PRemoveFirst");
110   NCollection_ListNode* pItem = myFirst;
111   myFirst = pItem->Next();
112   fDel (pItem, theAllocator);
113   myLength--;
114   if (myLength == 0) 
115     myLast = NULL;
116 }
117
118 //=======================================================================
119 //function : PRemove
120 //purpose  : 
121 //=======================================================================
122
123 void NCollection_BaseList::PRemove 
124   (Iterator& theIter, 
125    NCollection_DelListNode fDel,
126    Handle(NCollection_BaseAllocator)& theAllocator) 
127 {
128   Standard_NoSuchObject_Raise_if(!theIter.More(),
129                                  "NCollection_BaseList::PRemove");
130   if (theIter.myPrevious == NULL) 
131   {
132     PRemoveFirst (fDel,theAllocator);
133     theIter.myCurrent = myFirst;
134   }
135   else 
136   {
137     NCollection_ListNode* pNode = (theIter.myCurrent)->Next();
138     (theIter.myPrevious)->Next() = pNode;
139     fDel (theIter.myCurrent,theAllocator);
140     theIter.myCurrent = pNode;
141     if (pNode == NULL) 
142       myLast = theIter.myPrevious;
143     myLength--;
144   }
145 }
146
147 //=======================================================================
148 //function : PInsertBefore
149 //purpose  : 
150 //=======================================================================
151
152 void NCollection_BaseList::PInsertBefore (NCollection_ListNode* theNode,
153                                           Iterator& theIter)
154 {
155   Standard_NoSuchObject_Raise_if(!theIter.More(),
156                                  "NCollection_BaseList::PInsertBefore");
157   if (theIter.myPrevious == NULL) 
158   {
159     PPrepend(theNode);
160     theIter.myPrevious = myFirst;
161   }
162   else 
163   {
164     (theIter.myPrevious)->Next() = theNode;
165     theNode->Next() = theIter.myCurrent;
166     theIter.myPrevious = theNode;
167     myLength++;
168   }
169 }
170
171 //=======================================================================
172 //function : PInsertBefore
173 //purpose  : 
174 //=======================================================================
175
176 void NCollection_BaseList::PInsertBefore (NCollection_BaseList& theOther,
177                                           Iterator& theIter)
178 {
179   Standard_NoSuchObject_Raise_if(!theIter.More(),
180                                  "NCollection_BaseList::PInsertBefore");
181   if (theIter.myPrevious == NULL) 
182   {
183     theIter.myPrevious = theOther.myLast;
184     PPrepend(theOther);
185   }
186   else if (!theOther.IsEmpty())
187   {
188     myLength += theOther.myLength;
189     (theIter.myPrevious)->Next() = theOther.myFirst;
190     (theOther.myLast)->Next() = theIter.myCurrent;
191     theIter.myPrevious = theOther.myLast;
192     theOther.myLast = theOther.myFirst = NULL;
193     theOther.myLength = 0;
194   }
195 }
196
197 //=======================================================================
198 //function : PInsertAfter
199 //purpose  : 
200 //=======================================================================
201
202 void NCollection_BaseList::PInsertAfter (NCollection_ListNode* theNode,
203                                          Iterator& theIter)
204 {
205   Standard_NoSuchObject_Raise_if(!theIter.More(),
206                                  "NCollection_BaseList::PInsertAfter");
207   if (theIter.myCurrent == myLast)
208   {
209     PAppend(theNode);
210   }
211   else
212   {
213     theNode->Next() = (theIter.myCurrent)->Next();
214     (theIter.myCurrent)->Next() = theNode;
215     myLength++;
216   }
217 }
218
219 //=======================================================================
220 //function : PInsertAfter
221 //purpose  : 
222 //=======================================================================
223
224 void NCollection_BaseList::PInsertAfter(NCollection_BaseList& theOther,
225                                         Iterator& theIter)
226 {
227   Standard_NoSuchObject_Raise_if(!theIter.More(),
228                                  "NCollection_BaseList::PInsertAfter");
229   if (theIter.myCurrent == myLast)
230   {
231     PAppend(theOther);
232   }
233   else if (!theOther.IsEmpty())
234   {
235     myLength += theOther.myLength;
236     (theOther.myLast)->Next() = (theIter.myCurrent)->Next();
237     (theIter.myCurrent)->Next() = theOther.myFirst;
238     theOther.myLast = theOther.myFirst = NULL;
239     theOther.myLength = 0;
240   }
241 }
242
243 //=======================================================================
244 //function : PReverse
245 //purpose  : reverse the list
246 //=======================================================================
247
248 void NCollection_BaseList::PReverse ()
249 {
250   if (myLength > 1) {
251     NCollection_ListNode * aHead = myFirst->Next();
252     NCollection_ListNode * aNeck = myFirst;
253     aNeck->Next() = NULL;
254     while (aHead) {
255       NCollection_ListNode * aTmp = aHead->Next();
256       aHead->Next() = aNeck;
257       aNeck = aHead;
258       aHead = aTmp;
259     }
260     myLast  = myFirst;
261     myFirst = aNeck;
262   }
263 }