1 // File: TDataStd_IntegerArray.cxx
2 // Created: Wed Jun 16 10:32:25 1999
6 #include <TDataStd_IntegerArray.ixx>
7 #include <TDataStd_DeltaOnModificationOfIntArray.hxx>
8 #include <TDF_DefaultDeltaOnModification.hxx>
12 //=======================================================================
15 //=======================================================================
17 const Standard_GUID& TDataStd_IntegerArray::GetID()
19 static Standard_GUID TDataStd_IntegerArrayID ("2a96b61d-ec8b-11d0-bee7-080009dc3333");
20 return TDataStd_IntegerArrayID;
24 //=======================================================================
25 //function : TDataStd_IntegerArray
26 //purpose : Empty Constructor
27 //=======================================================================
29 TDataStd_IntegerArray::TDataStd_IntegerArray()
30 :myIsDelta(Standard_False) {}
32 //=======================================================================
35 //=======================================================================
37 void TDataStd_IntegerArray::Init(const Standard_Integer lower,
38 const Standard_Integer upper)
43 myValue = new TColStd_HArray1OfInteger(lower, upper, 0);
46 //=======================================================================
48 //purpose : isDelta applicable only for new attributes
49 //=======================================================================
51 Handle(TDataStd_IntegerArray) TDataStd_IntegerArray::Set
52 (const TDF_Label& label,
53 const Standard_Integer lower,
54 const Standard_Integer upper,
55 const Standard_Boolean isDelta)
58 Handle(TDataStd_IntegerArray) A;
59 if (!label.FindAttribute (TDataStd_IntegerArray::GetID(), A)) {
60 A = new TDataStd_IntegerArray;
61 A->Init (lower, upper);
63 label.AddAttribute(A);
65 else if (lower != A->Lower() || upper != A->Upper())
67 A->Init (lower, upper);
72 //=======================================================================
75 //=======================================================================
77 void TDataStd_IntegerArray::SetValue(const Standard_Integer index, const Standard_Integer value)
79 if(myValue.IsNull()) return;
80 if( myValue->Value(index) == value)
83 myValue->SetValue(index, value);
87 //=======================================================================
90 //=======================================================================
92 Standard_Integer TDataStd_IntegerArray::Value (const Standard_Integer index) const
94 if(myValue.IsNull()) return 0;
95 return myValue->Value(index);
100 //=======================================================================
103 //=======================================================================
104 Standard_Integer TDataStd_IntegerArray::Lower (void) const
106 if(myValue.IsNull()) return 0;
107 return myValue->Lower();
111 //=======================================================================
114 //=======================================================================
115 Standard_Integer TDataStd_IntegerArray::Upper (void) const
117 if(myValue.IsNull()) return 0;
118 return myValue->Upper();
122 //=======================================================================
125 //=======================================================================
126 Standard_Integer TDataStd_IntegerArray::Length (void) const
128 if(myValue.IsNull()) return 0;
129 return myValue->Length();
133 //=======================================================================
134 //function : ChangeArray
135 //purpose : If value of <newArray> differs from <myValue>, Backup
136 // : performed and myValue refers to new instance of HArray1OfInteger
137 // : that holds <newArray>
138 //=======================================================================
140 void TDataStd_IntegerArray::ChangeArray(const Handle(TColStd_HArray1OfInteger)& newArray,
141 const Standard_Boolean isCheckItems)
143 Standard_Integer aLower = newArray->Lower();
144 Standard_Integer anUpper = newArray->Upper();
145 Standard_Boolean aDimEqual = Standard_False;
149 if(Lower() == aLower && Upper() == anUpper ) {
150 aDimEqual = Standard_True;
152 Standard_Boolean isEqual = Standard_True;
153 for(i = aLower; i <= anUpper; i++) {
154 if(myValue->Value(i) != newArray->Value(i)) {
155 isEqual = Standard_False;
166 // Handles of myValue of current and backuped attributes will be different!
167 if(myValue.IsNull() || !aDimEqual)
168 myValue = new TColStd_HArray1OfInteger(aLower, anUpper);
170 for(i = aLower; i <= anUpper; i++)
171 myValue->SetValue(i, newArray->Value(i));
175 //=======================================================================
178 //=======================================================================
180 const Standard_GUID& TDataStd_IntegerArray::ID () const { return GetID(); }
183 //=======================================================================
184 //function : NewEmpty
186 //=======================================================================
188 Handle(TDF_Attribute) TDataStd_IntegerArray::NewEmpty () const
190 return new TDataStd_IntegerArray();
193 //=======================================================================
196 //=======================================================================
198 void TDataStd_IntegerArray::Restore(const Handle(TDF_Attribute)& With)
200 Standard_Integer i, lower, upper;
201 Handle(TDataStd_IntegerArray) anArray = Handle(TDataStd_IntegerArray)::DownCast(With);
202 if(!anArray->myValue.IsNull()) {
203 lower = anArray->Lower();
204 upper = anArray->Upper();
205 myValue = new TColStd_HArray1OfInteger(lower, upper);
206 for(i = lower; i<=upper; i++)
207 myValue->SetValue(i, anArray->Value(i));
208 myIsDelta = anArray->myIsDelta;
214 //=======================================================================
217 //=======================================================================
219 void TDataStd_IntegerArray::Paste (const Handle(TDF_Attribute)& Into,
220 const Handle(TDF_RelocationTable)& ) const
223 if(!myValue.IsNull()) {
224 Handle(TDataStd_IntegerArray) anAtt = Handle(TDataStd_IntegerArray)::DownCast(Into);
225 if(!anAtt.IsNull()) {
226 anAtt->ChangeArray( myValue, Standard_False );
227 anAtt->SetDelta(myIsDelta);
232 //=======================================================================
235 //=======================================================================
237 Standard_OStream& TDataStd_IntegerArray::Dump (Standard_OStream& anOS) const
239 anOS << "\nIntegerArray:: " << this <<" :";
240 if(!myValue.IsNull()) {
241 Standard_Integer i, lower, upper;
242 lower = myValue->Lower();
243 upper = myValue->Upper();
244 for(i = lower; i<=upper; i++)
245 anOS << " " <<myValue->Value(i);
247 anOS << " Delta is " << (myIsDelta ? "ON":"OFF");
250 // anOS <<"\nAttribute fields: ";
251 // anOS << TDF_Attribute::Dump(anOS);
256 //=======================================================================
257 //function : DeltaOnModification
259 //=======================================================================
261 Handle(TDF_DeltaOnModification) TDataStd_IntegerArray::DeltaOnModification
262 (const Handle(TDF_Attribute)& OldAttribute) const
265 return new TDataStd_DeltaOnModificationOfIntArray(*((Handle(TDataStd_IntegerArray)*)&OldAttribute));
266 else return new TDF_DefaultDeltaOnModification(OldAttribute);