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

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