0024157: Parallelization of assembly part of BO
[occt.git] / src / IFSelect / IFSelect_SelectPointed.cxx
1 // Copyright (c) 1999-2012 OPEN CASCADE SAS
2 //
3 // The content of this file is subject to the Open CASCADE Technology Public
4 // License Version 6.5 (the "License"). You may not use the content of this file
5 // except in compliance with the License. Please obtain a copy of the License
6 // at http://www.opencascade.org and read it completely before using this file.
7 //
8 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
9 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
10 //
11 // The Original Code and all software distributed under the License is
12 // distributed on an "AS IS" basis, without warranty of any kind, and the
13 // Initial Developer hereby disclaims all such warranties, including without
14 // limitation, any warranties of merchantability, fitness for a particular
15 // purpose or non-infringement. Please see the License for the specific terms
16 // and conditions governing the rights and limitations under the License.
17
18 #include <IFSelect_SelectPointed.ixx>
19 #include <TColStd_MapOfTransient.hxx>
20
21
22
23 IFSelect_SelectPointed::IFSelect_SelectPointed ()
24     : theset (Standard_False)    {  }
25
26     void  IFSelect_SelectPointed::Clear()
27       {  theitems.Clear();  theset = Standard_False;  }
28
29     Standard_Boolean  IFSelect_SelectPointed::IsSet () const
30       {  return theset;  }
31
32     void  IFSelect_SelectPointed::SetEntity
33   (const Handle(Standard_Transient)& ent)
34 {
35   theitems.Clear();
36   theset = Standard_True;
37   if (ent.IsNull()) return;
38   theitems.Append (ent);
39 }
40
41     void  IFSelect_SelectPointed::SetList
42   (const Handle(TColStd_HSequenceOfTransient)& list)
43 {
44   theitems.Clear();
45   theset = Standard_True;
46   if (list.IsNull()) return;
47   Standard_Integer i,nb = list->Length();
48   for (i = 1; i <= nb; i ++)  theitems.Append (list->Value(i));
49 }
50
51 //  ....    Editions
52
53     Standard_Boolean  IFSelect_SelectPointed::Add
54   (const Handle(Standard_Transient)& item)
55 {
56   if (item.IsNull()) return Standard_False;
57   for (Standard_Integer i = theitems.Length(); i >= 1; i --)
58     if (item == theitems.Value(i)) return Standard_False;
59   theitems.Append(item);
60   theset = Standard_True;
61   return Standard_True;
62 }
63
64     Standard_Boolean  IFSelect_SelectPointed::Remove
65   (const Handle(Standard_Transient)& item)
66 {
67   if (item.IsNull()) return Standard_False;
68   for (Standard_Integer i = theitems.Length(); i >= 1; i --)
69     if (item == theitems.Value(i)) { theitems.Remove(i); return Standard_True;}
70   return Standard_True;
71 }
72
73     Standard_Boolean  IFSelect_SelectPointed::Toggle
74   (const Handle(Standard_Transient)& item)
75 {
76   if (item.IsNull()) return Standard_False;
77   Standard_Integer num = 0;
78   for (Standard_Integer i = theitems.Length(); i >= 1; i --)
79     if (item == theitems.Value(i)) num = i;
80   if (num == 0) theitems.Append(item);
81   else          theitems.Remove(num);
82   return (num == 0);
83 }
84
85     Standard_Boolean  IFSelect_SelectPointed::AddList
86   (const Handle(TColStd_HSequenceOfTransient)& list)
87 {
88 //   Optimise avec une Map
89   Standard_Boolean res = Standard_False;
90   if (list.IsNull()) return res;
91   Standard_Integer i, nb = theitems.Length(), nl = list->Length();
92   TColStd_MapOfTransient deja (nb+nl+1);
93   for (i = 1; i <= nb; i ++) deja.Add (theitems.Value(i));
94
95   for (i = 1; i <= nl; i ++) {
96     if (!deja.Contains (list->Value(i)) ) theitems.Append (list->Value(i));
97   }
98   theset = Standard_True;
99   return res;
100 }
101
102     Standard_Boolean  IFSelect_SelectPointed::RemoveList
103   (const Handle(TColStd_HSequenceOfTransient)& list)
104 {
105   Standard_Boolean res = Standard_False;
106   if (list.IsNull()) return res;
107   Standard_Integer i, nb = list->Length();
108   for (i = 1; i <= nb; i ++) res |= Remove (list->Value(i));
109   return res;
110 }
111
112     Standard_Boolean  IFSelect_SelectPointed::ToggleList
113   (const Handle(TColStd_HSequenceOfTransient)& list)
114 {
115   Standard_Boolean res = Standard_True;
116   if (list.IsNull()) return res;
117   Standard_Integer i, nb = list->Length();
118   for (i = 1; i <= nb; i ++) res |= Toggle (list->Value(i));
119   return res;
120 }
121
122
123 //  ....   Consultations
124
125     Standard_Integer  IFSelect_SelectPointed::Rank
126   (const Handle(Standard_Transient)& item) const
127 {
128   if (item.IsNull()) return 0;
129   for (Standard_Integer i = theitems.Length(); i >= 1; i --)
130     if (item == theitems.Value(i)) return i;
131   return 0;
132 }
133
134     Standard_Integer  IFSelect_SelectPointed::NbItems () const
135       {  return theitems.Length();  }
136
137     Handle(Standard_Transient)  IFSelect_SelectPointed::Item
138   (const Standard_Integer num) const
139 {
140   Handle(Standard_Transient) item;
141   if (num <= 0 || num > theitems.Length()) return item;
142   return theitems.Value(num);
143 }
144
145     void  IFSelect_SelectPointed::Update
146   (const Handle(Interface_CopyControl)& control)
147 {
148   Standard_Integer nb = theitems.Length();
149   for (Standard_Integer i = nb; i > 0; i --) {
150     Handle(Standard_Transient) enfr, ento;
151     enfr = theitems.Value(i);
152     if (!control->Search(enfr,ento)) theitems.Remove(i);
153     else  theitems.SetValue(i,ento);
154   }
155 }
156
157     void  IFSelect_SelectPointed::Update
158   (const Handle(IFSelect_Transformer)& trf)
159 {
160   Standard_Integer nb = theitems.Length();
161   for (Standard_Integer i = nb; i > 0; i --) {
162     Handle(Standard_Transient) enfr, ento;
163     enfr = theitems.Value(i);
164     if (!trf->Updated(enfr,ento)) theitems.Remove(i);
165     else  theitems.SetValue(i,ento);
166   }
167 }
168
169 //  ....  Actions Generales
170
171     Interface_EntityIterator  IFSelect_SelectPointed::RootResult
172   (const Interface_Graph& G) const
173 {
174   Interface_EntityIterator result;
175   Standard_Integer nb = theitems.Length();
176   for (Standard_Integer i = 1; i <= nb; i ++) {
177     Handle(Standard_Transient) item = theitems.Value(i);
178     if (G.EntityNumber(item) > 0) result.GetOneItem(item);
179   }
180   return result;
181 }
182
183     TCollection_AsciiString  IFSelect_SelectPointed::Label () const
184       {  return TCollection_AsciiString ("Pointed Entities");  }