0026936: Drawbacks of inlining in new type system in OCCT 7.0 -- automatic
[occt.git] / src / BRepAlgo / BRepAlgo_AsDes.cxx
CommitLineData
b311480e 1// Created on: 1995-10-26
2// Created by: Yves FRICAUD
3// Copyright (c) 1995-1999 Matra Datavision
973c2be1 4// Copyright (c) 1999-2014 OPEN CASCADE SAS
b311480e 5//
973c2be1 6// This file is part of Open CASCADE Technology software library.
b311480e 7//
d5f74e42 8// This library is free software; you can redistribute it and/or modify it under
9// the terms of the GNU Lesser General Public License version 2.1 as published
973c2be1 10// by the Free Software Foundation, with special exception defined in the file
11// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12// distribution for complete text of the license and disclaimer of any warranty.
b311480e 13//
973c2be1 14// Alternatively, this file may be used under the terms of Open CASCADE
15// commercial license or contractual agreement.
7fd59977 16
42cf5bc1 17
18#include <BRepAlgo_AsDes.hxx>
19#include <Standard_ConstructionError.hxx>
20#include <Standard_Type.hxx>
21#include <TopoDS_Shape.hxx>
7fd59977 22#include <TopTools_ListIteratorOfListOfShape.hxx>
23
92efcf78 24IMPLEMENT_STANDARD_RTTIEXT(BRepAlgo_AsDes,MMgt_TShared)
25
7fd59977 26//=======================================================================
27//function : BRepAlgo_AsDes
28//purpose :
29//=======================================================================
7fd59977 30BRepAlgo_AsDes::BRepAlgo_AsDes()
31{
32}
33
34
35//=======================================================================
36//function : Add
37//purpose :
38//=======================================================================
39
40void BRepAlgo_AsDes::Add(const TopoDS_Shape& S, const TopoDS_Shape& SS)
41{
42 if (!down.IsBound(S)) {
43 TopTools_ListOfShape L;
44 down.Bind(S,L);
45 }
46 down(S).Append(SS);
47
48 if (!up.IsBound(SS)) {
49 TopTools_ListOfShape L;
50 up.Bind(SS,L);
51 }
52 up(SS).Append(S);
53}
54
55
56//=======================================================================
57//function : Add
58//purpose :
59//=======================================================================
60
61void BRepAlgo_AsDes::Add(const TopoDS_Shape& S, const TopTools_ListOfShape& SS)
62{
63 TopTools_ListIteratorOfListOfShape it(SS);
64 for ( ; it.More(); it.Next()) {
65 Add(S,it.Value());
66 }
67}
68
69//=======================================================================
70//function : Clear
71//purpose :
72//=======================================================================
73
74void BRepAlgo_AsDes::Clear()
75{
76 up .Clear();
77 down.Clear();
78}
79
80
81//=======================================================================
82//function : HasAscendant
83//purpose :
84//=======================================================================
85
86Standard_Boolean BRepAlgo_AsDes::HasAscendant(const TopoDS_Shape& S)
87const
88{
89 return up.IsBound(S);
90}
91
92//=======================================================================
93//function : HasDescendant
94//purpose :
95//=======================================================================
96
97Standard_Boolean BRepAlgo_AsDes::HasDescendant(const TopoDS_Shape& S)
98const
99{
100 return down.IsBound(S);
101}
102
103//=======================================================================
104//function : Ascendant
105//purpose :
106//=======================================================================
107
108const TopTools_ListOfShape& BRepAlgo_AsDes::Ascendant(const TopoDS_Shape& S) const
109{
110 if (up.IsBound(S))
111 return up(S);
112 static TopTools_ListOfShape empty;
113 return empty;
114}
115
116
117//=======================================================================
118//function : Descendant
119//purpose :
120//=======================================================================
121
122const TopTools_ListOfShape& BRepAlgo_AsDes::Descendant(const TopoDS_Shape& S) const
123{
124 if (down.IsBound(S))
125 return down(S);
126 static TopTools_ListOfShape empty;
127 return empty;
128}
129
130//=======================================================================
131//function : ChangeDescendant
132//purpose :
133//=======================================================================
134
135TopTools_ListOfShape& BRepAlgo_AsDes::ChangeDescendant(const TopoDS_Shape& S)
136{
137 if (down.IsBound(S))
138 return down.ChangeFind(S);
139 static TopTools_ListOfShape empty;
140 return empty;
141}
142
143//=======================================================================
144//function : ReplaceInList
145//purpose :
146//=======================================================================
147
148static void ReplaceInList(const TopoDS_Shape& OldS,
149 const TopoDS_Shape& NewS,
150 TopTools_ListOfShape& L)
151{
152 TopTools_ListIteratorOfListOfShape it(L);
153
154 while(it.More()) {
155 if (it.Value().IsSame(OldS)) {
156 TopAbs_Orientation O = it.Value().Orientation();
157 L.InsertBefore(NewS.Oriented(O),it);
158 L.Remove(it);
159 }
160 else it.Next();
161 }
162}
163//=======================================================================
164//function : RemoveInList
165//purpose :
166//=======================================================================
167
168static void RemoveInList(const TopoDS_Shape& S,
169 TopTools_ListOfShape& L)
170{
171 TopTools_ListIteratorOfListOfShape it(L);
172 while(it.More()) {
173 if (it.Value().IsSame(S)) {
174 L.Remove(it);
175 break;
176 }
177 it.Next();
178 }
179}
180
181//=======================================================================
182//function : HasCommonDescendant
183//purpose :
184//=======================================================================
185
186Standard_Boolean BRepAlgo_AsDes::HasCommonDescendant(const TopoDS_Shape& S1,
187 const TopoDS_Shape& S2,
188 TopTools_ListOfShape& LC)
189const
190{
191 LC.Clear();
192 if (HasDescendant (S1) && HasDescendant (S2)) {
193 TopTools_ListIteratorOfListOfShape it1(Descendant(S1));
194 for (; it1.More(); it1.Next()) {
195 const TopoDS_Shape& DS1 = it1.Value();
196 TopTools_ListIteratorOfListOfShape it2(Ascendant(DS1));
197 for (; it2.More(); it2.Next()) {
198 const TopoDS_Shape& ADS1 = it2.Value();
199 if (ADS1.IsSame(S2)) {
200 LC.Append(DS1);
201 }
202 }
203 }
204 }
205 return (!LC.IsEmpty());
206}
207
208//=======================================================================
209//function : BackReplace
210//purpose :
211//=======================================================================
212
213void BRepAlgo_AsDes::BackReplace(const TopoDS_Shape& OldS,
214 const TopoDS_Shape& NewS,
215 const TopTools_ListOfShape& L,
216 const Standard_Boolean InUp)
217{
218 TopTools_ListIteratorOfListOfShape it(L);
219 for ( ; it.More(); it.Next()) {
220 const TopoDS_Shape& S = it.Value();
221 if (InUp) {
222 if (up.IsBound(S)) {
223 ReplaceInList(OldS,NewS,up.ChangeFind(S));
224 }
225 }
226 else {
227 if (down.IsBound(S)) {
228 ReplaceInList(OldS,NewS,down.ChangeFind(S));
229 }
230 }
231 }
232}
233
234//=======================================================================
235//function : Replace
236//purpose :
237//=======================================================================
238
239void BRepAlgo_AsDes::Replace(const TopoDS_Shape& OldS,
240 const TopoDS_Shape& NewS)
241{
242 Standard_Boolean InUp;
243
244 if (up.IsBound(OldS)) {
245 InUp = Standard_False;
246 BackReplace (OldS,NewS,up(OldS),InUp);
247 if (up.IsBound(NewS)) {
248 up(NewS).Append(up(OldS));
249 }
250 else {
251 up.Bind(NewS,up(OldS));
252 }
253 up.UnBind(OldS);
254 }
255
256 if (down.IsBound(OldS)) {
257 InUp = Standard_True;
258 BackReplace(OldS,NewS,down (OldS),InUp);
259 if (down.IsBound(NewS)) {
260 down(NewS).Append(down(OldS));
261 }
262 else {
263 down.Bind(NewS,down(OldS));
264 }
265 down.UnBind(OldS);
266 }
267}
268
269//=======================================================================
270//function : Remove
271//purpose :
272//=======================================================================
273
274void BRepAlgo_AsDes::Remove(const TopoDS_Shape& SS)
275{
276 if (down.IsBound(SS)) {
277 Standard_ConstructionError::Raise(" BRepAlgo_AsDes::Remove");
278 }
279 if (!up.IsBound(SS)) {
280 Standard_ConstructionError::Raise(" BRepAlgo_AsDes::Remove");
281 }
282 TopTools_ListIteratorOfListOfShape it(up(SS));
283 for (; it.More(); it.Next()) {
284 RemoveInList(SS,down.ChangeFind((it.Value())));
285 }
286 up.UnBind(SS);
287}