0025000: Missing implementation of method NCollection_SparseArrayBase::changeValue()
[occt.git] / src / NCollection / NCollection_SparseArray.hxx
1 // Created on: 2006-11-23
2 // Created by: Andrey BETENEV
3 // Copyright (c) 2006-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 #ifndef NCollection_SparseArray_HeaderFile
17 #define NCollection_SparseArray_HeaderFile
18
19 #include <NCollection_SparseArrayBase.hxx>
20
21 /**
22 * Dynamically resizable sparse array of objects
23 *
24 * This class is similar to NCollection_Vector: it works like virtually
25 * unlimited array of items accessible by index; however unlike simple
26 * Vector it distinguishes items that have been set from the ones that
27 * have not been set explicitly.
28 *
29 * This class can be also seen as equivalence of
30 * NCollection_DataMap<Standard_Integer,TheItemType>
31 * with the only one practical difference: it can be much less 
32 * memory-expensive if items are small (e.g. Integer or Handle).
33
34 * The index starts from 0, i.e. should be non-negative. Memory is allocated
35 * when item is set by SetValue(). 
36 *
37 * Iterator returns only defined items; 
38 * the item can be tested for being defined by IsSet(), 
39 * and undefined by UnsetValue().
40 *
41 * The attempt to access the item that has not been set will result
42 * in OutOfRange exception in Debug mode; in Release mode this will either
43 * return null-filled object or cause access violation.
44 */
45
46 template <class TheItemType> class NCollection_SparseArray 
47                                  : public NCollection_SparseArrayBase
48 {
49 public:
50
51   //! Constructor; accepts size of blocks 
52   NCollection_SparseArray (Standard_Size theIncrement)
53     : NCollection_SparseArrayBase(sizeof(TheItemType),theIncrement)
54   { 
55   }
56
57   //! Explicit assignment operator
58   NCollection_SparseArray& Assign (const NCollection_SparseArray& theOther) 
59   {
60     this->assign (theOther);
61     return *this;
62   }
63
64   //! Exchange the data of two arrays;
65   //! can be used primarily to move contents of theOther into the new array
66   //! in a fast way (without creation of duplicated data)
67   void Exchange (NCollection_SparseArray& theOther) 
68   {
69     this->exchange (theOther);
70   }
71
72   //! Destructor
73   virtual ~NCollection_SparseArray ()
74   {
75     Clear();
76   }
77
78 public:
79   //!@name Array-like interface (in addition to inherited methods)
80   //!@{
81
82   //! Direct const access to the item 
83   const TheItemType& Value (const Standard_Size theIndex) const 
84   {
85     return *(const TheItemType*)this->getValue(theIndex);
86   }
87
88   //! Const access to the item - operator()
89   const TheItemType& operator () (const Standard_Size theIndex) const
90   { 
91     return Value (theIndex); 
92   }
93
94   //! Modification access to the item
95   TheItemType& ChangeValue (const Standard_Size theIndex) 
96   {
97     return *(TheItemType*)(this->getValue (theIndex));
98   }
99
100   //! Access to the item - operator()
101   TheItemType& operator () (const Standard_Size theIndex)
102   { 
103     return ChangeValue (theIndex); 
104   }
105   
106   //! Set a value at specified index method
107   TheItemType& SetValue (const Standard_Size theIndex,
108                          const TheItemType&     theValue) 
109   {
110     return *(TheItemType*)this->setValue(theIndex, (Standard_Address)&theValue);
111   }
112
113   //!@}
114   
115 public:
116   //!@name DataMap-like interface
117   //!@{
118
119   //! Returns number of items in the array
120   Standard_Size Extent () const 
121   {
122     return Size();
123   }
124
125   //! Returns True if array is empty
126   Standard_Boolean IsEmpty () const 
127   {
128     return Size() == 0;
129   }
130
131   //! Direct const access to the item 
132   const TheItemType& Find (const Standard_Size theIndex) const 
133   {
134     return Value(theIndex);
135   }
136
137   //! Modification access to the item
138   TheItemType& ChangeFind (const Standard_Size theIndex) 
139   {
140     return ChangeValue(theIndex);
141   }
142
143   //! Set a value as explicit method
144   TheItemType& Bind (const Standard_Size theIndex,
145                      const TheItemType&     theValue) 
146   {
147     return SetValue(theIndex, theValue);
148   }
149   
150   //! Returns True if the item is defined
151   Standard_Boolean IsBound (const Standard_Size theIndex) const
152   {
153     return this->HasValue(theIndex);
154   }
155   
156   //! Remove the item from array
157   Standard_Boolean UnBind (const Standard_Size theIndex) 
158   {
159     return this->UnsetValue(theIndex);
160   }
161   
162   //!@}
163
164 public:
165   // Iterator interface
166
167   /**
168    * Implementation of type-specific const Iterator class
169    */
170   class ConstIterator : public NCollection_SparseArrayBase::Iterator
171   {
172   public:
173
174     //! Empty constructor - for later Init
175     ConstIterator () {}
176
177     //! Constructor with initialisation
178     ConstIterator (const NCollection_SparseArray& theVector) :
179       NCollection_SparseArrayBase::Iterator (&theVector) {}
180
181     //! Initialisation
182     void Init (const NCollection_SparseArray& theVector) 
183     { 
184       this->init (&theVector); 
185     } 
186
187     //! Constant value access
188     const TheItemType& Value (void) const
189     {
190       return *(const TheItemType*)this->value(); 
191     }
192
193     //! Constant value access operator
194     const TheItemType& operator () (void) const
195     {
196       return *(const TheItemType*)this->value(); 
197     }
198
199     //! Access current index with 'a-la map' interface
200     Standard_Size Key (void) const { return Index(); }
201   };
202
203   /**
204    * Implementation of type-specific non-const Iterator class
205    */
206   class Iterator : public ConstIterator
207   {
208   public:
209
210     //! Empty constructor - for later Init
211     Iterator () {}
212
213     //! Constructor with initialisation
214     Iterator (NCollection_SparseArray& theVector) :
215       ConstIterator (theVector) {}
216
217     //! Initialisation
218     void Init (const NCollection_SparseArray& theVector) 
219     { 
220       this->init (&theVector); 
221     } 
222
223     //! Value access
224     TheItemType& ChangeValue (void)
225     {
226       return *(TheItemType*)this->value(); 
227     }
228
229     //! Value access operator
230     TheItemType& operator () (void)
231     {
232       return *(TheItemType*)this->value(); 
233     }
234
235     //! Const access operator - the same as in parent class
236     const TheItemType& operator () (void) const
237     {
238       return *(const TheItemType*)this->value(); 
239     }
240   };
241
242 private:
243   // Implementation of virtual methods providing type-specific behaviour
244
245   //! Create new item at the specified address with default constructor
246 //  virtual void createItem (Standard_Address theAddress) 
247 //  {
248 //    new (theAddress) TheItemType;
249 //  }
250   
251   //! Create new item at the specified address with copy constructor
252   //! from existing item
253   virtual void createItem (Standard_Address theAddress, Standard_Address theOther)
254   {
255     new (theAddress) TheItemType(*(const TheItemType*)theOther);
256   }
257   
258   //! Call destructor to the item at given address
259   virtual void destroyItem (Standard_Address theAddress)
260   {
261     ((TheItemType*)theAddress)->TheItemType::~TheItemType();
262   }
263
264   //! Call assignment operator to the item
265   virtual void copyItem (Standard_Address theAddress, Standard_Address theOther)
266   {
267     (*(TheItemType*)theAddress) = *(const TheItemType*)theOther;
268   }
269
270 };
271
272 #endif
273