0027970: Improvement of standard attributes usability - containers.
[occt.git] / src / TDataStd / TDataStd_IntegerArray.cxx
1 // Created on: 1999-06-16
2 // Created by: Sergey RUIN
3 // Copyright (c) 1999-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
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
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.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17
18 #include <Standard_GUID.hxx>
19 #include <Standard_Type.hxx>
20 #include <TDataStd_DeltaOnModificationOfIntArray.hxx>
21 #include <TDataStd_IntegerArray.hxx>
22 #include <TDF_Attribute.hxx>
23 #include <TDF_DefaultDeltaOnModification.hxx>
24 #include <TDF_DeltaOnModification.hxx>
25 #include <TDF_Label.hxx>
26 #include <TDF_RelocationTable.hxx>
27
28 IMPLEMENT_STANDARD_RTTIEXT(TDataStd_IntegerArray,TDF_Attribute)
29
30 //=======================================================================
31 //function : GetID
32 //purpose  : 
33 //=======================================================================
34 const Standard_GUID& TDataStd_IntegerArray::GetID() 
35
36   static Standard_GUID TDataStd_IntegerArrayID ("2a96b61d-ec8b-11d0-bee7-080009dc3333");
37   return TDataStd_IntegerArrayID; 
38 }
39
40 //=======================================================================
41 //function : SetAttr
42 //purpose  : Implements Set functionality
43 //=======================================================================
44 static Handle(TDataStd_IntegerArray) SetAttr(const TDF_Label&       label,
45                                              const Standard_Integer lower,
46                                              const Standard_Integer upper,
47                                              const Standard_Boolean isDelta,
48                                              const Standard_GUID&   theGuid) 
49 {
50   Handle(TDataStd_IntegerArray) A;
51   if (!label.FindAttribute (theGuid, A)) 
52   {
53     A = new TDataStd_IntegerArray;
54     A->Init (lower, upper);
55     A->SetDelta(isDelta); 
56     A->SetID(theGuid);
57     label.AddAttribute(A);
58   }
59   else if (lower != A->Lower() || upper != A->Upper())
60   {
61     A->Init(lower, upper);
62   }
63   return A;
64 }
65
66 //=======================================================================
67 //function : TDataStd_IntegerArray
68 //purpose  : Empty Constructor
69 //=======================================================================
70
71 TDataStd_IntegerArray::TDataStd_IntegerArray()
72   :myIsDelta(Standard_False)
73 {}
74
75 //=======================================================================
76 //function : Init
77 //purpose  : 
78 //=======================================================================
79
80 void TDataStd_IntegerArray::Init(const Standard_Integer lower,
81                                  const Standard_Integer upper)
82 {
83   Standard_RangeError_Raise_if(upper < lower,"TDataStd_IntegerArray::Init");  
84   Backup();
85   myValue = new TColStd_HArray1OfInteger(lower, upper, 0);
86 }
87
88 //=======================================================================
89 //function : Set
90 //purpose  : isDelta applicable only for new attributes
91 //=======================================================================
92
93 Handle(TDataStd_IntegerArray) TDataStd_IntegerArray::Set
94                                                 (const TDF_Label&       label,
95                                                  const Standard_Integer lower,
96                                                  const Standard_Integer upper,
97                                                  const Standard_Boolean isDelta) 
98
99 {
100   return SetAttr(label, lower, upper, isDelta, GetID());
101 }
102
103 //=======================================================================
104 //function : Set
105 //purpose  : Set user defined attribute with specific ID
106 //=======================================================================
107
108 Handle(TDataStd_IntegerArray) TDataStd_IntegerArray::Set
109                                                 (const TDF_Label&       label,
110                                                  const Standard_GUID&   theGuid,
111                                                  const Standard_Integer lower,
112                                                  const Standard_Integer upper,
113                                                  const Standard_Boolean isDelta) 
114
115 {
116   return SetAttr(label, lower, upper, isDelta, theGuid);
117 }
118 //=======================================================================
119 //function : SetValue
120 //purpose  : 
121 //=======================================================================
122
123 void TDataStd_IntegerArray::SetValue(const Standard_Integer index, const Standard_Integer value) 
124 {
125   if(myValue.IsNull()) return;
126   if( myValue->Value(index) == value)
127     return;
128   Backup();
129   myValue->SetValue(index, value);
130 }
131
132
133 //=======================================================================
134 //function : GetValue
135 //purpose  : 
136 //=======================================================================
137
138 Standard_Integer TDataStd_IntegerArray::Value (const Standard_Integer index) const 
139 {
140   if(myValue.IsNull()) return 0;
141   return myValue->Value(index); 
142 }
143
144
145
146 //=======================================================================
147 //function : Lower
148 //purpose  : 
149 //=======================================================================
150 Standard_Integer TDataStd_IntegerArray::Lower (void) const 
151
152   if(myValue.IsNull()) return 0;
153   return myValue->Lower(); 
154 }
155
156
157 //=======================================================================
158 //function : Upper
159 //purpose  : 
160 //=======================================================================
161 Standard_Integer TDataStd_IntegerArray::Upper (void) const 
162
163   if(myValue.IsNull()) return 0; 
164   return myValue->Upper(); 
165 }
166
167
168 //=======================================================================
169 //function : Length
170 //purpose  : 
171 //=======================================================================
172 Standard_Integer TDataStd_IntegerArray::Length (void) const 
173 {
174   if(myValue.IsNull()) return 0;
175   return myValue->Length(); 
176 }
177
178
179 //=======================================================================
180 //function : ChangeArray
181 //purpose  : If value of <newArray> differs from <myValue>, Backup 
182 //         : performed and myValue refers to new instance of HArray1OfInteger 
183 //         : that holds <newArray>
184 //=======================================================================
185
186 void TDataStd_IntegerArray::ChangeArray(const Handle(TColStd_HArray1OfInteger)& newArray,
187                                         const Standard_Boolean isCheckItems) 
188 {
189   Standard_Integer aLower    = newArray->Lower();
190   Standard_Integer anUpper   = newArray->Upper();
191   Standard_Boolean aDimEqual = Standard_False;
192   Standard_Integer i;
193
194   if(Lower() == aLower && Upper() == anUpper ) {
195     aDimEqual = Standard_True;
196     if(isCheckItems) {
197       Standard_Boolean isEqual = Standard_True;
198       for(i = aLower; i <= anUpper; i++) {
199         if(myValue->Value(i) != newArray->Value(i)) {
200           isEqual = Standard_False;
201           break;
202         }
203       }
204       if(isEqual)
205         return;
206     }
207   }
208
209   Backup();
210 // Handles of myValue of current and backuped attributes will be different!
211   if(myValue.IsNull() || !aDimEqual) 
212     myValue = new TColStd_HArray1OfInteger(aLower, anUpper);  
213
214   for(i = aLower; i <= anUpper; i++) 
215     myValue->SetValue(i, newArray->Value(i));
216 }
217
218
219 //=======================================================================
220 //function : ID
221 //purpose  : 
222 //=======================================================================
223
224 const Standard_GUID& TDataStd_IntegerArray::ID () const { return myID; }
225
226 //=======================================================================
227 //function : SetID
228 //purpose  :
229 //=======================================================================
230
231 void TDataStd_IntegerArray::SetID( const Standard_GUID&  theGuid)
232 {  
233   if(myID == theGuid) return;
234   Backup();
235   myID = theGuid;
236 }
237
238 //=======================================================================
239 //function : SetID
240 //purpose  : sets default ID
241 //=======================================================================
242
243 void TDataStd_IntegerArray::SetID()
244 {  
245   Backup();
246   myID = GetID();
247 }
248
249 //=======================================================================
250 //function : NewEmpty
251 //purpose  : 
252 //=======================================================================
253
254 Handle(TDF_Attribute) TDataStd_IntegerArray::NewEmpty () const
255 {  
256   return new TDataStd_IntegerArray(); 
257 }
258
259 //=======================================================================
260 //function : Restore
261 //purpose  : 
262 //=======================================================================
263
264 void TDataStd_IntegerArray::Restore(const Handle(TDF_Attribute)& With) 
265 {
266   Standard_Integer i, lower, upper;
267   Handle(TDataStd_IntegerArray) anArray = Handle(TDataStd_IntegerArray)::DownCast(With);
268   if(!anArray->myValue.IsNull()) {
269     lower = anArray->Lower();
270     upper = anArray->Upper(); 
271     myValue = new TColStd_HArray1OfInteger(lower, upper); 
272     for(i = lower; i<=upper; i++)
273       myValue->SetValue(i, anArray->Value(i));
274     myIsDelta = anArray->myIsDelta;
275     myID = anArray->ID();
276   }
277   else
278     myValue.Nullify();
279 }
280
281 //=======================================================================
282 //function : Paste
283 //purpose  : 
284 //=======================================================================
285
286 void TDataStd_IntegerArray::Paste (const Handle(TDF_Attribute)& Into,
287                                    const Handle(TDF_RelocationTable)& ) const
288 {
289
290   if(!myValue.IsNull()) {
291     Handle(TDataStd_IntegerArray) anAtt = Handle(TDataStd_IntegerArray)::DownCast(Into);
292     if(!anAtt.IsNull()) {
293       anAtt->ChangeArray( myValue, Standard_False );
294       anAtt->SetDelta(myIsDelta);
295       anAtt->SetID(myID);
296     }
297   }
298 }
299
300 //=======================================================================
301 //function : Dump
302 //purpose  : 
303 //=======================================================================
304
305 Standard_OStream& TDataStd_IntegerArray::Dump (Standard_OStream& anOS) const
306 {  
307   anOS << "\nIntegerArray:: " << this <<" :";
308   if(!myValue.IsNull()) {
309     Standard_Integer i, lower, upper;
310     lower = myValue->Lower();
311     upper = myValue->Upper();
312     for(i = lower; i<=upper; i++)
313       anOS << " " <<myValue->Value(i);
314   }
315   anOS << " Delta is " << (myIsDelta ? "ON":"OFF");
316   Standard_Character sguid[Standard_GUID_SIZE_ALLOC];
317   myID.ToCString(sguid);
318   anOS << sguid;
319   anOS << endl;
320
321   // anOS <<"\nAttribute fields: ";
322   //  anOS << TDF_Attribute::Dump(anOS);
323
324   return anOS;
325 }
326
327 //=======================================================================
328 //function : DeltaOnModification
329 //purpose  : 
330 //=======================================================================
331
332 Handle(TDF_DeltaOnModification) TDataStd_IntegerArray::DeltaOnModification
333 (const Handle(TDF_Attribute)& OldAttribute) const
334 {
335   if(myIsDelta)
336     return new TDataStd_DeltaOnModificationOfIntArray(Handle(TDataStd_IntegerArray)::DownCast (OldAttribute));
337   else return new TDF_DefaultDeltaOnModification(OldAttribute);
338 }