Vector.h revision dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0
1/*
2 *  vector.h
3 *  Android
4 *
5 *  Copyright 2005 The Android Open Source Project
6 *
7 */
8
9#ifndef ANDROID_VECTOR_H
10#define ANDROID_VECTOR_H
11
12#include <new>
13#include <stdint.h>
14#include <sys/types.h>
15
16#include <cutils/log.h>
17
18#include "tinyutils/VectorImpl.h"
19#include "tinyutils/TypeHelpers.h"
20
21// ---------------------------------------------------------------------------
22
23namespace android {
24
25/*!
26 * The main templated vector class ensuring type safety
27 * while making use of VectorImpl.
28 * This is the class users want to use.
29 */
30
31template <class TYPE>
32class Vector : private VectorImpl
33{
34public:
35            typedef TYPE    value_type;
36
37    /*!
38     * Constructors and destructors
39     */
40
41                            Vector();
42                            Vector(const Vector<TYPE>& rhs);
43    virtual                 ~Vector();
44
45    /*! copy operator */
46            const Vector<TYPE>&     operator = (const Vector<TYPE>& rhs) const;
47            Vector<TYPE>&           operator = (const Vector<TYPE>& rhs);
48
49    /*
50     * empty the vector
51     */
52
53    inline  void            clear()             { VectorImpl::clear(); }
54
55    /*!
56     * vector stats
57     */
58
59    //! returns number of items in the vector
60    inline  size_t          size() const                { return VectorImpl::size(); }
61    //! returns wether or not the vector is empty
62    inline  bool            isEmpty() const             { return VectorImpl::isEmpty(); }
63    //! returns how many items can be stored without reallocating the backing store
64    inline  size_t          capacity() const            { return VectorImpl::capacity(); }
65    //! setst the capacity. capacity can never be reduced less than size()
66    inline  ssize_t         setCapacity(size_t size)    { return VectorImpl::setCapacity(size); }
67
68    /*!
69     * C-style array access
70     */
71
72    //! read-only C-style access
73    inline  const TYPE*     array() const;
74    //! read-write C-style access
75            TYPE*           editArray();
76
77    /*!
78     * accessors
79     */
80
81    //! read-only access to an item at a given index
82    inline  const TYPE&     operator [] (size_t index) const;
83    //! alternate name for operator []
84    inline  const TYPE&     itemAt(size_t index) const;
85    //! stack-usage of the vector. returns the top of the stack (last element)
86            const TYPE&     top() const;
87    //! same as operator [], but allows to access the vector backward (from the end) with a negative index
88            const TYPE&     mirrorItemAt(ssize_t index) const;
89
90    /*!
91     * modifing the array
92     */
93
94    //! copy-on write support, grants write access to an item
95            TYPE&           editItemAt(size_t index);
96    //! grants right acces to the top of the stack (last element)
97            TYPE&           editTop();
98
99            /*!
100             * append/insert another vector
101             */
102
103    //! insert another vector at a given index
104            ssize_t         insertVectorAt(const Vector<TYPE>& vector, size_t index);
105
106    //! append another vector at the end of this one
107            ssize_t         appendVector(const Vector<TYPE>& vector);
108
109
110            /*!
111             * add/insert/replace items
112             */
113
114    //! insert one or several items initialized with their default constructor
115    inline  ssize_t         insertAt(size_t index, size_t numItems = 1);
116    //! insert on onr several items initialized from a prototype item
117            ssize_t         insertAt(const TYPE& prototype_item, size_t index, size_t numItems = 1);
118    //! pop the top of the stack (removes the last element). No-op if the stack's empty
119    inline  void            pop();
120    //! pushes an item initialized with its default constructor
121    inline  void            push();
122    //! pushes an item on the top of the stack
123            void            push(const TYPE& item);
124    //! same as push() but returns the index the item was added at (or an error)
125    inline  ssize_t         add();
126    //! same as push() but returns the index the item was added at (or an error)
127            ssize_t         add(const TYPE& item);
128    //! replace an item with a new one initialized with its default constructor
129    inline  ssize_t         replaceAt(size_t index);
130    //! replace an item with a new one
131            ssize_t         replaceAt(const TYPE& item, size_t index);
132
133    /*!
134     * remove items
135     */
136
137    //! remove several items
138    inline  ssize_t         removeItemsAt(size_t index, size_t count = 1);
139    //! remove one item
140    inline  ssize_t         removeAt(size_t index)  { return removeItemsAt(index); }
141
142    /*!
143     * sort (stable) the array
144     */
145
146     typedef int (*compar_t)(const TYPE* lhs, const TYPE* rhs);
147     typedef int (*compar_r_t)(const TYPE* lhs, const TYPE* rhs, void* state);
148
149     inline status_t        sort(compar_t cmp);
150     inline status_t        sort(compar_r_t cmp, void* state);
151
152protected:
153    virtual void    do_construct(void* storage, size_t num) const;
154    virtual void    do_destroy(void* storage, size_t num) const;
155    virtual void    do_copy(void* dest, const void* from, size_t num) const;
156    virtual void    do_splat(void* dest, const void* item, size_t num) const;
157    virtual void    do_move_forward(void* dest, const void* from, size_t num) const;
158    virtual void    do_move_backward(void* dest, const void* from, size_t num) const;
159};
160
161
162// ---------------------------------------------------------------------------
163// No user serviceable parts from here...
164// ---------------------------------------------------------------------------
165
166template<class TYPE> inline
167Vector<TYPE>::Vector()
168    : VectorImpl(sizeof(TYPE),
169                ((traits<TYPE>::has_trivial_ctor   ? HAS_TRIVIAL_CTOR   : 0)
170                |(traits<TYPE>::has_trivial_dtor   ? HAS_TRIVIAL_DTOR   : 0)
171                |(traits<TYPE>::has_trivial_copy   ? HAS_TRIVIAL_COPY   : 0)
172                |(traits<TYPE>::has_trivial_assign ? HAS_TRIVIAL_ASSIGN : 0))
173                )
174{
175}
176
177template<class TYPE> inline
178Vector<TYPE>::Vector(const Vector<TYPE>& rhs)
179    : VectorImpl(rhs) {
180}
181
182template<class TYPE> inline
183Vector<TYPE>::~Vector() {
184    finish_vector();
185}
186
187template<class TYPE> inline
188Vector<TYPE>& Vector<TYPE>::operator = (const Vector<TYPE>& rhs) {
189    VectorImpl::operator = (rhs);
190    return *this;
191}
192
193template<class TYPE> inline
194const Vector<TYPE>& Vector<TYPE>::operator = (const Vector<TYPE>& rhs) const {
195    VectorImpl::operator = (rhs);
196    return *this;
197}
198
199template<class TYPE> inline
200const TYPE* Vector<TYPE>::array() const {
201    return static_cast<const TYPE *>(arrayImpl());
202}
203
204template<class TYPE> inline
205TYPE* Vector<TYPE>::editArray() {
206    return static_cast<TYPE *>(editArrayImpl());
207}
208
209
210template<class TYPE> inline
211const TYPE& Vector<TYPE>::operator[](size_t index) const {
212    LOG_FATAL_IF( index>=size(),
213                  "itemAt: index %d is past size %d", (int)index, (int)size() );
214    return *(array() + index);
215}
216
217template<class TYPE> inline
218const TYPE& Vector<TYPE>::itemAt(size_t index) const {
219    return operator[](index);
220}
221
222template<class TYPE> inline
223const TYPE& Vector<TYPE>::mirrorItemAt(ssize_t index) const {
224    LOG_FATAL_IF( (index>0 ? index : -index)>=size(),
225                  "mirrorItemAt: index %d is past size %d",
226                  (int)index, (int)size() );
227    return *(array() + ((index<0) ? (size()-index) : index));
228}
229
230template<class TYPE> inline
231const TYPE& Vector<TYPE>::top() const {
232    return *(array() + size() - 1);
233}
234
235template<class TYPE> inline
236TYPE& Vector<TYPE>::editItemAt(size_t index) {
237    return *( static_cast<TYPE *>(editItemLocation(index)) );
238}
239
240template<class TYPE> inline
241TYPE& Vector<TYPE>::editTop() {
242    return *( static_cast<TYPE *>(editItemLocation(size()-1)) );
243}
244
245template<class TYPE> inline
246ssize_t Vector<TYPE>::insertVectorAt(const Vector<TYPE>& vector, size_t index) {
247    return VectorImpl::insertVectorAt(reinterpret_cast<const VectorImpl&>(vector), index);
248}
249
250template<class TYPE> inline
251ssize_t Vector<TYPE>::appendVector(const Vector<TYPE>& vector) {
252    return VectorImpl::appendVector(reinterpret_cast<const VectorImpl&>(vector));
253}
254
255template<class TYPE> inline
256ssize_t Vector<TYPE>::insertAt(const TYPE& item, size_t index, size_t numItems) {
257    return VectorImpl::insertAt(&item, index, numItems);
258}
259
260template<class TYPE> inline
261void Vector<TYPE>::push(const TYPE& item) {
262    return VectorImpl::push(&item);
263}
264
265template<class TYPE> inline
266ssize_t Vector<TYPE>::add(const TYPE& item) {
267    return VectorImpl::add(&item);
268}
269
270template<class TYPE> inline
271ssize_t Vector<TYPE>::replaceAt(const TYPE& item, size_t index) {
272    return VectorImpl::replaceAt(&item, index);
273}
274
275template<class TYPE> inline
276ssize_t Vector<TYPE>::insertAt(size_t index, size_t numItems) {
277    return VectorImpl::insertAt(index, numItems);
278}
279
280template<class TYPE> inline
281void Vector<TYPE>::pop() {
282    VectorImpl::pop();
283}
284
285template<class TYPE> inline
286void Vector<TYPE>::push() {
287    VectorImpl::push();
288}
289
290template<class TYPE> inline
291ssize_t Vector<TYPE>::add() {
292    return VectorImpl::add();
293}
294
295template<class TYPE> inline
296ssize_t Vector<TYPE>::replaceAt(size_t index) {
297    return VectorImpl::replaceAt(index);
298}
299
300template<class TYPE> inline
301ssize_t Vector<TYPE>::removeItemsAt(size_t index, size_t count) {
302    return VectorImpl::removeItemsAt(index, count);
303}
304
305template<class TYPE> inline
306status_t Vector<TYPE>::sort(Vector<TYPE>::compar_t cmp) {
307    return VectorImpl::sort((VectorImpl::compar_t)cmp);
308}
309
310template<class TYPE> inline
311status_t Vector<TYPE>::sort(Vector<TYPE>::compar_r_t cmp, void* state) {
312    return VectorImpl::sort((VectorImpl::compar_r_t)cmp, state);
313}
314
315// ---------------------------------------------------------------------------
316
317template<class TYPE>
318void Vector<TYPE>::do_construct(void* storage, size_t num) const {
319    construct_type( reinterpret_cast<TYPE*>(storage), num );
320}
321
322template<class TYPE>
323void Vector<TYPE>::do_destroy(void* storage, size_t num) const {
324    destroy_type( reinterpret_cast<TYPE*>(storage), num );
325}
326
327template<class TYPE>
328void Vector<TYPE>::do_copy(void* dest, const void* from, size_t num) const {
329    copy_type( reinterpret_cast<TYPE*>(dest), reinterpret_cast<const TYPE*>(from), num );
330}
331
332template<class TYPE>
333void Vector<TYPE>::do_splat(void* dest, const void* item, size_t num) const {
334    splat_type( reinterpret_cast<TYPE*>(dest), reinterpret_cast<const TYPE*>(item), num );
335}
336
337template<class TYPE>
338void Vector<TYPE>::do_move_forward(void* dest, const void* from, size_t num) const {
339    move_forward_type( reinterpret_cast<TYPE*>(dest), reinterpret_cast<const TYPE*>(from), num );
340}
341
342template<class TYPE>
343void Vector<TYPE>::do_move_backward(void* dest, const void* from, size_t num) const {
344    move_backward_type( reinterpret_cast<TYPE*>(dest), reinterpret_cast<const TYPE*>(from), num );
345}
346
347}; // namespace android
348
349
350// ---------------------------------------------------------------------------
351
352#endif // ANDROID_VECTOR_H
353