0025128: Memory leak in BOPDS_DS::Paves()
[occt.git] / src / BOPDS / BOPDS_PaveBlock.cxx
1 // Created by: Peter KURNEV
2 // Copyright (c) 1999-2014 OPEN CASCADE SAS
3 //
4 // This file is part of Open CASCADE Technology software library.
5 //
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License version 2.1 as published
8 // by the Free Software Foundation, with special exception defined in the file
9 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10 // distribution for complete text of the license and disclaimer of any warranty.
11 //
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
14
15 #include <BOPDS_PaveBlock.ixx>
16 #include <BOPDS_ListOfPave.hxx>
17 #include <BOPDS_VectorOfPave.hxx>
18
19 #include <Standard.hxx>
20 #include <NCollection_BaseAllocator.hxx>
21
22 #include <algorithm>
23
24 #ifdef WNT
25 #pragma warning ( disable : 4291 )
26 #endif
27
28 //=======================================================================
29 //function : 
30 //purpose  : 
31 //=======================================================================
32   BOPDS_PaveBlock::BOPDS_PaveBlock()
33 :
34   myAllocator(NCollection_BaseAllocator::CommonBaseAllocator()),
35   myExtPaves(myAllocator)
36 {
37   myEdge=-1;
38   myOriginalEdge=-1;
39   myTS1=-99.;
40   myTS2=myTS1;
41 }
42 //=======================================================================
43 //function : 
44 //purpose  : 
45 //=======================================================================
46   BOPDS_PaveBlock::BOPDS_PaveBlock(const Handle(NCollection_BaseAllocator)& theAllocator)
47 :
48   myAllocator(theAllocator),
49   myExtPaves(theAllocator),
50   myMFence(100, theAllocator)
51 {
52   myEdge=-1;
53   myOriginalEdge=-1;
54   myTS1=-99.;
55   myTS2=myTS1;
56 }
57
58 //=======================================================================
59 //function : SetEdge
60 //purpose  : 
61 //=======================================================================
62   void BOPDS_PaveBlock::SetEdge(const Standard_Integer theEdge)
63 {
64   myEdge=theEdge;
65 }
66 //=======================================================================
67 //function : Edge
68 //purpose  : 
69 //=======================================================================
70   Standard_Integer BOPDS_PaveBlock::Edge()const
71 {
72   return myEdge;
73 }
74 //=======================================================================
75 //function : HasEdge
76 //purpose  : 
77 //=======================================================================
78   Standard_Boolean BOPDS_PaveBlock::HasEdge()const
79 {
80   return (myEdge>=0);
81 }
82 //=======================================================================
83 //function : HasEdge
84 //purpose  : 
85 //=======================================================================
86   Standard_Boolean BOPDS_PaveBlock::HasEdge(Standard_Integer& theEdge)const
87 {
88   theEdge=myEdge;
89   return (myEdge>=0);
90 }
91
92 //=======================================================================
93 //function : SetOriginalEdge
94 //purpose  : 
95 //=======================================================================
96   void BOPDS_PaveBlock::SetOriginalEdge(const Standard_Integer theEdge)
97 {
98   myOriginalEdge=theEdge;
99 }
100 //=======================================================================
101 //function : OriginalEdge
102 //purpose  : 
103 //=======================================================================
104   Standard_Integer BOPDS_PaveBlock::OriginalEdge()const
105 {
106   return myOriginalEdge;
107 }
108 //=======================================================================
109 //function : IsSplitEdge
110 //purpose  : 
111 //=======================================================================
112   Standard_Boolean BOPDS_PaveBlock::IsSplitEdge()const
113 {
114   return (myEdge!=myOriginalEdge);
115 }
116 //=======================================================================
117 //function : SetPave1
118 //purpose  : 
119 //=======================================================================
120   void BOPDS_PaveBlock::SetPave1(const BOPDS_Pave& thePave)
121 {
122   myPave1=thePave;
123 }
124 //=======================================================================
125 //function : Pave1
126 //purpose  : 
127 //=======================================================================
128   const BOPDS_Pave& BOPDS_PaveBlock::Pave1()const
129 {
130   return myPave1;
131 }
132 //=======================================================================
133 //function : SetPave2
134 //purpose  : 
135 //=======================================================================
136   void BOPDS_PaveBlock::SetPave2(const BOPDS_Pave& thePave)
137 {
138   myPave2=thePave;
139 }
140 //=======================================================================
141 //function : Pave2
142 //purpose  : 
143 //=======================================================================
144   const BOPDS_Pave& BOPDS_PaveBlock::Pave2()const
145 {
146   return myPave2;
147 }
148 //=======================================================================
149 //function : Range
150 //purpose  : 
151 //=======================================================================
152   void BOPDS_PaveBlock::Range(Standard_Real& theT1,
153                               Standard_Real& theT2)const
154 {
155   theT1=myPave1.Parameter();
156   theT2=myPave2.Parameter();
157 }
158 //=======================================================================
159 //function : Indices
160 //purpose  : 
161 //=======================================================================
162   void BOPDS_PaveBlock::Indices(Standard_Integer& theIndex1,
163                                 Standard_Integer& theIndex2)const
164 {
165   theIndex1=myPave1.Index();
166   theIndex2=myPave2.Index();
167 }
168 //=======================================================================
169 //function : HasSameBounds
170 //purpose  : 
171 //=======================================================================
172   Standard_Boolean BOPDS_PaveBlock::HasSameBounds(const Handle(BOPDS_PaveBlock)& theOther)const
173 {
174   Standard_Boolean bFlag1, bFlag2;
175   Standard_Integer n11, n12, n21, n22;
176   //
177   Indices(n11, n12);
178   theOther->Indices(n21, n22);
179   //
180   bFlag1=(n11==n21) && (n12==n22);
181   bFlag2=(n11==n22) && (n12==n21);
182   //
183   return (bFlag1 || bFlag2);
184 }
185
186
187 //
188 // Extras
189 //
190 //=======================================================================
191 //function : AppendExtPave
192 //purpose  : 
193 //=======================================================================
194   void BOPDS_PaveBlock::AppendExtPave(const BOPDS_Pave& thePave)
195 {
196   if (myMFence.Add(thePave.Index())) {
197     myExtPaves.Append(thePave);
198   }
199 }
200 //=======================================================================
201 //function : AppendExtPave1
202 //purpose  : 
203 //=======================================================================
204   void BOPDS_PaveBlock::AppendExtPave1(const BOPDS_Pave& thePave)
205 {
206   myExtPaves.Append(thePave);
207 }
208 //=======================================================================
209 //function : ExtPaves
210 //purpose  : 
211 //=======================================================================
212   const BOPDS_ListOfPave& BOPDS_PaveBlock::ExtPaves()const 
213 {
214   return myExtPaves;
215 }
216 //=======================================================================
217 //function : ChangeExtPaves
218 //purpose  : 
219 //=======================================================================
220   BOPDS_ListOfPave& BOPDS_PaveBlock::ChangeExtPaves() 
221 {
222   return myExtPaves;
223 }
224 //=======================================================================
225 //function : IsToUpdate
226 //purpose  : 
227 //=======================================================================
228   Standard_Boolean BOPDS_PaveBlock::IsToUpdate()const 
229 {
230   return !myExtPaves.IsEmpty();
231 }
232 //=======================================================================
233 //function : ContainsParameter
234 //purpose  : 
235 //=======================================================================
236   Standard_Boolean BOPDS_PaveBlock::ContainsParameter(const Standard_Real theT,
237                                                       const Standard_Real theTol)const
238 {
239   Standard_Boolean bRet;
240   Standard_Real dT;
241   BOPDS_ListIteratorOfListOfPave aIt;
242   //
243   bRet=Standard_False;
244   aIt.Initialize(myExtPaves);
245   for (; aIt.More(); aIt.Next()) {
246     dT=aIt.Value().Parameter()-theT;
247     if (dT<0.) {
248       dT=-dT;
249     }
250     if (dT<theTol) {
251       bRet=!bRet;
252       break;
253     }
254   }
255   return bRet;
256 }
257 //=======================================================================
258 //function : Update
259 //purpose  : 
260 //=======================================================================
261   void BOPDS_PaveBlock::Update(BOPDS_ListOfPaveBlock& theLPB,
262                                const Standard_Boolean theFlag)
263 {
264   Standard_Integer i, aNb;
265   BOPDS_Pave aPave1, aPave2;
266   Handle(BOPDS_PaveBlock) aPB;
267   BOPDS_ListIteratorOfListOfPave aIt;
268   //
269   aNb=myExtPaves.Extent();
270   if (theFlag) {
271     aNb=aNb+2;
272   }
273   //
274   if (aNb <= 1) {
275     myExtPaves.Clear();
276     myMFence.Clear();
277     return;
278   }
279   //
280   BOPDS_VectorOfPave pPaves(1, aNb);
281   //
282   i=1;
283   if (theFlag) {
284     pPaves(i) = myPave1; 
285     ++i;
286     pPaves(i) = myPave2; 
287     ++i;
288   }
289   //
290   aIt.Initialize(myExtPaves);
291   for (; aIt.More(); aIt.Next()) {
292     const BOPDS_Pave& aPave=aIt.Value();
293     pPaves(i) = aPave;
294     ++i;
295   }
296   myExtPaves.Clear();
297   myMFence.Clear();
298   //
299   std::sort(pPaves.begin(), pPaves.end());
300   //
301   for (i = 1; i <= aNb; ++i) {
302     const BOPDS_Pave& aPave = pPaves(i);
303     if (i == 1) {
304       aPave1 = aPave;
305       continue;
306     }
307     //
308     aPave2 = aPave;
309     aPB = new BOPDS_PaveBlock;
310     aPB->SetOriginalEdge(myOriginalEdge);
311     aPB->SetPave1(aPave1);
312     aPB->SetPave2(aPave2);
313     //
314     theLPB.Append(aPB);
315     //
316     aPave1 = aPave2;
317   }
318 }
319 // ShrunkData
320 //=======================================================================
321 //function : HasShrunkData
322 //purpose  : 
323 //=======================================================================
324   Standard_Boolean BOPDS_PaveBlock::HasShrunkData()const
325 {
326   return (!myShrunkBox.IsVoid());
327 }
328 //=======================================================================
329 //function : SetShrunkData
330 //purpose  : 
331 //=======================================================================
332   void BOPDS_PaveBlock::SetShrunkData(const Standard_Real theT1,
333                                       const Standard_Real theT2,
334                                       const Bnd_Box& theBox)
335 {
336   myTS1=theT1;
337   myTS2=theT2;
338   myShrunkBox=theBox;
339 }
340 //=======================================================================
341 //function : ShrunkData
342 //purpose  : 
343 //=======================================================================
344   void BOPDS_PaveBlock::ShrunkData(Standard_Real& theT1,
345                                    Standard_Real& theT2,
346                                    Bnd_Box& theBox)const
347 {
348   theT1=myTS1;
349   theT2=myTS2;
350   theBox=myShrunkBox;
351 }
352 //=======================================================================
353 //function : Dump
354 //purpose  : 
355 //=======================================================================
356   void BOPDS_PaveBlock::Dump()const
357 {
358   printf(" PB:{ E:%d orE:%d", myEdge, myOriginalEdge);
359   printf(" Pave1:");
360   myPave1.Dump();
361   printf(" Pave2:");
362   myPave2.Dump();
363   printf(" }");
364 }