0027970: Improvement of standard attributes usability - containers.
[occt.git] / src / TDataStd / TDataStd_IntegerList.cxx
1 // Created on: 2007-05-29
2 // Created by: Vlad Romashko
3 // Copyright (c) 2007-2014 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
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.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
15
16
17 #include <Standard_GUID.hxx>
18 #include <Standard_Type.hxx>
19 #include <TColStd_ListIteratorOfListOfInteger.hxx>
20 #include <TDataStd_IntegerList.hxx>
21 #include <TDF_Attribute.hxx>
22 #include <TDF_Label.hxx>
23 #include <TDF_RelocationTable.hxx>
24
25 IMPLEMENT_STANDARD_RTTIEXT(TDataStd_IntegerList,TDF_Attribute)
26
27 //=======================================================================
28 //function : GetID
29 //purpose  : 
30 //=======================================================================
31 const Standard_GUID& TDataStd_IntegerList::GetID() 
32
33   static Standard_GUID TDataStd_IntegerListID ("E406AA18-FF3F-483b-9A78-1A5EA5D1AA52");
34   return TDataStd_IntegerListID; 
35 }
36
37 //=======================================================================
38 //function : SetAttr
39 //purpose  : Implements Set functionality
40 //=======================================================================
41 static Handle(TDataStd_IntegerList) SetAttr(const TDF_Label&       label,
42                                             const Standard_GUID&   theGuid) 
43 {
44   Handle(TDataStd_IntegerList) A;
45   if (!label.FindAttribute (theGuid, A)) 
46   {
47     A = new TDataStd_IntegerList;
48     A->SetID(theGuid);
49     label.AddAttribute(A);
50   }
51   return A;
52 }
53
54 //=======================================================================
55 //function : TDataStd_IntegerList
56 //purpose  : Empty Constructor
57 //=======================================================================
58 TDataStd_IntegerList::TDataStd_IntegerList() 
59 {
60
61 }
62
63 //=======================================================================
64 //function : Set
65 //purpose  : 
66 //=======================================================================
67 Handle(TDataStd_IntegerList) TDataStd_IntegerList::Set(const TDF_Label& label) 
68 {
69   return SetAttr(label, GetID());
70 }
71
72 //=======================================================================
73 //function : Set
74 //purpose  : Set user defined attribute with specific ID
75 //=======================================================================
76 Handle(TDataStd_IntegerList) TDataStd_IntegerList::Set(const TDF_Label& label,
77                                                        const Standard_GUID& theGuid) 
78 {
79   return SetAttr(label, theGuid);
80 }
81
82 //=======================================================================
83 //function : IsEmpty
84 //purpose  : 
85 //=======================================================================
86 Standard_Boolean TDataStd_IntegerList::IsEmpty() const
87 {
88   return myList.IsEmpty();
89 }
90
91 //=======================================================================
92 //function : Extent
93 //purpose  : 
94 //=======================================================================
95 Standard_Integer TDataStd_IntegerList::Extent() const
96 {
97   return myList.Extent();
98 }
99
100 //=======================================================================
101 //function : Prepend
102 //purpose  : 
103 //=======================================================================
104 void TDataStd_IntegerList::Prepend(const Standard_Integer value)
105 {
106   Backup();
107   myList.Prepend(value);
108 }
109
110 //=======================================================================
111 //function : Append
112 //purpose  : 
113 //=======================================================================
114 void TDataStd_IntegerList::Append(const Standard_Integer value)
115 {
116   Backup();
117   myList.Append(value);
118 }
119
120 //=======================================================================
121 //function : InsertBefore
122 //purpose  : 
123 //=======================================================================
124 Standard_Boolean TDataStd_IntegerList::InsertBefore(const Standard_Integer value,
125                                                     const Standard_Integer before_value)
126 {
127   TColStd_ListIteratorOfListOfInteger itr(myList);
128   for (; itr.More(); itr.Next())
129   {
130     if (itr.Value() == before_value)
131     {
132       Backup();
133       myList.InsertBefore(value, itr);
134       return Standard_True;
135     }
136   }
137   return Standard_False;
138 }
139
140 // Inserts the <value> before the <index> position.
141 // The indices start with 1 .. Extent().
142 Standard_Boolean TDataStd_IntegerList::InsertBeforeByIndex (const Standard_Integer index,
143                                                             const Standard_Integer before_value)
144 {
145   Standard_Integer i(1);
146   Standard_Boolean found(Standard_False);
147   TColStd_ListIteratorOfListOfInteger itr(myList);
148   for (; itr.More(); itr.Next(), ++i)
149   {
150     if (i == index)
151     {
152       Backup();
153       myList.InsertBefore(before_value, itr);
154       found = Standard_True;
155       break;
156     }
157   }
158   return found;
159 }
160
161 //=======================================================================
162 //function : InsertAfter
163 //purpose  : 
164 //=======================================================================
165 Standard_Boolean TDataStd_IntegerList::InsertAfter(const Standard_Integer value,
166                                                    const Standard_Integer after_value)
167 {
168   TColStd_ListIteratorOfListOfInteger itr(myList);
169   for (; itr.More(); itr.Next())
170   {
171     if (itr.Value() == after_value)
172     {
173       Backup();
174       myList.InsertAfter(value, itr);
175       return Standard_True;
176     }
177   }
178   return Standard_False;
179 }
180   
181 // Inserts the <value> after the <index> position.
182 // The indices start with 1 .. Extent().
183 Standard_Boolean TDataStd_IntegerList::InsertAfterByIndex (const Standard_Integer index,
184                                                            const Standard_Integer after_value)
185 {
186   Standard_Integer i(1);
187   Standard_Boolean found(Standard_False);
188   TColStd_ListIteratorOfListOfInteger itr(myList);
189   for (; itr.More(); itr.Next(), ++i)
190   {
191     if (i == index)
192     {
193       Backup();
194       myList.InsertAfter(after_value, itr);
195       found = Standard_True;
196       break;
197     }
198   }
199   return found;
200 }
201
202 //=======================================================================
203 //function : Remove
204 //purpose  : 
205 //=======================================================================
206 Standard_Boolean TDataStd_IntegerList::Remove(const Standard_Integer value)
207 {
208   TColStd_ListIteratorOfListOfInteger itr(myList);
209   for (; itr.More(); itr.Next())
210   {
211     if (itr.Value() == value)
212     {
213       Backup();
214       myList.Remove(itr);
215       return Standard_True;
216     }
217   }
218   return Standard_False;
219 }
220
221 //=======================================================================
222 //function : Remove
223 //purpose  : Removes the <value> at the <index> position.
224 //=======================================================================
225 Standard_Boolean TDataStd_IntegerList::RemoveByIndex (const Standard_Integer index)
226 {
227   Standard_Integer i(1);
228   Standard_Boolean found(Standard_False);
229   TColStd_ListIteratorOfListOfInteger itr(myList);
230   for (; itr.More(); itr.Next(), ++i)
231   {
232     if (i == index)
233     {
234       Backup();
235       myList.Remove(itr);
236       found = Standard_True;
237       break;
238     }
239   }
240   return found;
241 }
242
243 //=======================================================================
244 //function : Clear
245 //purpose  : 
246 //=======================================================================
247 void TDataStd_IntegerList::Clear()
248 {
249   Backup();
250   myList.Clear();
251 }
252
253 //=======================================================================
254 //function : First
255 //purpose  : 
256 //=======================================================================
257 Standard_Integer TDataStd_IntegerList::First() const
258 {
259   return myList.First();
260 }
261
262 //=======================================================================
263 //function : Last
264 //purpose  : 
265 //=======================================================================
266 Standard_Integer TDataStd_IntegerList::Last() const
267 {
268   return myList.Last();
269 }
270
271 //=======================================================================
272 //function : List
273 //purpose  : 
274 //=======================================================================
275 const TColStd_ListOfInteger& TDataStd_IntegerList::List() const
276 {
277   return myList;
278 }
279
280 //=======================================================================
281 //function : ID
282 //purpose  : 
283 //=======================================================================
284 const Standard_GUID& TDataStd_IntegerList::ID () const 
285
286   return myID; 
287 }
288
289 //=======================================================================
290 //function : SetID
291 //purpose  :
292 //=======================================================================
293
294 void TDataStd_IntegerList::SetID( const Standard_GUID&  theGuid)
295 {  
296   if(myID == theGuid) return;
297   Backup();
298   myID = theGuid;
299 }
300
301 //=======================================================================
302 //function : SetID
303 //purpose  : sets default ID
304 //=======================================================================
305
306 void TDataStd_IntegerList::SetID()
307 {  
308   Backup();
309   myID = GetID();
310 }
311
312 //=======================================================================
313 //function : NewEmpty
314 //purpose  : 
315 //=======================================================================
316 Handle(TDF_Attribute) TDataStd_IntegerList::NewEmpty () const
317 {  
318   return new TDataStd_IntegerList(); 
319 }
320
321 //=======================================================================
322 //function : Restore
323 //purpose  : 
324 //=======================================================================
325 void TDataStd_IntegerList::Restore(const Handle(TDF_Attribute)& With) 
326 {
327   myList.Clear();
328   Handle(TDataStd_IntegerList) aList = Handle(TDataStd_IntegerList)::DownCast(With);
329   TColStd_ListIteratorOfListOfInteger itr(aList->List());
330   for (; itr.More(); itr.Next())
331   {
332     myList.Append(itr.Value());
333   }
334   myID = aList->ID();
335 }
336
337 //=======================================================================
338 //function : Paste
339 //purpose  : 
340 //=======================================================================
341 void TDataStd_IntegerList::Paste (const Handle(TDF_Attribute)& Into,
342                                   const Handle(TDF_RelocationTable)& ) const
343 {
344   Handle(TDataStd_IntegerList) aList = Handle(TDataStd_IntegerList)::DownCast(Into);
345   aList->Clear();
346   TColStd_ListIteratorOfListOfInteger itr(myList);
347   for (; itr.More(); itr.Next())
348   {
349     aList->Append(itr.Value());
350   }
351   aList->SetID(myID);
352 }
353
354 //=======================================================================
355 //function : Dump
356 //purpose  : 
357 //=======================================================================
358 Standard_OStream& TDataStd_IntegerList::Dump (Standard_OStream& anOS) const
359 {  
360   anOS << "\nIntegerList: ";
361   Standard_Character sguid[Standard_GUID_SIZE_ALLOC];
362   myID.ToCString(sguid);
363   anOS << sguid;
364   anOS << endl;
365   return anOS;
366 }