0024428: Implementation of LGPL license
[occt.git] / src / BOPAlgo / BOPAlgo_Builder_2Cnt.hxx
1 // Created by: Peter KURNEV
2 // Copyright (c) 1999-2013 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
7 // under the terms of the GNU Lesser General Public 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 #ifndef BOPAlgo_Builder_2Cnt_HeaderFile
16 #define BOPAlgo_Builder_2Cnt_HeaderFile
17
18 #include <NCollection_IndexedDataMap.hxx>
19
20 #include <TopoDS_Shape.hxx>
21 #include <TopoDS_Face.hxx>
22
23 #include <BOPCol_TBB.hxx>
24 #include <BOPCol_NCVector.hxx>
25
26 #include <BOPTools_Set.hxx>
27 #include <BOPTools_SetMapHasher.hxx>
28 #include <BOPTools_AlgoTools.hxx>
29
30 #include <BOPInt_Context.hxx>
31
32 #include <BOPAlgo_BuilderFace.hxx>
33
34 //=======================================================================
35 //class    : BOPAlgo_VectorOfBuilderFace
36 //purpose  : 
37 //=======================================================================
38 typedef BOPCol_NCVector<BOPAlgo_BuilderFace> BOPAlgo_VectorOfBuilderFace;
39 //
40 //=======================================================================
41 //class    : BOPAlgo_BuilderFaceFunctor
42 //purpose  : 
43 //=======================================================================
44 class BOPAlgo_BuilderFaceFunctor {
45  protected:
46   BOPAlgo_VectorOfBuilderFace* myPVBF;
47   //
48  public:
49   //
50   BOPAlgo_BuilderFaceFunctor(BOPAlgo_VectorOfBuilderFace& aVBF) 
51     : myPVBF(&aVBF) {
52   }
53   //
54   void operator()( const flexible_range<Standard_Size>& aBR ) const{
55     Standard_Size i, iBeg, iEnd;
56     //
57     BOPAlgo_VectorOfBuilderFace& aVBF=*myPVBF;
58     //
59     iBeg=aBR.begin();
60     iEnd=aBR.end();
61     for(i=iBeg; i!=iEnd; ++i) {
62       BOPAlgo_BuilderFace& aBF=aVBF((Standard_Integer)i);
63       //
64       aBF.Perform();
65     }
66   }
67 };
68 //=======================================================================
69 //class    : BOPAlgo_BuilderFaceCnt
70 //purpose  : 
71 //=======================================================================
72 class BOPAlgo_BuilderFaceCnt {
73  public:
74   //-------------------------------
75   // Perform
76   Standard_EXPORT static void Perform(const Standard_Boolean bRunParallel,
77                                       BOPAlgo_VectorOfBuilderFace& aVBF) {
78     //
79     BOPAlgo_BuilderFaceFunctor aBFF(aVBF);
80     Standard_Size aNbBF=aVBF.Extent();
81     //
82     if (bRunParallel) {
83       flexible_for(flexible_range<Standard_Size>(0,aNbBF), aBFF);
84     }
85     else {
86       aBFF.operator()(flexible_range<Standard_Size>(0,aNbBF));
87     }
88   }
89   //
90 };
91 //
92 //-------------------------------------------------------------------------
93 typedef BOPCol_NCVector<TopoDS_Shape> BOPAlgo_VectorOfShape;
94 typedef BOPCol_NCVector<BOPAlgo_VectorOfShape> BOPAlgo_VectorOfVectorOfShape;
95
96 typedef NCollection_IndexedDataMap\
97   <BOPTools_Set, Standard_Integer, BOPTools_SetMapHasher> \
98     BOPAlgo_IndexedDataMapOfSetInteger;
99 //
100 //=======================================================================
101 //class    : BOPAlgo_PairOfShapeBoolean
102 //purpose  : 
103 //=======================================================================
104 class BOPAlgo_PairOfShapeBoolean {
105  public:
106   BOPAlgo_PairOfShapeBoolean()
107     : myFlag(Standard_False) {
108   }
109   //
110   TopoDS_Shape& Shape1() {
111     return myShape1;
112   }
113   //
114   TopoDS_Shape& Shape2() {
115     return myShape2;
116   }
117   //
118   Standard_Boolean& Flag() {
119     return myFlag;
120   }
121   //
122  protected: 
123   Standard_Boolean myFlag;
124   TopoDS_Shape myShape1;
125   TopoDS_Shape myShape2;
126 };
127
128 typedef BOPCol_NCVector<BOPAlgo_PairOfShapeBoolean> BOPAlgo_VectorOfPairOfShapeBoolean;
129 //
130
131 //=======================================================================
132 //function : BOPAlgo_BuilderSDFaceFunctor
133 //purpose  : 
134 //=======================================================================
135 class BOPAlgo_BuilderSDFaceFunctor {
136  protected:
137   BOPAlgo_VectorOfPairOfShapeBoolean* myPVPSB;
138   
139  public:
140   //
141   BOPAlgo_BuilderSDFaceFunctor(BOPAlgo_VectorOfPairOfShapeBoolean& aVPSB)
142     : myPVPSB(&aVPSB){
143   }
144   //
145   void operator()( const flexible_range<Standard_Integer>& aBR ) const {
146     Standard_Boolean bFlag;
147     Standard_Integer i, iBeg, iEnd;
148     Handle(BOPInt_Context) aContext;
149     //
150     aContext=new BOPInt_Context;
151     //
152     BOPAlgo_VectorOfPairOfShapeBoolean& aVPSB=*myPVPSB;
153     //
154     iBeg=aBR.begin();
155     iEnd=aBR.end();
156     for(i=iBeg; i!=iEnd; ++i) {
157       BOPAlgo_PairOfShapeBoolean& aPSB=aVPSB(i);
158       const TopoDS_Face& aFj=(*(TopoDS_Face*)(&aPSB.Shape1()));
159       const TopoDS_Face& aFk=(*(TopoDS_Face*)(&aPSB.Shape2()));
160       bFlag=BOPTools_AlgoTools::AreFacesSameDomain(aFj, aFk, aContext);
161       if (bFlag) {
162         aPSB.Flag()=bFlag;
163       }
164     }
165   }
166 };
167 //
168 //=======================================================================
169 //function : BOPAlgo_BuilderSDFaceCnt
170 //purpose  : 
171 //=======================================================================
172 class BOPAlgo_BuilderSDFaceCnt {
173  public:
174   //-------------------------------
175   // Perform
176   Standard_EXPORT static 
177     void Perform(const Standard_Boolean bRunParallel,
178                  BOPAlgo_VectorOfPairOfShapeBoolean& aVPSB) {
179     Standard_Integer aNbVPSB;
180     //
181     aNbVPSB=aVPSB.Extent();
182     BOPAlgo_BuilderSDFaceFunctor aBFF(aVPSB);
183     //
184     if (bRunParallel) {
185       flexible_for(flexible_range<Standard_Integer>(0,aNbVPSB), aBFF);
186     }
187     else {
188       aBFF.operator()(flexible_range<Standard_Integer>(0,aNbVPSB));
189     }
190   }
191   //
192 };
193
194
195 #endif