Home | History | Annotate | Download | only in tinyutils
      1 /*
      2  *  keyed_vector.h
      3  *  Android
      4  *
      5  *  Created on 11/18/05.
      6  *  Copyright 2005 The Android Open Source Project
      7  *
      8  */
      9 
     10 #ifndef ANDROID_KEYED_VECTOR_H
     11 #define ANDROID_KEYED_VECTOR_H
     12 
     13 #include <assert.h>
     14 #include <stdint.h>
     15 #include <sys/types.h>
     16 
     17 #include "tinyutils/SortedVector.h"
     18 #include "tinyutils/TypeHelpers.h"
     19 
     20 // ---------------------------------------------------------------------------
     21 
     22 namespace android {
     23 
     24 template <typename KEY, typename VALUE>
     25 class KeyedVector
     26 {
     27 public:
     28     typedef KEY    key_type;
     29     typedef VALUE  value_type;
     30 
     31     inline                  KeyedVector();
     32 
     33     /*
     34      * empty the vector
     35      */
     36 
     37     inline  void            clear()                     { mVector.clear(); }
     38 
     39     /*!
     40      * vector stats
     41      */
     42 
     43     //! returns number of items in the vector
     44     inline  size_t          size() const                { return mVector.size(); }
     45     //! returns wether or not the vector is empty
     46     inline  bool            isEmpty() const             { return mVector.isEmpty(); }
     47     //! returns how many items can be stored without reallocating the backing store
     48     inline  size_t          capacity() const            { return mVector.capacity(); }
     49     //! setst the capacity. capacity can never be reduced less than size()
     50     inline ssize_t          setCapacity(size_t size)    { return mVector.setCapacity(size); }
     51 
     52     /*!
     53      * accessors
     54      */
     55             const VALUE&    valueFor(const KEY& key) const;
     56             const VALUE&    valueAt(size_t index) const;
     57             const KEY&      keyAt(size_t index) const;
     58             ssize_t         indexOfKey(const KEY& key) const;
     59 
     60     /*!
     61      * modifing the array
     62      */
     63 
     64             VALUE&          editValueFor(const KEY& key);
     65             VALUE&          editValueAt(size_t index);
     66 
     67             /*!
     68              * add/insert/replace items
     69              */
     70 
     71             ssize_t         add(const KEY& key, const VALUE& item);
     72             ssize_t         replaceValueFor(const KEY& key, const VALUE& item);
     73             ssize_t         replaceValueAt(size_t index, const VALUE& item);
     74 
     75     /*!
     76      * remove items
     77      */
     78 
     79             ssize_t         removeItem(const KEY& key);
     80             ssize_t         removeItemsAt(size_t index, size_t count = 1);
     81 
     82 private:
     83             SortedVector< key_value_pair_t<KEY, VALUE> >    mVector;
     84 };
     85 
     86 // ---------------------------------------------------------------------------
     87 
     88 /**
     89  * Variation of KeyedVector that holds a default value to return when
     90  * valueFor() is called with a key that doesn't exist.
     91  */
     92 template <typename KEY, typename VALUE>
     93 class DefaultKeyedVector : public KeyedVector<KEY, VALUE>
     94 {
     95 public:
     96     inline                  DefaultKeyedVector(const VALUE& defValue = VALUE());
     97             const VALUE&    valueFor(const KEY& key) const;
     98 
     99 private:
    100             VALUE                                           mDefault;
    101 };
    102 
    103 // ---------------------------------------------------------------------------
    104 
    105 template<typename KEY, typename VALUE> inline
    106 KeyedVector<KEY,VALUE>::KeyedVector()
    107 {
    108 }
    109 
    110 template<typename KEY, typename VALUE> inline
    111 ssize_t KeyedVector<KEY,VALUE>::indexOfKey(const KEY& key) const {
    112     return mVector.indexOf( key_value_pair_t<KEY,VALUE>(key) );
    113 }
    114 
    115 template<typename KEY, typename VALUE> inline
    116 const VALUE& KeyedVector<KEY,VALUE>::valueFor(const KEY& key) const {
    117     ssize_t i = indexOfKey(key);
    118     assert(i>=0);
    119     return mVector.itemAt(i).value;
    120 }
    121 
    122 template<typename KEY, typename VALUE> inline
    123 const VALUE& KeyedVector<KEY,VALUE>::valueAt(size_t index) const {
    124     return mVector.itemAt(index).value;
    125 }
    126 
    127 template<typename KEY, typename VALUE> inline
    128 const KEY& KeyedVector<KEY,VALUE>::keyAt(size_t index) const {
    129     return mVector.itemAt(index).key;
    130 }
    131 
    132 template<typename KEY, typename VALUE> inline
    133 VALUE& KeyedVector<KEY,VALUE>::editValueFor(const KEY& key) {
    134     ssize_t i = indexOfKey(key);
    135     assert(i>=0);
    136     return mVector.editItemAt(i).value;
    137 }
    138 
    139 template<typename KEY, typename VALUE> inline
    140 VALUE& KeyedVector<KEY,VALUE>::editValueAt(size_t index) {
    141     return mVector.editItemAt(index).value;
    142 }
    143 
    144 template<typename KEY, typename VALUE> inline
    145 ssize_t KeyedVector<KEY,VALUE>::add(const KEY& key, const VALUE& value) {
    146     return mVector.add( key_value_pair_t<KEY,VALUE>(key, value) );
    147 }
    148 
    149 template<typename KEY, typename VALUE> inline
    150 ssize_t KeyedVector<KEY,VALUE>::replaceValueFor(const KEY& key, const VALUE& value) {
    151     key_value_pair_t<KEY,VALUE> pair(key, value);
    152     mVector.remove(pair);
    153     return mVector.add(pair);
    154 }
    155 
    156 template<typename KEY, typename VALUE> inline
    157 ssize_t KeyedVector<KEY,VALUE>::replaceValueAt(size_t index, const VALUE& item) {
    158     if (index<size()) {
    159         mVector.editValueAt(index).value = item;
    160         return index;
    161     }
    162     return BAD_INDEX;
    163 }
    164 
    165 template<typename KEY, typename VALUE> inline
    166 ssize_t KeyedVector<KEY,VALUE>::removeItem(const KEY& key) {
    167     return mVector.remove(key_value_pair_t<KEY,VALUE>(key));
    168 }
    169 
    170 template<typename KEY, typename VALUE> inline
    171 ssize_t KeyedVector<KEY, VALUE>::removeItemsAt(size_t index, size_t count) {
    172     return mVector.removeItemsAt(index, count);
    173 }
    174 
    175 // ---------------------------------------------------------------------------
    176 
    177 template<typename KEY, typename VALUE> inline
    178 DefaultKeyedVector<KEY,VALUE>::DefaultKeyedVector(const VALUE& defValue)
    179     : mDefault(defValue)
    180 {
    181 }
    182 
    183 template<typename KEY, typename VALUE> inline
    184 const VALUE& DefaultKeyedVector<KEY,VALUE>::valueFor(const KEY& key) const {
    185     ssize_t i = indexOfKey(key);
    186     return i >= 0 ? KeyedVector<KEY,VALUE>::valueAt(i) : mDefault;
    187 }
    188 
    189 }; // namespace android
    190 
    191 // ---------------------------------------------------------------------------
    192 
    193 #endif // ANDROID_KEYED_VECTOR_H
    194