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