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)
|