aa5222bde2c3646a8fbe8ef9eb14298b791c042c
[occt.git] / src / TopTools / TopTools_MutexForShapeProvider.cxx
1 // Created on: 2012-06-27
2 // Created by: Dmitry BOBYLEV
3 // Copyright (c) 2012 OPEN CASCADE SAS
4 //
5 // The content of this file is subject to the Open CASCADE Technology Public
6 // License Version 6.5 (the "License"). You may not use the content of this file
7 // except in compliance with the License. Please obtain a copy of the License
8 // at http://www.opencascade.org and read it completely before using this file.
9 //
10 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
11 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
12 //
13 // The Original Code and all software distributed under the License is
14 // distributed on an "AS IS" basis, without warranty of any kind, and the
15 // Initial Developer hereby disclaims all such warranties, including without
16 // limitation, any warranties of merchantability, fitness for a particular
17 // purpose or non-infringement. Please see the License for the specific terms
18 // and conditions governing the rights and limitations under the License.
19
20 #include <TopTools_MutexForShapeProvider.hxx>
21
22 #include <TopoDS_Iterator.hxx>
23
24 // macro to compare two types of shapes
25 #define SAMETYPE(x,y) ((x) == (y))
26 #define LESSCOMPLEX(x,y) ((x) > (y))
27
28 //=======================================================================
29 //function : TopTools_MutexForShapeProvider
30 //purpose  : 
31 //=======================================================================
32 TopTools_MutexForShapeProvider::TopTools_MutexForShapeProvider()
33 {
34 }
35
36
37 //=======================================================================
38 //function : ~TopTools_MutexForShapeProvider
39 //purpose  : 
40 //=======================================================================
41 TopTools_MutexForShapeProvider::~TopTools_MutexForShapeProvider()
42 {
43   RemoveAllMutexes();
44 }
45
46 //=======================================================================
47 //function : CreateMutexesForSubShapes
48 //purpose  : 
49 //=======================================================================
50 void TopTools_MutexForShapeProvider::CreateMutexesForSubShapes(const TopoDS_Shape& theShape,
51                                                                const TopAbs_ShapeEnum theType)
52 {
53   if (LESSCOMPLEX(theShape.ShapeType(), theType))
54     return;
55
56   for(TopoDS_Iterator anIt(theShape); anIt.More(); anIt.Next())
57   {
58     const TopoDS_Shape& aShape = anIt.Value();
59     if (LESSCOMPLEX(theType, aShape.ShapeType()))
60     {
61       CreateMutexesForSubShapes(aShape, theType);
62     }
63     else if (SAMETYPE(theType, aShape.ShapeType()))
64     {
65       CreateMutexForShape(aShape);
66     }
67   }
68 }
69
70 //=======================================================================
71 //function : CreateMutexForShape
72 //purpose  : 
73 //=======================================================================
74 void TopTools_MutexForShapeProvider::CreateMutexForShape(const TopoDS_Shape& theShape)
75 {
76   if (!myMap.IsBound(theShape))
77   {
78     Standard_Mutex* aMutex = new Standard_Mutex();
79     myMap.Bind(theShape, aMutex);
80   }
81 }
82
83 //=======================================================================
84 //function : CreateMutexForShape
85 //purpose  : 
86 //=======================================================================
87 Standard_Mutex* TopTools_MutexForShapeProvider::GetMutex(const TopoDS_Shape& theShape) const
88 {
89   if (myMap.IsBound(theShape))
90   {
91     Standard_Mutex* aMutex = myMap.Find(theShape);
92     return aMutex;
93   }
94   else
95   {
96     return NULL;
97   }
98 }
99
100 //=======================================================================
101 //function : RemoveAllMutexes
102 //purpose  : 
103 //=======================================================================
104 void TopTools_MutexForShapeProvider::RemoveAllMutexes()
105 {
106   for (NCollection_DataMap<TopoDS_Shape, Standard_Mutex *, TopTools_ShapeMapHasher>::Iterator anIter;
107          anIter.More(); anIter.Next())
108   {
109     delete anIter.Value();
110   }
111   myMap.Clear();
112 }