0025128: Memory leak in BOPDS_DS::Paves()
[occt.git] / src / BOPDS / BOPDS_PaveBlock.cxx
CommitLineData
4e57c75e 1// Created by: Peter KURNEV
973c2be1 2// Copyright (c) 1999-2014 OPEN CASCADE SAS
4e57c75e 3//
973c2be1 4// This file is part of Open CASCADE Technology software library.
4e57c75e 5//
d5f74e42 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
973c2be1 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.
4e57c75e 11//
973c2be1 12// Alternatively, this file may be used under the terms of Open CASCADE
13// commercial license or contractual agreement.
4e57c75e 14
15#include <BOPDS_PaveBlock.ixx>
16#include <BOPDS_ListOfPave.hxx>
7a76337e 17#include <BOPDS_VectorOfPave.hxx>
18
4e57c75e 19#include <Standard.hxx>
20#include <NCollection_BaseAllocator.hxx>
21
7a76337e 22#include <algorithm>
4e57c75e 23
24#ifdef WNT
25#pragma warning ( disable : 4291 )
26#endif
27
4e57c75e 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;
4e57c75e 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 //
7a76337e 274 if (aNb <= 1) {
275 myExtPaves.Clear();
276 myMFence.Clear();
277 return;
4e57c75e 278 }
279 //
7a76337e 280 BOPDS_VectorOfPave pPaves(1, aNb);
281 //
282 i=1;
4e57c75e 283 if (theFlag) {
7a76337e 284 pPaves(i) = myPave1;
4e57c75e 285 ++i;
7a76337e 286 pPaves(i) = myPave2;
4e57c75e 287 ++i;
288 }
289 //
290 aIt.Initialize(myExtPaves);
291 for (; aIt.More(); aIt.Next()) {
292 const BOPDS_Pave& aPave=aIt.Value();
7a76337e 293 pPaves(i) = aPave;
4e57c75e 294 ++i;
295 }
296 myExtPaves.Clear();
297 myMFence.Clear();
298 //
7a76337e 299 std::sort(pPaves.begin(), pPaves.end());
4e57c75e 300 //
7a76337e 301 for (i = 1; i <= aNb; ++i) {
302 const BOPDS_Pave& aPave = pPaves(i);
303 if (i == 1) {
304 aPave1 = aPave;
4e57c75e 305 continue;
306 }
307 //
7a76337e 308 aPave2 = aPave;
309 aPB = new BOPDS_PaveBlock;
4e57c75e 310 aPB->SetOriginalEdge(myOriginalEdge);
311 aPB->SetPave1(aPave1);
312 aPB->SetPave2(aPave2);
313 //
314 theLPB.Append(aPB);
315 //
7a76337e 316 aPave1 = aPave2;
4e57c75e 317 }
4e57c75e 318}
4e57c75e 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}