1 // Created on: 2007-05-29
2 // Created by: Vlad Romashko
3 // Copyright (c) 2007-2014 OPEN CASCADE SAS
5 // This file is part of Open CASCADE Technology software library.
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
17 #include <Standard_GUID.hxx>
18 #include <Standard_Type.hxx>
19 #include <TDataStd_ReferenceArray.hxx>
20 #include <TDF_Attribute.hxx>
21 #include <TDF_DataSet.hxx>
22 #include <TDF_Label.hxx>
23 #include <TDF_RelocationTable.hxx>
25 //=======================================================================
28 //=======================================================================
29 const Standard_GUID& TDataStd_ReferenceArray::GetID()
31 static Standard_GUID TDataStd_ReferenceArrayID ("7EE745A6-BB50-446c-BB0B-C195B23AB5CA");
32 return TDataStd_ReferenceArrayID;
35 //=======================================================================
36 //function : TDataStd_ReferenceArray
37 //purpose : Empty Constructor
38 //=======================================================================
39 TDataStd_ReferenceArray::TDataStd_ReferenceArray()
44 //=======================================================================
47 //=======================================================================
48 void TDataStd_ReferenceArray::Init(const Standard_Integer lower,
49 const Standard_Integer upper)
51 Standard_RangeError_Raise_if(upper < lower,"TDataStd_ReferenceArray::Init");
53 myArray = new TDataStd_HLabelArray1(lower, upper);
56 //=======================================================================
59 //=======================================================================
60 Handle(TDataStd_ReferenceArray) TDataStd_ReferenceArray::Set(const TDF_Label& label,
61 const Standard_Integer lower,
62 const Standard_Integer upper)
64 Handle(TDataStd_ReferenceArray) A;
65 if (!label.FindAttribute (TDataStd_ReferenceArray::GetID(), A))
67 A = new TDataStd_ReferenceArray;
68 A->Init (lower, upper);
69 label.AddAttribute(A);
71 else if (lower != A->Lower() || upper != A->Upper())
73 A->Init(lower, upper);
78 //=======================================================================
81 //=======================================================================
82 void TDataStd_ReferenceArray::SetValue (const Standard_Integer index,
83 const TDF_Label& value)
85 if(myArray.IsNull()) return;
86 if (value == myArray->Value(index))
90 myArray->SetValue(index, value);
93 //=======================================================================
96 //=======================================================================
97 TDF_Label TDataStd_ReferenceArray::Value (const Standard_Integer index) const
99 return myArray->Value(index);
102 //=======================================================================
105 //=======================================================================
106 Standard_Integer TDataStd_ReferenceArray::Lower () const
108 if (myArray.IsNull())
110 return myArray->Lower();
113 //=======================================================================
116 //=======================================================================
117 Standard_Integer TDataStd_ReferenceArray::Upper () const
119 if (myArray.IsNull())
121 return myArray->Upper();
124 //=======================================================================
127 //=======================================================================
128 Standard_Integer TDataStd_ReferenceArray::Length () const
130 if (myArray.IsNull())
132 return myArray->Length();
135 //=======================================================================
136 //function : InternalArray
138 //=======================================================================
139 const Handle(TDataStd_HLabelArray1)& TDataStd_ReferenceArray::InternalArray () const
144 //=======================================================================
145 //function : SetInternalArray
147 //=======================================================================
148 void TDataStd_ReferenceArray::SetInternalArray (const Handle(TDataStd_HLabelArray1)& values,
149 const Standard_Boolean)
152 Standard_Integer aLower = values->Lower();
153 Standard_Integer anUpper = values->Upper();
154 Standard_Boolean aDimEqual = Standard_False;
158 if (Lower() == aLower && Upper() == anUpper ) {
159 aDimEqual = Standard_True;
160 Standard_Boolean isEqual = Standard_True;
162 for(i = aLower; i <= anUpper; i++) {
163 if(myArray->Value(i) != values->Value(i)) {
164 isEqual = Standard_False;
176 if(myArray.IsNull() || !aDimEqual)
177 myArray = new TDataStd_HLabelArray1(aLower, anUpper);
179 for(i = aLower; i <= anUpper; i++)
180 myArray->SetValue(i, values->Value(i));
183 //=======================================================================
186 //=======================================================================
187 const Standard_GUID& TDataStd_ReferenceArray::ID () const
192 //=======================================================================
193 //function : NewEmpty
195 //=======================================================================
196 Handle(TDF_Attribute) TDataStd_ReferenceArray::NewEmpty () const
198 return new TDataStd_ReferenceArray();
201 //=======================================================================
204 //=======================================================================
205 void TDataStd_ReferenceArray::Restore(const Handle(TDF_Attribute)& With)
207 Handle(TDataStd_ReferenceArray) anArray = Handle(TDataStd_ReferenceArray)::DownCast(With);
208 if (!anArray->myArray.IsNull())
210 const TDataStd_LabelArray1& arr = anArray->myArray->Array1();
211 Standard_Integer lower = arr.Lower(), i = lower, upper = arr.Upper();
213 for (; i <= upper; i++)
215 myArray->SetValue(i, arr.Value(i));
224 //=======================================================================
227 //=======================================================================
228 void TDataStd_ReferenceArray::Paste (const Handle(TDF_Attribute)& Into,
229 const Handle(TDF_RelocationTable)& RT) const
231 Handle(TDataStd_ReferenceArray) anArray = Handle(TDataStd_ReferenceArray)::DownCast(Into);
232 if (myArray.IsNull())
234 anArray->myArray.Nullify();
237 const TDataStd_LabelArray1& arr = myArray->Array1();
238 Standard_Integer lower = arr.Lower(), i = lower, upper = arr.Upper();
239 if (lower != anArray->Lower() || upper != anArray->Upper())
240 anArray->Init(lower, upper);
241 for (; i <= upper; i++)
243 TDF_Label L = arr.Value(i), rL;
246 if (!RT->HasRelocation(L, rL))
248 anArray->myArray->SetValue(i, rL);
253 //=======================================================================
254 //function : References
255 //purpose : Adds the referenced attributes or labels.
256 //=======================================================================
257 void TDataStd_ReferenceArray::References(const Handle(TDF_DataSet)& aDataSet) const
259 if (!Label().IsImported() && !myArray.IsNull())
261 const TDataStd_LabelArray1& arr = myArray->Array1();
262 Standard_Integer lower = arr.Lower(), i = lower, upper = arr.Upper();
263 for (; i <= upper; i++)
265 if (!arr.Value(i).IsNull())
266 aDataSet->AddLabel(arr.Value(i));
271 //=======================================================================
274 //=======================================================================
275 Standard_OStream& TDataStd_ReferenceArray::Dump (Standard_OStream& anOS) const
277 anOS << "ReferenceArray";