(file) Return to ArrayImpl.h CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / Common

  1 karl  1.26 //%2005////////////////////////////////////////////////////////////////////////
  2 mike  1.5  //
  3 karl  1.25 // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
  4            // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
  5            // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
  6 karl  1.24 // IBM Corp.; EMC Corporation, The Open Group.
  7 karl  1.25 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
  8            // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
  9 karl  1.26 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
 10            // EMC Corporation; VERITAS Software Corporation; The Open Group.
 11 mike  1.5  //
 12            // Permission is hereby granted, free of charge, to any person obtaining a copy
 13 kumpf 1.14 // of this software and associated documentation files (the "Software"), to
 14            // deal in the Software without restriction, including without limitation the
 15            // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 16 mike  1.5  // sell copies of the Software, and to permit persons to whom the Software is
 17            // furnished to do so, subject to the following conditions:
 18            // 
 19 kumpf 1.14 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
 20 mike  1.5  // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
 21            // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
 22 kumpf 1.14 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
 23            // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 24            // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 25 mike  1.5  // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 26            // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 27            //
 28            //==============================================================================
 29            //
 30            // Author: Mike Brasher (mbrasher@bmc.com)
 31            //
 32 kumpf 1.10 // Modified By: Roger Kumpf, Hewlett-Packard Company (roger_kumpf@hp.com)
 33 mike  1.5  //
 34            //%/////////////////////////////////////////////////////////////////////////////
 35            
 36 kumpf 1.13 // Only include if not included as general template or if explicit instantiation
 37            #if !defined(Pegasus_ArrayImpl_h) || defined(PEGASUS_ARRAY_T)
 38            #if !defined(PEGASUS_ARRAY_T)
 39            #define Pegasus_ArrayImpl_h
 40            #endif
 41            
 42            PEGASUS_NAMESPACE_END
 43            
 44            #include <Pegasus/Common/Memory.h>
 45            #include <Pegasus/Common/ArrayRep.h>
 46 kumpf 1.23 #include <Pegasus/Common/InternalException.h>
 47 kumpf 1.13 
 48            PEGASUS_NAMESPACE_BEGIN
 49 mike  1.5  
 50            #ifndef PEGASUS_ARRAY_T
 51            template<class PEGASUS_ARRAY_T>
 52            #endif
 53            Array<PEGASUS_ARRAY_T>::Array()
 54            {
 55 kumpf 1.13     _rep = ArrayRep<PEGASUS_ARRAY_T>::create(0);
 56 mike  1.5  }
 57            
 58            #ifndef PEGASUS_ARRAY_T
 59            template<class PEGASUS_ARRAY_T>
 60            #endif
 61            Array<PEGASUS_ARRAY_T>::Array(const Array<PEGASUS_ARRAY_T>& x)
 62            {
 63 kumpf 1.13     _rep = static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(x._rep)->clone();
 64 mike  1.5  }
 65            
 66            #ifndef PEGASUS_ARRAY_T
 67            template<class PEGASUS_ARRAY_T>
 68            #endif
 69            Array<PEGASUS_ARRAY_T>::Array(Uint32 size)
 70            {
 71 kumpf 1.13     _rep = ArrayRep<PEGASUS_ARRAY_T>::create(size);
 72 kumpf 1.23 
 73                if (_rep == 0)
 74                {
 75                    throw NullPointer();
 76                }
 77            
 78 kumpf 1.13     InitializeRaw(static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep)->data(), size);
 79 mike  1.5  }
 80            
 81            #ifndef PEGASUS_ARRAY_T
 82            template<class PEGASUS_ARRAY_T>
 83            #endif
 84            Array<PEGASUS_ARRAY_T>::Array(Uint32 size, const PEGASUS_ARRAY_T& x)
 85            {
 86 kumpf 1.13     _rep = ArrayRep<PEGASUS_ARRAY_T>::create(size);
 87 mike  1.5  
 88 kumpf 1.23     if (_rep == 0)
 89                {
 90                    throw NullPointer();
 91                }
 92            
 93 kumpf 1.13     PEGASUS_ARRAY_T* data = static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep)->data();
 94 mike  1.5  
 95                while (size--)
 96 kumpf 1.13         new(data++) PEGASUS_ARRAY_T(x);
 97 mike  1.5  }
 98            
 99            #ifndef PEGASUS_ARRAY_T
