1 // Created on: 2002-01-16
2 // Created by: Michael PONIKAROV
3 // Copyright (c) 2002-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.
16 #include <TDataStd_ExtStringArray.ixx>
17 #include <TDataStd_DeltaOnModificationOfExtStringArray.hxx>
18 #include <TDF_DefaultDeltaOnModification.hxx>
20 //=======================================================================
23 //=======================================================================
25 const Standard_GUID& TDataStd_ExtStringArray::GetID()
27 static Standard_GUID anExtStringArrayID ("2a96b624-ec8b-11d0-bee7-080009dc3333");
28 return anExtStringArrayID;
32 //=======================================================================
33 //function : TDataStd_ExtStringArray::TDataStd_ExtStringArray
35 //=======================================================================
37 TDataStd_ExtStringArray::TDataStd_ExtStringArray()
38 : myIsDelta(Standard_False){}
40 //=======================================================================
43 //=======================================================================
45 void TDataStd_ExtStringArray::Init(const Standard_Integer lower,
46 const Standard_Integer upper)
49 myValue = new TColStd_HArray1OfExtendedString(lower, upper, "");
52 //=======================================================================
55 //=======================================================================
57 Handle(TDataStd_ExtStringArray) TDataStd_ExtStringArray::Set (
58 const TDF_Label& label,
59 const Standard_Integer lower,
60 const Standard_Integer upper,
61 const Standard_Boolean isDelta)
64 Handle(TDataStd_ExtStringArray) A;
65 if (!label.FindAttribute (TDataStd_ExtStringArray::GetID(), A)) {
66 A = new TDataStd_ExtStringArray;
67 A->Init (lower, upper);
69 label.AddAttribute(A);
71 else if (lower != A->Lower() || upper != A->Upper())
73 A->Init (lower, upper);
79 //=======================================================================
82 //=======================================================================
84 void TDataStd_ExtStringArray::SetValue(const Standard_Integer index, const TCollection_ExtendedString& value)
86 if(myValue.IsNull()) return;
87 if( myValue->Value(index) == value)
91 myValue->SetValue(index, value);
95 //=======================================================================
98 //=======================================================================
100 const TCollection_ExtendedString& TDataStd_ExtStringArray::Value (const Standard_Integer index) const
102 if (myValue.IsNull())
104 static TCollection_ExtendedString staticEmptyValue;
105 return staticEmptyValue;
107 return myValue->Value(index);
110 //=======================================================================
113 //=======================================================================
114 Standard_Integer TDataStd_ExtStringArray::Lower (void) const
116 if(myValue.IsNull()) return 0;
117 return myValue->Lower();
121 //=======================================================================
124 //=======================================================================
125 Standard_Integer TDataStd_ExtStringArray::Upper (void) const
127 if(myValue.IsNull()) return 0;
128 return myValue->Upper();
132 //=======================================================================
135 //=======================================================================
136 Standard_Integer TDataStd_ExtStringArray::Length (void) const
138 if(myValue.IsNull()) return 0;
139 return myValue->Length();
144 //=======================================================================
145 //function : ChangeArray
146 //purpose : If value of <newArray> differs from <myValue>, Backup
147 // : performed and myValue refers to new instance of HArray1OfExtendedString
148 // : that holds <newArray>
149 //=======================================================================
151 void TDataStd_ExtStringArray::ChangeArray(const Handle(TColStd_HArray1OfExtendedString)& newArray,
152 const Standard_Boolean isCheckItems)
154 Standard_Integer aLower = newArray->Lower();
155 Standard_Integer anUpper = newArray->Upper();
156 Standard_Boolean aDimEqual = Standard_False;
159 if (Lower() == aLower && Upper() == anUpper ) {
160 aDimEqual = Standard_True;
161 Standard_Boolean isEqual = Standard_True;
163 for(i = aLower; i <= anUpper; i++) {
164 if(myValue->Value(i) != newArray->Value(i)) {
165 isEqual = Standard_False;
176 // Handles of myValue of current and backuped attributes will be different!!!
177 if(myValue.IsNull() || !aDimEqual)
178 myValue = new TColStd_HArray1OfExtendedString(aLower, anUpper);
180 for(i = aLower; i <= anUpper; i++)
181 myValue->SetValue(i, newArray->Value(i));
184 //=======================================================================
187 //=======================================================================
189 const Standard_GUID& TDataStd_ExtStringArray::ID () const { return GetID(); }
192 //=======================================================================
193 //function : NewEmpty
195 //=======================================================================
197 Handle(TDF_Attribute) TDataStd_ExtStringArray::NewEmpty () const
199 return new TDataStd_ExtStringArray();
202 //=======================================================================
205 //=======================================================================
207 void TDataStd_ExtStringArray::Restore(const Handle(TDF_Attribute)& With)
209 Standard_Integer i, lower, upper;
210 Handle(TDataStd_ExtStringArray) anArray = Handle(TDataStd_ExtStringArray)::DownCast(With);
211 if(!anArray->myValue.IsNull()) {
212 lower = anArray->Lower();
213 upper = anArray->Upper();
214 myValue = new TColStd_HArray1OfExtendedString(lower, upper);
215 for(i = lower; i<=upper; i++)
216 myValue->SetValue(i, anArray->Value(i));
217 myIsDelta = anArray->myIsDelta;
223 //=======================================================================
226 //=======================================================================
228 void TDataStd_ExtStringArray::Paste (const Handle(TDF_Attribute)& Into,
229 const Handle(TDF_RelocationTable)& ) const
231 if(!myValue.IsNull()) {
232 Handle(TDataStd_ExtStringArray) anAtt = Handle(TDataStd_ExtStringArray)::DownCast(Into);
233 if(!anAtt.IsNull()) {
234 anAtt->ChangeArray( myValue, Standard_False );
235 anAtt->SetDelta(myIsDelta);
240 //=======================================================================
243 //=======================================================================
245 Standard_OStream& TDataStd_ExtStringArray::Dump (Standard_OStream& anOS) const
247 anOS << "ExtStringArray :";
248 if(!myValue.IsNull()) {
249 Standard_Integer i, lower, upper;
250 lower = myValue->Lower();
251 upper = myValue->Upper();
252 for(i = lower; i<=upper; i++)
253 anOS << "\t" <<myValue->Value(i)<<endl;
255 anOS << " Delta is " << (myIsDelta ? "ON":"OFF");
260 //=======================================================================
261 //function : DeltaOnModification
263 //=======================================================================
265 Handle(TDF_DeltaOnModification) TDataStd_ExtStringArray::DeltaOnModification
266 (const Handle(TDF_Attribute)& OldAttribute) const
269 return new TDataStd_DeltaOnModificationOfExtStringArray(*((Handle(TDataStd_ExtStringArray)*)&OldAttribute));
270 else return new TDF_DefaultDeltaOnModification(OldAttribute);