(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 //#if defined(PEGASUS_EXPLICIT_INSTANTIATION) || !defined(PEGASUS_ARRAY_T)
 31            // Only include if not included as general template or if explicit instantiation
 32            #if !defined(Pegasus_ArrayImpl_h) || defined(PEGASUS_ARRAY_T)
 33            #if !defined(PEGASUS_ARRAY_T)
 34            #define Pegasus_ArrayImpl_h
 35            #endif
 36            
 37            PEGASUS_NAMESPACE_END
 38            
 39            #include <Pegasus/Common/Memory.h>
 40            #include <Pegasus/Common/ArrayRep.h>
 41            
 42            #ifdef PEGASUS_HAS_EBCDIC
 43            #include <unistd.h>
 44            #endif
 45            
 46            PEGASUS_NAMESPACE_BEGIN
 47 mike  1.5  
 48            #ifndef PEGASUS_ARRAY_T
 49            template<class PEGASUS_ARRAY_T>
 50            #endif
 51            Array<PEGASUS_ARRAY_T>::Array()
 52            {
 53 kumpf 1.13     _rep = ArrayRep<PEGASUS_ARRAY_T>::create(0);
 54 mike  1.5  }
 55            
 56            #ifndef PEGASUS_ARRAY_T
 57            template<class PEGASUS_ARRAY_T>
 58            #endif
 59            Array<PEGASUS_ARRAY_T>::Array(const Array<PEGASUS_ARRAY_T>& x)
 60            {
 61 kumpf 1.13     _rep = static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(x._rep)->clone();
 62 mike  1.5  }
 63            
 64            #ifndef PEGASUS_ARRAY_T
 65            template<class PEGASUS_ARRAY_T>
 66            #endif
 67            Array<PEGASUS_ARRAY_T>::Array(Uint32 size)
 68            {
 69 kumpf 1.13     _rep = ArrayRep<PEGASUS_ARRAY_T>::create(size);
 70                InitializeRaw(static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep)->data(), size);
 71 mike  1.5  }
 72            
 73            #ifndef PEGASUS_ARRAY_T
 74            template<class PEGASUS_ARRAY_T>
 75            #endif
 76            Array<PEGASUS_ARRAY_T>::Array(Uint32 size, const PEGASUS_ARRAY_T& x)
 77            {
 78 kumpf 1.13     _rep = ArrayRep<PEGASUS_ARRAY_T>::create(size);
 79 mike  1.5  
 80 kumpf 1.13     PEGASUS_ARRAY_T* data = static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep)->data();
 81 mike  1.5  
 82                while (size--)
 83 kumpf 1.13         new(data++) PEGASUS_ARRAY_T(x);
 84 mike  1.5  }
 85            
 86            #ifndef PEGASUS_ARRAY_T
 87            template<class PEGASUS_ARRAY_T>
 88            #endif
 89            Array<PEGASUS_ARRAY_T>::Array(const PEGASUS_ARRAY_T* items, Uint32 size)
 90            {
 91 kumpf 1.13     _rep = ArrayRep<PEGASUS_ARRAY_T>::create(size);
 92                CopyToRaw(static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep)->data(), items, size);
 93 mike  1.5  }
 94            
 95            #ifndef PEGASUS_ARRAY_T
 96            template<class PEGASUS_ARRAY_T>
 97            #endif
 98            Array<PEGASUS_ARRAY_T>::~Array()
 99            {
100 kumpf 1.13     ArrayRep<PEGASUS_ARRAY_T>::destroy(static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep));
101 mike  1.5  }
102            
103            #ifndef PEGASUS_ARRAY_T
104            template<class PEGASUS_ARRAY_T>
105            #endif
106            Array<PEGASUS_ARRAY_T>& Array<PEGASUS_ARRAY_T>::operator=(
107                const Array<PEGASUS_ARRAY_T>& x)
108            {
109 kumpf 1.13     if (static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(x._rep) !=
110                    static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep))
111 mike  1.5      {
112 kumpf 1.13         ArrayRep<PEGASUS_ARRAY_T>::destroy(static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep));
113                    _rep = static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(x._rep)->clone();
114 mike  1.5      }
115                return *this;
116            }
117            
118            #ifndef PEGASUS_ARRAY_T
119            template<class PEGASUS_ARRAY_T>
120            #endif
121            void Array<PEGASUS_ARRAY_T>::clear()
122            {
123 kumpf 1.13     ArrayRep<PEGASUS_ARRAY_T>::destroy(static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep));
124                _rep = ArrayRep<PEGASUS_ARRAY_T>::create(0);
125 mike  1.5  }
126            
127            #ifndef PEGASUS_ARRAY_T
128            template<class PEGASUS_ARRAY_T>
129            #endif
130 kumpf 1.10 void Array<PEGASUS_ARRAY_T>::reserve(Uint32 capacity)
131 mike  1.5  {
132 kumpf 1.13     if (capacity > static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep)->capacity)
133 kumpf 1.10     {
134                    Uint32 size = this->size();
135 kumpf 1.13         ArrayRep<PEGASUS_ARRAY_T>* rep = ArrayRep<PEGASUS_ARRAY_T>::create(capacity);
136 kumpf 1.10         rep->size = size;
137 kumpf 1.13         CopyToRaw(rep->data(), static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep)->data(), size);
138                    ArrayRep<PEGASUS_ARRAY_T>::destroy(static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep));
139 kumpf 1.10         _rep = rep;
140 mike  1.5      }
141            }
142            
143            #ifndef PEGASUS_ARRAY_T
144            template<class PEGASUS_ARRAY_T>
145            #endif
146            void Array<PEGASUS_ARRAY_T>::grow(Uint32 size, const PEGASUS_ARRAY_T& x)
147            {
148 kumpf 1.13     Uint32 oldSize = static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep)->size;
149 mike  1.5      reserve(oldSize + size);
150            
151 kumpf 1.13     PEGASUS_ARRAY_T* p = static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep)->data() + oldSize;
152 mike  1.5      Uint32 n = size;
153            
154                while (n--)
155 kumpf 1.13         new(p++) PEGASUS_ARRAY_T(x);
156 mike  1.5  
157 kumpf 1.13     static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep)->size += size;
158 mike  1.5  }
159            
160            #ifndef PEGASUS_ARRAY_T
161            template<class PEGASUS_ARRAY_T>
162            #endif
163            void Array<PEGASUS_ARRAY_T>::swap(Array<PEGASUS_ARRAY_T>& x)
164            {
165 kumpf 1.13     ArrayRep<PEGASUS_ARRAY_T>* tmp = static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep);
166                _rep = static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(x._rep);
167 mike  1.5      x._rep = tmp;
168            }
169            
170            #ifndef PEGASUS_ARRAY_T
171            template<class PEGASUS_ARRAY_T>
172            #endif
173 kumpf 1.10 Uint32 Array<PEGASUS_ARRAY_T>::size() const
174            {
175 kumpf 1.13     return static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep)->size;
176 kumpf 1.10 }
177            
178            #ifndef PEGASUS_ARRAY_T
179            template<class PEGASUS_ARRAY_T>
180            #endif
181            Uint32 Array<PEGASUS_ARRAY_T>::getCapacity() const
182            {
183 kumpf 1.13     return static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep)->capacity;
184 kumpf 1.10 }
185            
186            #ifndef PEGASUS_ARRAY_T
187            template<class PEGASUS_ARRAY_T>
188            #endif
189            const PEGASUS_ARRAY_T* Array<PEGASUS_ARRAY_T>::getData() const
190            {
191 kumpf 1.13     return static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep)->data();
192            }
193            
194            #ifndef PEGASUS_ARRAY_T
195            template<class PEGASUS_ARRAY_T>
196            #endif
197            PEGASUS_ARRAY_T& Array<PEGASUS_ARRAY_T>::operator[](Uint32 pos)
198            {
199                if (pos >= size())
200                    ThrowOutOfBounds();
201            
202                return static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep)->data()[pos];
203            }
204            
205            #ifndef PEGASUS_ARRAY_T
206            template<class PEGASUS_ARRAY_T>
207            #endif
208            const PEGASUS_ARRAY_T& Array<PEGASUS_ARRAY_T>::operator[](Uint32 pos) const
209            {
210                if (pos >= size())
211                    ThrowOutOfBounds();
212 kumpf 1.13 
213                return static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep)->data()[pos];
214 kumpf 1.10 }
215            
216            #ifndef PEGASUS_ARRAY_T
217            template<class PEGASUS_ARRAY_T>
218            #endif
219 mike  1.5  void Array<PEGASUS_ARRAY_T>::append(const PEGASUS_ARRAY_T& x)
220            {
221 kumpf 1.9      reserve(size() + 1);
222 mike  1.5      new (_data() + size()) PEGASUS_ARRAY_T(x);
223 kumpf 1.13     static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep)->size++;
224 mike  1.5  }
225            
226            #ifndef PEGASUS_ARRAY_T
227            template<class PEGASUS_ARRAY_T>
228            #endif
229            void Array<PEGASUS_ARRAY_T>::append(const PEGASUS_ARRAY_T* x, Uint32 size)
230            {
231 kumpf 1.9      reserve(this->size() + size);
232 mike  1.5      CopyToRaw(_data() + this->size(), x, size);
233 kumpf 1.13     static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep)->size += size;
234 mike  1.5  }
235            
236            #ifndef PEGASUS_ARRAY_T
237            template<class PEGASUS_ARRAY_T>
238            #endif
239 kumpf 1.10 void Array<PEGASUS_ARRAY_T>::appendArray(const Array<PEGASUS_ARRAY_T>& x)
240            {
241                append(x.getData(), x.size());
242            }
243            
244            #ifndef PEGASUS_ARRAY_T
245            template<class PEGASUS_ARRAY_T>
246            #endif
247 mike  1.5  void Array<PEGASUS_ARRAY_T>::prepend(const PEGASUS_ARRAY_T& x)
248            {
249 kumpf 1.12     prepend(&x, 1);
250 mike  1.5  }
251            
252            #ifndef PEGASUS_ARRAY_T
253            template<class PEGASUS_ARRAY_T>
254            #endif
255            void Array<PEGASUS_ARRAY_T>::prepend(const PEGASUS_ARRAY_T* x, Uint32 size)
256            {
257 kumpf 1.9      reserve(this->size() + size);
258 mike  1.5      memmove(_data() + size, _data(), sizeof(PEGASUS_ARRAY_T) * this->size());
259                CopyToRaw(_data(), x, size);
260 kumpf 1.13     static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep)->size += size;
261 mike  1.5  }
262            
263            #ifndef PEGASUS_ARRAY_T
264            template<class PEGASUS_ARRAY_T>
265            #endif
266            void Array<PEGASUS_ARRAY_T>::insert(Uint32 pos, const PEGASUS_ARRAY_T& x)
267            {
268 kumpf 1.12     insert(pos, &x, 1);
269 mike  1.5  }
270            
271            #ifndef PEGASUS_ARRAY_T
272            template<class PEGASUS_ARRAY_T>
273            #endif
274            void Array<PEGASUS_ARRAY_T>::insert(Uint32 pos, const PEGASUS_ARRAY_T* x, Uint32 size)
275            {
276 kumpf 1.12     if (pos > this->size())
277 kumpf 1.13         ThrowOutOfBounds();
278 mike  1.5  
279 kumpf 1.9      reserve(this->size() + size);
280 mike  1.5  
281                Uint32 n = this->size() - pos;
282            
283                if (n)
284 kumpf 1.13         memmove(
285                        _data() + pos + size, _data() + pos, sizeof(PEGASUS_ARRAY_T) * n);
286 mike  1.5  
287                CopyToRaw(_data() + pos, 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            void Array<PEGASUS_ARRAY_T>::remove(Uint32 pos)
295            {
296 kumpf 1.12     remove(pos, 1);
297 mike  1.5  }
298            
299            #ifndef PEGASUS_ARRAY_T
300            template<class PEGASUS_ARRAY_T>
301            #endif
302            void Array<PEGASUS_ARRAY_T>::remove(Uint32 pos, Uint32 size)
303            {
304 kumpf 1.12     if (pos + size - 1 > this->size())
305 kumpf 1.13         ThrowOutOfBounds();
306 mike  1.5  
307                Destroy(_data() + pos, size);
308            
309                Uint32 rem = this->size() - (pos + size);
310            
311                if (rem)
312 kumpf 1.13         memmove(
313                        _data() + pos, _data() + pos + size, sizeof(PEGASUS_ARRAY_T) * rem);
314 mike  1.5  
315 kumpf 1.13     static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep)->size -= size;
316 mike  1.5  }
317            
318 mike  1.6  #ifdef PEGASUS_HAS_EBCDIC
319            
320            #ifndef PEGASUS_ARRAY_T
321            template<class PEGASUS_ARRAY_T>
322            #endif
323            void Array<PEGASUS_ARRAY_T>::etoa()
324            {
325            #if PEGASUS_ARRAY_T == Sint8
326 kumpf 1.13     __etoa_l((char *)_data(),static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep)->size);
327 mike  1.6  #endif
328            }
329            
330            #ifndef PEGASUS_ARRAY_T
331            template<class PEGASUS_ARRAY_T>
332            #endif
333            void Array<PEGASUS_ARRAY_T>::atoe()
334            {
335            #if PEGASUS_ARRAY_T == Sint8
336 kumpf 1.13     __atoe_l((char *)_data(),static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep)->size);
337 mike  1.6  #endif
338            }
339            
340            #endif
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>::begin()
346            {
347 kumpf 1.13     return static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep)->data();
348 kumpf 1.10 }
349            
350            #ifndef PEGASUS_ARRAY_T
351            template<class PEGASUS_ARRAY_T>
352            #endif
353            PEGASUS_ARRAY_T* Array<PEGASUS_ARRAY_T>::end()
354            {
355 kumpf 1.13     return static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep)->data() + size();
356 kumpf 1.10 }
357            
358            #ifndef PEGASUS_ARRAY_T
359            template<class PEGASUS_ARRAY_T>
360            #endif
361            const PEGASUS_ARRAY_T* Array<PEGASUS_ARRAY_T>::begin() const
362            {
363                return getData();
364            }
365            
366            #ifndef PEGASUS_ARRAY_T
367            template<class PEGASUS_ARRAY_T>
368            #endif
369            const PEGASUS_ARRAY_T* Array<PEGASUS_ARRAY_T>::end() const
370            {
371                return getData() + size();
372            }
373            
374            #ifndef PEGASUS_ARRAY_T
375            template<class PEGASUS_ARRAY_T>
376            #endif
377 kumpf 1.10 PEGASUS_ARRAY_T* Array<PEGASUS_ARRAY_T>::_data() const
378            {
379 kumpf 1.13     return static_cast<ArrayRep<PEGASUS_ARRAY_T>*>(_rep)->data();
380 kumpf 1.10 }
381 mike  1.6  
382 kumpf 1.13 #endif //!defined(Pegasus_ArrayImpl_h) || !defined(PEGASUS_ARRAY_T)
383            //#endif /*defined(PEGASUS_EXPLICIT_INSTANTIATION) || !defined(PEGASUS_ARRAY_T)*/

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2