0024023: Revamp the OCCT Handle -- downcast (automatic)
[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 #include <TDataStd_IntegerArray.ixx>
18 #include <TDataStd_DeltaOnModificationOfIntArray.hxx>
19 #include <TDF_DefaultDeltaOnModification.hxx>
20
21 //=======================================================================
22 //function : GetID
23 //purpose  : 
24 //=======================================================================
25
26 const Standard_GUID& TDataStd_IntegerArray::GetID() 
27
28   static Standard_GUID TDataStd_IntegerArrayID ("2a96b61d-ec8b-11d0-bee7-080009dc3333");
29   return TDataStd_IntegerArrayID; 
30 }
31
32
33 //=======================================================================
34 //function : TDataStd_IntegerArray
35 //purpose  : Empty Constructor
36 //=======================================================================
37
38 TDataStd_IntegerArray::TDataStd_IntegerArray()
39      :myIsDelta(Standard_False) {}
40
41 //=======================================================================
42 //function : Init
43 //purpose  : 
44 //=======================================================================
45
46 void TDataStd_IntegerArray::Init(const Standard_Integer lower,
47                                  const Standard_Integer upper)
48 {
49   Backup();
50   myValue = new TColStd_HArray1OfInteger(lower, upper, 0);
51 }
52
53 //=======================================================================
54 //function : Set
55 //purpose  : isDelta applicable only for new attributes
56 //=======================================================================
57
58 Handle(TDataStd_IntegerArray) TDataStd_IntegerArray::Set
59                                                 (const TDF_Label&       label,
60                                                  const Standard_Integer lower,
61                                                  const Standard_Integer upper,
62                                                  const Standard_Boolean isDelta) 
63
64 {
65   Handle(TDataStd_IntegerArray) A;
66   if (!label.FindAttribute (TDataStd_IntegerArray::GetID(), A)) {
67     A = new TDataStd_IntegerArray;
68     A->Init (lower, upper);
69     A->SetDelta(isDelta);
70     label.AddAttribute(A);
71   }
72   else if (lower != A->Lower() || upper != A->Upper())
73   {
74     A->Init (lower, upper); 
75   }
76   return A;
77 }
78
79 //=======================================================================
80 //function : SetValue
81 //purpose  : 
82 //=======================================================================
83
84 void TDataStd_IntegerArray::SetValue(const Standard_Integer index, const Standard_Integer value) 
85 {
86   if(myValue.IsNull()) return;
87   if( myValue->Value(index) == value)
88     return;
89   Backup();
90   myValue->SetValue(index, value);
91 }
92
93
94 //=======================================================================
95 //function : GetValue
96 //purpose  : 
97 //=======================================================================
98
99 Standard_Integer TDataStd_IntegerArray::Value (const Standard_Integer index) const 
100 {
101   if(myValue.IsNull()) return 0;
102   return myValue->Value(index); 
103 }
104
105
106
107 //=======================================================================
108 //function : Lower
109 //purpose  : 
110 //=======================================================================
111 Standard_Integer TDataStd_IntegerArray::Lower (void) const 
112
113   if(myValue.IsNull()) return 0;
114   return myValue->Lower(); 
115 }
116
117
118 //=======================================================================
119 //function : Upper
120 //purpose  : 
121 //=======================================================================
122 Standard_Integer TDataStd_IntegerArray::Upper (void) const 
123
124   if(myValue.IsNull()) return 0; 
125   return myValue->Upper(); 
126 }
127
128
129 //=======================================================================
130 //function : Length
131 //purpose  : 
132 //=======================================================================
133 Standard_Integer TDataStd_IntegerArray::Length (void) const 
134 {
135   if(myValue.IsNull()) return 0;
136   return myValue->Length(); 
137 }
138
139
140 //=======================================================================
141 //function : ChangeArray
142 //purpose  : If value of <newArray> differs from <myValue>, Backup 
143 //         : performed and myValue refers to new instance of HArray1OfInteger 
144 //         : that holds <newArray>
145 //=======================================================================
146
147 void TDataStd_IntegerArray::ChangeArray(const Handle(TColStd_HArray1OfInteger)& newArray,
148                                         const Standard_Boolean isCheckItems) 
149 {
150   Standard_Integer aLower    = newArray->Lower();
151   Standard_Integer anUpper   = newArray->Upper();
152   Standard_Boolean aDimEqual = Standard_False;
153   Standard_Integer i;
154
155   if(Lower() == aLower && Upper() == anUpper ) {
156     aDimEqual = Standard_True;
157     if(isCheckItems) {
158       Standard_Boolean isEqual = Standard_True;
159       for(i = aLower; i <= anUpper; i++) {
160         if(myValue->Value(i) != newArray->Value(i)) {
161           isEqual = Standard_False;
162           break;
163         }
164       }
165       if(isEqual)
166         return;
167     }
168   }
169   
170   Backup();
171 // Handles of myValue of current and backuped attributes will be different!
172   if(myValue.IsNull() || !aDimEqual) 
173     myValue = new TColStd_HArray1OfInteger(aLower, anUpper);  
174
175   for(i = aLower; i <= anUpper; i++) 
176     myValue->SetValue(i, newArray->Value(i));
177 }
178
179
180 //=======================================================================
181 //function : ID
182 //purpose  : 
183 //=======================================================================
184
185 const Standard_GUID& TDataStd_IntegerArray::ID () const { return GetID(); }
186
187
188 //=======================================================================
189 //function : NewEmpty
190 //purpose  : 
191 //=======================================================================
192
193 Handle(TDF_Attribute) TDataStd_IntegerArray::NewEmpty () const
194 {  
195   return new TDataStd_IntegerArray(); 
196 }
197
198 //=======================================================================
199 //function : Restore
200 //purpose  : 
201 //=======================================================================
202
203 void TDataStd_IntegerArray::Restore(const Handle(TDF_Attribute)& With) 
204 {
205   Standard_Integer i, lower, upper;
206   Handle(TDataStd_IntegerArray) anArray = Handle(TDataStd_IntegerArray)::DownCast(With);
207   if(!anArray->myValue.IsNull()) {
208     lower = anArray->Lower();
209     upper = anArray->Upper(); 
210     myValue = new TColStd_HArray1OfInteger(lower, upper); 
211     for(i = lower; i<=upper; i++)
212       myValue->SetValue(i, anArray->Value(i));
213     myIsDelta = anArray->myIsDelta;
214   }
215   else
216     myValue.Nullify();
217 }
218
219 //=======================================================================
220 //function : Paste
221 //purpose  : 
222 //=======================================================================
223
224 void TDataStd_IntegerArray::Paste (const Handle(TDF_Attribute)& Into,
225                                    const Handle(TDF_RelocationTable)& ) const
226 {
227
228   if(!myValue.IsNull()) {
229     Handle(TDataStd_IntegerArray) anAtt = Handle(TDataStd_IntegerArray)::DownCast(Into);
230     if(!anAtt.IsNull()) {
231       anAtt->ChangeArray( myValue, Standard_False );
232       anAtt->SetDelta(myIsDelta);
233     }
234   }
235 }
236
237 //=======================================================================
238 //function : Dump
239 //purpose  : 
240 //=======================================================================
241
242 Standard_OStream& TDataStd_IntegerArray::Dump (Standard_OStream& anOS) const
243 {  
244   anOS << "\nIntegerArray:: " << this <<" :";
245   if(!myValue.IsNull()) {
246     Standard_Integer i, lower, upper;
247     lower = myValue->Lower();
248     upper = myValue->Upper();
249     for(i = lower; i<=upper; i++)
250       anOS << " " <<myValue->Value(i);
251   }
252   anOS << " Delta is " << (myIsDelta ? "ON":"OFF");
253   anOS << endl;
254
255   // anOS <<"\nAttribute fields: ";
256   //  anOS << TDF_Attribute::Dump(anOS);
257
258   return anOS;
259 }
260
261 //=======================================================================
262 //function : DeltaOnModification
263 //purpose  : 
264 //=======================================================================
265
266 Handle(TDF_DeltaOnModification) TDataStd_IntegerArray::DeltaOnModification
267 (const Handle(TDF_Attribute)& OldAttribute) const
268 {
269   if(myIsDelta)
270     return new TDataStd_DeltaOnModificationOfIntArray(Handle(TDataStd_IntegerArray)::DownCast (OldAttribute));
271   else return new TDF_DefaultDeltaOnModification(OldAttribute);
272 }
273
274