0031313: Foundation Classes - Dump improvement for classes
[occt.git] / src / TDataStd / TDataStd_BooleanArray.cxx
1 // Created on: 2007-05-29
2 // Created by: Vlad Romashko
3 // Copyright (c) 2007-2014 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
15
16 #include <TDataStd_BooleanArray.hxx>
17
18 #include <Standard_Dump.hxx>
19 #include <Standard_GUID.hxx>
20 #include <Standard_Type.hxx>
21 #include <TDF_Attribute.hxx>
22 #include <TDF_Label.hxx>
23 #include <TDF_RelocationTable.hxx>
24
25 IMPLEMENT_STANDARD_RTTIEXT(TDataStd_BooleanArray,TDF_Attribute)
26
27 static Standard_Integer DegreeOf2(const Standard_Integer degree)
28 {
29   switch (degree)
30   {
31     case 0:
32       return 1;
33     case 1:
34       return 2;
35     case 2:
36       return 4;
37     case 3:
38       return 8;
39     case 4:
40       return 16;
41     case 5:
42       return 32;
43     case 6:
44       return 64;
45     case 7:
46       return 128;
47     case 8:
48       return 256;
49   }
50   return -1;
51 }
52
53 //=======================================================================
54 //function : GetID
55 //purpose  : 
56 //=======================================================================
57 const Standard_GUID& TDataStd_BooleanArray::GetID() 
58
59   static Standard_GUID TDataStd_BooleanArrayID ("C7E98E54-B5EA-4aa9-AC99-9164EBD07F10");
60   return TDataStd_BooleanArrayID; 
61 }
62
63 //=======================================================================
64 //function : SetAttr
65 //purpose  : Implements Set functionality
66 //=======================================================================
67 static Handle(TDataStd_BooleanArray) SetAttr(const TDF_Label&       label,
68                                              const Standard_Integer lower,
69                                              const Standard_Integer upper,
70                                              const Standard_GUID&   theGuid) 
71 {
72   Handle(TDataStd_BooleanArray) A;
73   if (!label.FindAttribute (theGuid, A)) 
74   {
75     A = new TDataStd_BooleanArray;
76     A->SetID(theGuid);
77     A->Init (lower, upper); 
78     label.AddAttribute(A);
79   }
80   else if (lower != A->Lower() || upper != A->Upper())
81   {
82     A->Init(lower, upper);
83   }
84   return A;
85 }
86
87 //=======================================================================
88 //function : TDataStd_BooleanArray
89 //purpose  : Empty Constructor
90 //=======================================================================
91 TDataStd_BooleanArray::TDataStd_BooleanArray() : myID(GetID())
92 {}
93
94 //=======================================================================
95 //function : Init
96 //purpose  : 
97 //=======================================================================
98 void TDataStd_BooleanArray::Init(const Standard_Integer lower,
99                                  const Standard_Integer upper)
100 {
101   Standard_RangeError_Raise_if(upper < lower,"TDataStd_BooleanArray::Init");
102   Backup();
103   myLower = lower;
104   myUpper = upper;
105   myValues = new TColStd_HArray1OfByte(0, Length() >> 3, 0/*initialize to FALSE*/);
106 }
107
108 //=======================================================================
109 //function : Set
110 //purpose  : 
111 //=======================================================================
112 Handle(TDataStd_BooleanArray) TDataStd_BooleanArray::Set(const TDF_Label&       label,
113                                                          const Standard_Integer lower,
114                                                          const Standard_Integer upper) 
115 {
116   return SetAttr(label, lower, upper, GetID());
117 }
118
119
120 //=======================================================================
121 //function : Set
122 //purpose  : Set user defined attribute with specific ID
123 //=======================================================================
124 Handle(TDataStd_BooleanArray) TDataStd_BooleanArray::Set(const TDF_Label&       label,
125                                                          const Standard_GUID&   theGuid,
126                                                          const Standard_Integer lower,
127                                                          const Standard_Integer upper)
128 {
129   return SetAttr(label, lower, upper, theGuid);
130 }
131
132 //=======================================================================
133 //function : SetValue
134 //purpose  : 
135 //=======================================================================
136 void TDataStd_BooleanArray::SetValue (const Standard_Integer index,
137                                       const Standard_Boolean value) 
138 {
139
140   if (myValues.IsNull()) 
141     return; 
142   Standard_Integer byte_index = (index - myLower) >> 3;
143   Standard_Integer degree = index - (byte_index << 3) - myLower;
144   Standard_Integer byte_value = DegreeOf2(degree);
145
146   if ((value != 0) == ((myValues->Value(byte_index) & byte_value) > 0))
147     return;
148
149   Backup();
150
151   if (value)
152   {
153     myValues->ChangeValue(byte_index) |= byte_value;
154   }
155   else
156   {
157     myValues->ChangeValue(byte_index) ^= byte_value;
158   }
159 }
160
161 //=======================================================================
162 //function : Value
163 //purpose  : 
164 //=======================================================================
165 Standard_Boolean TDataStd_BooleanArray::Value (const Standard_Integer index) const 
166 {
167   if (myValues.IsNull())
168     return Standard_False;
169   if (index < myLower || index > myUpper)
170     return Standard_False;
171
172   Standard_Integer byte_index = (index - myLower) >> 3;
173   Standard_Integer degree = index - (byte_index << 3) - myLower;
174   Standard_Integer byte_value = DegreeOf2(degree);
175
176   return (myValues->Value(byte_index) & byte_value) > 0;
177 }
178
179 //=======================================================================
180 //function : Lower
181 //purpose  : 
182 //=======================================================================
183 Standard_Integer TDataStd_BooleanArray::Lower (void) const 
184
185   return myLower;
186 }
187
188 //=======================================================================
189 //function : Upper
190 //purpose  : 
191 //=======================================================================
192 Standard_Integer TDataStd_BooleanArray::Upper (void) const 
193
194   return myUpper;
195 }
196
197 //=======================================================================
198 //function : Length
199 //purpose  : 
200 //=======================================================================
201 Standard_Integer TDataStd_BooleanArray::Length (void) const 
202 {
203   return myUpper - myLower + 1;
204 }
205
206 //=======================================================================
207 //function : InternalArray
208 //purpose  : 
209 //=======================================================================
210 const Handle(TColStd_HArray1OfByte)& TDataStd_BooleanArray::InternalArray () const 
211 {
212   return myValues;
213 }
214
215 //=======================================================================
216 //function : SetInternalArray
217 //purpose  : 
218 //=======================================================================
219 void TDataStd_BooleanArray::SetInternalArray (const Handle(TColStd_HArray1OfByte)& values)
220 {
221   myValues = values;
222 }
223
224 //=======================================================================
225 //function : ID
226 //purpose  : 
227 //=======================================================================
228 const Standard_GUID& TDataStd_BooleanArray::ID () const 
229
230   return myID; 
231 }
232
233 //=======================================================================
234 //function : SetID
235 //purpose  :
236 //=======================================================================
237
238 void TDataStd_BooleanArray::SetID( const Standard_GUID&  theGuid)
239 {  
240   if(myID == theGuid) return;
241   Backup();
242   myID = theGuid;
243 }
244
245 //=======================================================================
246 //function : SetID
247 //purpose  : sets default ID
248 //=======================================================================
249 void TDataStd_BooleanArray::SetID()
250 {
251   Backup();
252   myID = GetID();
253 }
254 //=======================================================================
255 //function : NewEmpty
256 //purpose  : 
257 //=======================================================================
258 Handle(TDF_Attribute) TDataStd_BooleanArray::NewEmpty () const
259 {  
260   return new TDataStd_BooleanArray(); 
261 }
262
263 //=======================================================================
264 //function : Restore
265 //purpose  : 
266 //=======================================================================
267 void TDataStd_BooleanArray::Restore(const Handle(TDF_Attribute)& With) 
268 {
269   Handle(TDataStd_BooleanArray) anArray = Handle(TDataStd_BooleanArray)::DownCast(With);
270   if (!anArray->myValues.IsNull()) 
271   {
272     myLower = anArray->Lower();
273     myUpper = anArray->Upper();
274     Standard_Integer byte_upper = Length() >> 3;
275     myValues = new TColStd_HArray1OfByte(0, byte_upper, 0/*initialize to FALSE*/);
276     const TColStd_Array1OfByte& with_array = anArray->myValues->Array1();
277     for (Standard_Integer i = 0; i <= byte_upper; i++)
278     {
279       myValues->SetValue(i, with_array.Value(i));
280     }
281     myID = anArray->ID();
282   }
283   else
284   {
285     myValues.Nullify();
286   }
287 }
288
289 //=======================================================================
290 //function : Paste
291 //purpose  : 
292 //=======================================================================
293 void TDataStd_BooleanArray::Paste (const Handle(TDF_Attribute)& Into,
294                                    const Handle(TDF_RelocationTable)& ) const
295 {
296   if (!myValues.IsNull()) 
297   {
298     Handle(TDataStd_BooleanArray) anArray = Handle(TDataStd_BooleanArray)::DownCast(Into);
299     if (!anArray.IsNull())
300     {
301       anArray->Init(myLower, myUpper);
302       for (Standard_Integer i = myLower; i <= myUpper; i++)
303       {
304         anArray->SetValue(i, Value(i));
305       }
306     }
307     anArray->SetID(myID);
308   }
309 }
310
311 //=======================================================================
312 //function : Dump
313 //purpose  : 
314 //=======================================================================
315 Standard_OStream& TDataStd_BooleanArray::Dump (Standard_OStream& anOS) const
316 {  
317   anOS << "\nBooleanArray: ";
318   Standard_Character sguid[Standard_GUID_SIZE_ALLOC];
319   myID.ToCString(sguid);
320   anOS << sguid;
321   anOS <<std::endl;
322   return anOS;
323 }
324
325 //=======================================================================
326 //function : DumpJson
327 //purpose  : 
328 //=======================================================================
329 void TDataStd_BooleanArray::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const
330 {
331   OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream)
332
333   OCCT_DUMP_BASE_CLASS (theOStream, theDepth, TDF_Attribute)
334
335   for (TColStd_Array1OfByte::Iterator aValueIt (myValues->Array1()); aValueIt.More(); aValueIt.Next())
336   {
337     const Standard_Byte& aValue = aValueIt.Value();
338     OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, aValue)
339   }
340   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myLower)
341   OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myUpper)
342   OCCT_DUMP_FIELD_VALUE_GUID (theOStream, myID)
343 }