100            template<class PEGASUS_ARRAY_T>
101            #endif
102            Array<PEGASUS_ARRAY_T>::Array(const PEGASUS_ARRAY_T* items, Uint32 size)
103            {
104 kumpf 1.13     _rep = ArrayRep<PEGASUS_ARRAY_T>::create(size);
105 kumpf 1.23 
106                if (_rep == 0)
107                {
108                    throw NullPointer();
109                }
110            
111 kumpf 1.13     CopyToRaw(static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep)->data(), items, size);
112 mike  1.5  }
113            
114            #ifndef PEGASUS_ARRAY_T
115            template<class PEGASUS_ARRAY_T>
116            #endif
117            Array<PEGASUS_ARRAY_T>::~Array()
118            {
119 kumpf 1.13     ArrayRep<PEGASUS_ARRAY_T>::destroy(static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep));
120 mike  1.5  }
121            
122            #ifndef PEGASUS_ARRAY_T
123            template<class PEGASUS_ARRAY_T>
124            #endif
125            Array<PEGASUS_ARRAY_T>& Array<PEGASUS_ARRAY_T>::operator=(
126                const Array<PEGASUS_ARRAY_T>& x)
127            {
128 kumpf 1.13     if (static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(x._rep) !=
129                    static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep))
130 mike  1.5      {
131 kumpf 1.13         ArrayRep<PEGASUS_ARRAY_T>::destroy(static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep));
132                    _rep = static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(x._rep)->clone();
133 mike  1.5      }
134                return *this;
135            }
136            
137            #ifndef PEGASUS_ARRAY_T
138            template<class PEGASUS_ARRAY_T>
139            #endif
140            void Array<PEGASUS_ARRAY_T>::clear()
141            {
142 kumpf 1.13     ArrayRep<PEGASUS_ARRAY_T>::destroy(static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep));
143                _rep = ArrayRep<PEGASUS_ARRAY_T>::create(0);
144 mike  1.5  }
145            
146            #ifndef PEGASUS_ARRAY_T
147            template<class PEGASUS_ARRAY_T>
148            #endif
149 kumpf 1.18 void Array<PEGASUS_ARRAY_T>::reserveCapacity(Uint32 capacity)
150 mike  1.5  {
151 kumpf 1.13     if (capacity > static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep)->capacity)
152 kumpf 1.10     {
153                    Uint32 size = this->size();
154 kumpf 1.23         ArrayRep<PEGASUS_ARRAY_T>* rep =
155                        ArrayRep<PEGASUS_ARRAY_T>::create(capacity);
156            
157                    if (rep != 0)
158                    {
159                        rep->size = size;
160                        CopyToRaw(
161                            rep->data(),
162                            static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep)->data(),
163                            size);
164                        ArrayRep<PEGASUS_ARRAY_T>::destroy(
165                            static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep));
166                        _rep = rep;
167                    }
168 mike  1.5      }
169            }
170            
171            #ifndef PEGASUS_ARRAY_T
172            template<class PEGASUS_ARRAY_T>
173            #endif
174            void Array<PEGASUS_ARRAY_T>::grow(Uint32 size, const PEGASUS_ARRAY_T& x)
175            {
176 kumpf 1.13     Uint32 oldSize = static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep)->size;
177 kumpf 1.18     reserveCapacity(oldSize + size);
178 mike  1.5  
179 kumpf 1.13     PEGASUS_ARRAY_T* p = static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep)->data() + oldSize;
180 mike  1.5      Uint32 n = size;
181            
182                while (n--)
183 kumpf 1.13         new(p++) PEGASUS_ARRAY_T(x);
184 mike  1.5  
185 kumpf 1.13     static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep)->size += size;
186 mike  1.5  }
187            
188            #ifndef PEGASUS_ARRAY_T
189            template<class PEGASUS_ARRAY_T>
190            #endif
191            void Array<PEGASUS_ARRAY_T>::swap(Array<PEGASUS_ARRAY_T>& x)
192            {
193 kumpf 1.13     ArrayRep<PEGASUS_ARRAY_T>* tmp = static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep);
194                _rep = static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(x._rep);
195 mike  1.5      x._rep = tmp;
196            }
197            
198            #ifndef PEGASUS_ARRAY_T
199            template<class PEGASUS_ARRAY_T>
200            #endif
201 kumpf 1.10 Uint32 Array<PEGASUS_ARRAY_T>::size() const
202            {
203 kumpf 1.13     return static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep)->size;
204 kumpf 1.10 }
205            
206            #ifndef PEGASUS_ARRAY_T
207            template<class PEGASUS_ARRAY_T>
208            #endif
209            Uint32 Array<PEGASUS_ARRAY_T>::getCapacity() const
210            {
211 kumpf 1.13     return static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep)->capacity;
212 kumpf 1.10 }
213            
214            #ifndef PEGASUS_ARRAY_T
215            template<class PEGASUS_ARRAY_T>
216            #endif
217            const PEGASUS_ARRAY_T* Array<PEGASUS_ARRAY_T>::getData() const
218            {
219 kumpf 1.13     return static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep)->data();
220            }
221            
222            #ifndef PEGASUS_ARRAY_T
223            template<class PEGASUS_ARRAY_T>
224            #endif
225 kumpf 1.22 PEGASUS_ARRAY_T& Array<PEGASUS_ARRAY_T>::operator[](Uint32 index)
226 kumpf 1.13 {
227 kumpf 1.22     if (index >= size())
228 kumpf 1.20         throw IndexOutOfBoundsException();
229 kumpf 1.13 
230 kumpf 1.22     return static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep)->data()[index];
231 kumpf 1.13 }
232            
233            #ifndef PEGASUS_ARRAY_T
234            template<class PEGASUS_ARRAY_T>
235            #endif
236 kumpf 1.22 const PEGASUS_ARRAY_T& Array<PEGASUS_ARRAY_T>::operator[](Uint32 index) const
237 kumpf 1.13 {
238 kumpf 1.22     if (index >= size())
239 kumpf 1.20         throw IndexOutOfBoundsException();
240 kumpf 1.13 
241 kumpf 1.22     return static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep)->data()[index];
242 kumpf 1.10 }
243            
244            #ifndef PEGASUS_ARRAY_T
245            template<class PEGASUS_ARRAY_T>
246            #endif
247 mike  1.5  void Array<PEGASUS_ARRAY_T>::append(const PEGASUS_ARRAY_T& x)
248            {
249 kumpf 1.18     reserveCapacity(size() + 1);
250 mike  1.5      new (_data() + size()) PEGASUS_ARRAY_T(x);
251 kumpf 1.13     static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep)->size++;
252 mike  1.5  }
253            
254            #ifndef PEGASUS_ARRAY_T
255            template<class PEGASUS_ARRAY_T>
256            #endif
257            void Array<PEGASUS_ARRAY_T>::append(const PEGASUS_ARRAY_T* x, Uint32 size)
258            {
259 kumpf 1.18     reserveCapacity(this->size() + size);
260 mike  1.5      CopyToRaw(_data() + this->size(), x, size);
261 kumpf 1.13     static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep)->size += size;
262 mike  1.5  }
263            
264            #ifndef PEGASUS_ARRAY_T
265            template<class PEGASUS_ARRAY_T>
266            #endif
267 kumpf 1.10 void Array<PEGASUS_ARRAY_T>::appendArray(const Array<PEGASUS_ARRAY_T>& x)
268            {
269                append(x.getData(), x.size());
270            }
271            
272            #ifndef PEGASUS_ARRAY_T
273            template<class PEGASUS_ARRAY_T>
274            #endif
275 mike  1.5  void Array<PEGASUS_ARRAY_T>::prepend(const PEGASUS_ARRAY_T& x)
276            {
277 kumpf 1.12     prepend(&x, 1);
278 mike  1.5  }
279            
280            #ifndef PEGASUS_ARRAY_T
281            template<class PEGASUS_ARRAY_T>
282            #endif
283            void Array<PEGASUS_ARRAY_T>::prepend(const PEGASUS_ARRAY_T* x, Uint32 size)
284            {
285 kumpf 1.18     reserveCapacity(this->size() + size);
286 mike  1.5      memmove(_data() + size, _data(), sizeof(PEGASUS_ARRAY_T) * this->size());
287                CopyToRaw(_data(), x, size);
288 kumpf 1.13     static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep)->size += size;
289 mike  1.5  }
290            
291            #ifndef PEGASUS_ARRAY_T
292            template<class PEGASUS_ARRAY_T>
293            #endif
294 kumpf 1.22 void Array<PEGASUS_ARRAY_T>::insert(Uint32 index, const PEGASUS_ARRAY_T& x)
295 mike  1.5  {
296 kumpf 1.22     insert(index, &x, 1);
297 mike  1.5  }
298            
299            #ifndef PEGASUS_ARRAY_T
300            template<class PEGASUS_ARRAY_T>
301            #endif
302 kumpf 1.22 void Array<PEGASUS_ARRAY_T>::insert(Uint32 index, const PEGASUS_ARRAY_T* x, Uint32 size)
303 mike  1.5  {
304 kumpf 1.22     if (index > this->size())
305 kumpf 1.20         throw IndexOutOfBoundsException();
306 mike  1.5  
307 kumpf 1.18     reserveCapacity(this->size() + size);
308 mike  1.5  
309 kumpf 1.22     Uint32 n = this->size() - index;
310 mike  1.5  
311                if (n)
312 kumpf 1.22         memmove(_data() + index + size,
313                            _data() + index,
314                            sizeof(PEGASUS_ARRAY_T) * n);
315 mike  1.5  
316 kumpf 1.22     CopyToRaw(_data() + index, x, size);
317 kumpf 1.13     static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep)->size += size;
318 mike  1.5  }
319            
320            #ifndef PEGASUS_ARRAY_T
321            template<class PEGASUS_ARRAY_T>
322            #endif
323 kumpf 1.22 void Array<PEGASUS_ARRAY_T>::remove(Uint32 index)
324 mike  1.5  {
325 kumpf 1.22     remove(index, 1);
326 mike  1.5  }
327            
328            #ifndef PEGASUS_ARRAY_T
329            template<class PEGASUS_ARRAY_T>
330            #endif
331 kumpf 1.22 void Array<PEGASUS_ARRAY_T>::remove(Uint32 index, Uint32 size)
332 mike  1.5  {
333 kumpf 1.22     if (index + size - 1 > this->size())
334 kumpf 1.20         throw IndexOutOfBoundsException();
335 mike  1.5  
336 kumpf 1.22     Destroy(_data() + index, size);
337 mike  1.5  
338 kumpf 1.22     Uint32 rem = this->size() - (index + size);
339 mike  1.5  
340                if (rem)
341 kumpf 1.22         memmove(_data() + index,
342                            _data() + index + size,
343                            sizeof(PEGASUS_ARRAY_T) * rem);
344 mike  1.5  
345 kumpf 1.13     static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep)->size -= size;
346 mike  1.5  }
347 kumpf 1.10 
348            #ifndef PEGASUS_ARRAY_T
349            template<class PEGASUS_ARRAY_T>
350            #endif
351            PEGASUS_ARRAY_T* Array<PEGASUS_ARRAY_T>::_data() const
352            {
353 kumpf 1.13     return static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep)->data();
354 kumpf 1.10 }
355 mike  1.6  
356 kumpf 1.13 #endif //!defined(Pegasus_ArrayImpl_h) || !defined(PEGASUS_ARRAY_T)

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2