1 // File: TDataStd_ReferenceArray.cxx
2 // Created: May 29 11:40:00 2007
3 // Author: Vlad Romashko
4 // <vladislav.romashko@opencascade.com>
5 // Copyright: Open CASCADE
7 #include <TDataStd_ReferenceArray.ixx>
9 //=======================================================================
12 //=======================================================================
13 const Standard_GUID& TDataStd_ReferenceArray::GetID()
15 static Standard_GUID TDataStd_ReferenceArrayID ("7EE745A6-BB50-446c-BB0B-C195B23AB5CA");
16 return TDataStd_ReferenceArrayID;
19 //=======================================================================
20 //function : TDataStd_ReferenceArray
21 //purpose : Empty Constructor
22 //=======================================================================
23 TDataStd_ReferenceArray::TDataStd_ReferenceArray()
28 //=======================================================================
31 //=======================================================================
32 void TDataStd_ReferenceArray::Init(const Standard_Integer lower,
33 const Standard_Integer upper)
35 Standard_RangeError_Raise_if(upper < lower,"TDataStd_ReferenceArray::Init");
37 myArray = new TDataStd_HLabelArray1(lower, upper);
40 //=======================================================================
43 //=======================================================================
44 Handle(TDataStd_ReferenceArray) TDataStd_ReferenceArray::Set(const TDF_Label& label,
45 const Standard_Integer lower,
46 const Standard_Integer upper)
48 Handle(TDataStd_ReferenceArray) A;
49 if (!label.FindAttribute (TDataStd_ReferenceArray::GetID(), A))
51 A = new TDataStd_ReferenceArray;
52 A->Init (lower, upper);
53 label.AddAttribute(A);
55 else if (lower != A->Lower() || upper != A->Upper())
57 A->Init(lower, upper);
62 //=======================================================================
65 //=======================================================================
66 void TDataStd_ReferenceArray::SetValue (const Standard_Integer index,
67 const TDF_Label& value)
69 if (value == myArray->Value(index))
74 myArray->SetValue(index, value);
77 //=======================================================================
80 //=======================================================================
81 TDF_Label TDataStd_ReferenceArray::Value (const Standard_Integer index) const
83 return myArray->Value(index);
86 //=======================================================================
89 //=======================================================================
90 Standard_Integer TDataStd_ReferenceArray::Lower () const
94 return myArray->Lower();
97 //=======================================================================
100 //=======================================================================
101 Standard_Integer TDataStd_ReferenceArray::Upper () const
103 if (myArray.IsNull())
105 return myArray->Upper();
108 //=======================================================================
111 //=======================================================================
112 Standard_Integer TDataStd_ReferenceArray::Length () const
114 if (myArray.IsNull())
116 return myArray->Length();
119 //=======================================================================
120 //function : InternalArray
122 //=======================================================================
123 const Handle(TDataStd_HLabelArray1)& TDataStd_ReferenceArray::InternalArray () const
128 //=======================================================================
129 //function : SetInternalArray
131 //=======================================================================
132 void TDataStd_ReferenceArray::SetInternalArray (const Handle(TDataStd_HLabelArray1)& values,
133 const Standard_Boolean isCheckItem)
136 Standard_Integer aLower = values->Lower();
137 Standard_Integer anUpper = values->Upper();
138 Standard_Boolean aDimEqual = Standard_False;
142 if (Lower() == aLower && Upper() == anUpper ) {
143 aDimEqual = Standard_True;
144 Standard_Boolean isEqual = Standard_True;
146 for(i = aLower; i <= anUpper; i++) {
147 if(myArray->Value(i) != values->Value(i)) {
148 isEqual = Standard_False;
160 if(myArray.IsNull() || !aDimEqual)
161 myArray = new TDataStd_HLabelArray1(aLower, anUpper);
163 for(i = aLower; i <= anUpper; i++)
164 myArray->SetValue(i, values->Value(i));
167 //=======================================================================
170 //=======================================================================
171 const Standard_GUID& TDataStd_ReferenceArray::ID () const
176 //=======================================================================
177 //function : NewEmpty
179 //=======================================================================
180 Handle(TDF_Attribute) TDataStd_ReferenceArray::NewEmpty () const
182 return new TDataStd_ReferenceArray();
185 //=======================================================================
188 //=======================================================================
189 void TDataStd_ReferenceArray::Restore(const Handle(TDF_Attribute)& With)
191 Handle(TDataStd_ReferenceArray) anArray = Handle(TDataStd_ReferenceArray)::DownCast(With);
192 if (!anArray->myArray.IsNull())
194 const TDataStd_LabelArray1& arr = anArray->myArray->Array1();
195 Standard_Integer lower = arr.Lower(), i = lower, upper = arr.Upper();
197 for (; i <= upper; i++)
199 myArray->SetValue(i, arr.Value(i));
208 //=======================================================================
211 //=======================================================================
212 void TDataStd_ReferenceArray::Paste (const Handle(TDF_Attribute)& Into,
213 const Handle(TDF_RelocationTable)& RT) const
215 Handle(TDataStd_ReferenceArray) anArray = Handle(TDataStd_ReferenceArray)::DownCast(Into);
216 if (myArray.IsNull())
218 anArray->myArray.Nullify();
221 const TDataStd_LabelArray1& arr = myArray->Array1();
222 Standard_Integer lower = arr.Lower(), i = lower, upper = arr.Upper();
223 if (lower != anArray->Lower() || upper != anArray->Upper())
224 anArray->Init(lower, upper);
225 for (; i <= upper; i++)
227 TDF_Label L = arr.Value(i), rL;
230 if (!RT->HasRelocation(L, rL))
232 anArray->myArray->SetValue(i, rL);
237 //=======================================================================
238 //function : References
239 //purpose : Adds the referenced attributes or labels.
240 //=======================================================================
241 void TDataStd_ReferenceArray::References(const Handle(TDF_DataSet)& aDataSet) const
243 if (!Label().IsImported() && !myArray.IsNull())
245 const TDataStd_LabelArray1& arr = myArray->Array1();
246 Standard_Integer lower = arr.Lower(), i = lower, upper = arr.Upper();
247 for (; i <= upper; i++)
249 if (!arr.Value(i).IsNull())
250 aDataSet->AddLabel(arr.Value(i));
255 //=======================================================================
258 //=======================================================================
259 Standard_OStream& TDataStd_ReferenceArray::Dump (Standard_OStream& anOS) const
261 anOS << "ReferenceArray";