0024023: Revamp the OCCT Handle -- downcast (automatic)
[occt.git] / src / TDataStd / TDataStd_IntegerArray.cxx
CommitLineData
b311480e 1// Created on: 1999-06-16
2// Created by: Sergey RUIN
3// Copyright (c) 1999-1999 Matra Datavision
973c2be1 4// Copyright (c) 1999-2014 OPEN CASCADE SAS
b311480e 5//
973c2be1 6// This file is part of Open CASCADE Technology software library.
b311480e 7//
d5f74e42 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
973c2be1 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.
b311480e 13//
973c2be1 14// Alternatively, this file may be used under the terms of Open CASCADE
15// commercial license or contractual agreement.
7fd59977 16
17#include <TDataStd_IntegerArray.ixx>
18#include <TDataStd_DeltaOnModificationOfIntArray.hxx>
19#include <TDF_DefaultDeltaOnModification.hxx>
7fd59977 20
21//=======================================================================
22//function : GetID
23//purpose :
24//=======================================================================
25
26const 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
38TDataStd_IntegerArray::TDataStd_IntegerArray()
39 :myIsDelta(Standard_False) {}
40
41//=======================================================================
42//function : Init
43//purpose :
44//=======================================================================
45
46void TDataStd_IntegerArray::Init(const Standard_Integer lower,
47 const Standard_Integer upper)
48{
7fd59977 49 Backup();
7fd59977 50 myValue = new TColStd_HArray1OfInteger(lower, upper, 0);
51}
52
53//=======================================================================
54//function : Set
55//purpose : isDelta applicable only for new attributes
56//=======================================================================
57
58Handle(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
84void TDataStd_IntegerArray::SetValue(const Standard_Integer index, const Standard_Integer value)
85{
86 if(myValue.IsNull()) return;
87 if( myValue->Value(index) == value)
fa13a85d 88 return;
7fd59977 89 Backup();
90 myValue->SetValue(index, value);
91}
92
93
94//=======================================================================
95//function : GetValue
96//purpose :
97//=======================================================================
98
99Standard_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//=======================================================================
111Standard_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//=======================================================================
122Standard_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//=======================================================================
133Standard_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
147void 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;
a855b7eb
S
154
155 if(Lower() == aLower && Upper() == anUpper ) {
7fd59977 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 }
7fd59977 169
170 Backup();
171// Handles of myValue of current and backuped attributes will be different!
a855b7eb 172 if(myValue.IsNull() || !aDimEqual)
7fd59977 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
185const Standard_GUID& TDataStd_IntegerArray::ID () const { return GetID(); }
186
187
188//=======================================================================
189//function : NewEmpty
190//purpose :
191//=======================================================================
192
193Handle(TDF_Attribute) TDataStd_IntegerArray::NewEmpty () const
194{
195 return new TDataStd_IntegerArray();
196}
197
198//=======================================================================
199//function : Restore
200//purpose :
201//=======================================================================
202
203void 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
224void 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
242Standard_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 }
eb901da6 252 anOS << " Delta is " << (myIsDelta ? "ON":"OFF");
7fd59977 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
266Handle(TDF_DeltaOnModification) TDataStd_IntegerArray::DeltaOnModification
267(const Handle(TDF_Attribute)& OldAttribute) const
268{
269 if(myIsDelta)
c5f3a425 270 return new TDataStd_DeltaOnModificationOfIntArray(Handle(TDataStd_IntegerArray)::DownCast (OldAttribute));
7fd59977 271 else return new TDF_DefaultDeltaOnModification(OldAttribute);
272}
273
274