KeyedVector.h revision 73e263e5d698fdd267168dff497e1f5facb9348d
1cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project/* 2cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Copyright (C) 2005 The Android Open Source Project 3cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * 4cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * you may not use this file except in compliance with the License. 6cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * You may obtain a copy of the License at 7cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * 8cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * 10cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * See the License for the specific language governing permissions and 14cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * limitations under the License. 15cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 16cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 17cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#ifndef ANDROID_KEYED_VECTOR_H 18cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#define ANDROID_KEYED_VECTOR_H 19cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 20cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#include <assert.h> 21cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#include <stdint.h> 22cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#include <sys/types.h> 23cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 24cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#include <utils/SortedVector.h> 25cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#include <utils/TypeHelpers.h> 26cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#include <utils/Errors.h> 27cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 28cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project// --------------------------------------------------------------------------- 29cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 30cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectnamespace android { 31cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 32cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate <typename KEY, typename VALUE> 33cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectclass KeyedVector 34cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 35cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectpublic: 36cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project typedef KEY key_type; 37cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project typedef VALUE value_type; 38cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 39cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline KeyedVector(); 40cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 41cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project /* 42cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * empty the vector 43cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 44cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 45cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline void clear() { mVector.clear(); } 46cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 47cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project /*! 48cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * vector stats 49cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 50cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 51cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project //! returns number of items in the vector 52cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline size_t size() const { return mVector.size(); } 53cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project //! returns wether or not the vector is empty 54cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline bool isEmpty() const { return mVector.isEmpty(); } 55cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project //! returns how many items can be stored without reallocating the backing store 56cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline size_t capacity() const { return mVector.capacity(); } 57cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project //! setst the capacity. capacity can never be reduced less than size() 58cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline ssize_t setCapacity(size_t size) { return mVector.setCapacity(size); } 59cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 60cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project /*! 61cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * accessors 62cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 63cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project const VALUE& valueFor(const KEY& key) const; 64cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project const VALUE& valueAt(size_t index) const; 65cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project const KEY& keyAt(size_t index) const; 66cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project ssize_t indexOfKey(const KEY& key) const; 67cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 68cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project /*! 6973e263e5d698fdd267168dff497e1f5facb9348dGlenn Kasten * modifying the array 70cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 71cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 72cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project VALUE& editValueFor(const KEY& key); 73cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project VALUE& editValueAt(size_t index); 74cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 75cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project /*! 76cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * add/insert/replace items 77cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 78cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 79cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project ssize_t add(const KEY& key, const VALUE& item); 80cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project ssize_t replaceValueFor(const KEY& key, const VALUE& item); 81cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project ssize_t replaceValueAt(size_t index, const VALUE& item); 82cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 83cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project /*! 84cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * remove items 85cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 86cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 87cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project ssize_t removeItem(const KEY& key); 88cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project ssize_t removeItemsAt(size_t index, size_t count = 1); 89cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 90cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectprivate: 91cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project SortedVector< key_value_pair_t<KEY, VALUE> > mVector; 92cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}; 93cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 94cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project// --------------------------------------------------------------------------- 95cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 96cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project/** 97cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Variation of KeyedVector that holds a default value to return when 98cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * valueFor() is called with a key that doesn't exist. 99cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 100cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate <typename KEY, typename VALUE> 101cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectclass DefaultKeyedVector : public KeyedVector<KEY, VALUE> 102cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 103cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectpublic: 104cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline DefaultKeyedVector(const VALUE& defValue = VALUE()); 105cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project const VALUE& valueFor(const KEY& key) const; 106cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 107cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectprivate: 108cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project VALUE mDefault; 109cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}; 110cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 111cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project// --------------------------------------------------------------------------- 112cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 113cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<typename KEY, typename VALUE> inline 114cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source ProjectKeyedVector<KEY,VALUE>::KeyedVector() 115cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 116cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 117cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 118cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<typename KEY, typename VALUE> inline 119cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectssize_t KeyedVector<KEY,VALUE>::indexOfKey(const KEY& key) const { 120cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return mVector.indexOf( key_value_pair_t<KEY,VALUE>(key) ); 121cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 122cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 123cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<typename KEY, typename VALUE> inline 124cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectconst VALUE& KeyedVector<KEY,VALUE>::valueFor(const KEY& key) const { 125cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project ssize_t i = indexOfKey(key); 126cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project assert(i>=0); 127cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return mVector.itemAt(i).value; 128cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 129cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 130cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<typename KEY, typename VALUE> inline 131cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectconst VALUE& KeyedVector<KEY,VALUE>::valueAt(size_t index) const { 132cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return mVector.itemAt(index).value; 133cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 134cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 135cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<typename KEY, typename VALUE> inline 136cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectconst KEY& KeyedVector<KEY,VALUE>::keyAt(size_t index) const { 137cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return mVector.itemAt(index).key; 138cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 139cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 140cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<typename KEY, typename VALUE> inline 141cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source ProjectVALUE& KeyedVector<KEY,VALUE>::editValueFor(const KEY& key) { 142cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project ssize_t i = indexOfKey(key); 143cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project assert(i>=0); 144cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return mVector.editItemAt(i).value; 145cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 146cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 147cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<typename KEY, typename VALUE> inline 148cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source ProjectVALUE& KeyedVector<KEY,VALUE>::editValueAt(size_t index) { 149cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return mVector.editItemAt(index).value; 150cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 151cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 152cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<typename KEY, typename VALUE> inline 153cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectssize_t KeyedVector<KEY,VALUE>::add(const KEY& key, const VALUE& value) { 154cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return mVector.add( key_value_pair_t<KEY,VALUE>(key, value) ); 155cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 156cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 157cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<typename KEY, typename VALUE> inline 158cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectssize_t KeyedVector<KEY,VALUE>::replaceValueFor(const KEY& key, const VALUE& value) { 159cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project key_value_pair_t<KEY,VALUE> pair(key, value); 160cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project mVector.remove(pair); 161cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return mVector.add(pair); 162cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 163cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 164cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<typename KEY, typename VALUE> inline 165cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectssize_t KeyedVector<KEY,VALUE>::replaceValueAt(size_t index, const VALUE& item) { 166cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project if (index<size()) { 167cf89aa42ef888ba1f9787d6bec96394bcb529604Mathias Agopian mVector.editItemAt(index).value = item; 168cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return index; 169cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 170cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return BAD_INDEX; 171cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 172cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 173cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<typename KEY, typename VALUE> inline 174cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectssize_t KeyedVector<KEY,VALUE>::removeItem(const KEY& key) { 175cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return mVector.remove(key_value_pair_t<KEY,VALUE>(key)); 176cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 177cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 178cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<typename KEY, typename VALUE> inline 179cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectssize_t KeyedVector<KEY, VALUE>::removeItemsAt(size_t index, size_t count) { 180cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return mVector.removeItemsAt(index, count); 181cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 182cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 183cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project// --------------------------------------------------------------------------- 184cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 185cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<typename KEY, typename VALUE> inline 186cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source ProjectDefaultKeyedVector<KEY,VALUE>::DefaultKeyedVector(const VALUE& defValue) 187cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project : mDefault(defValue) 188cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 189cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 190cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 191cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<typename KEY, typename VALUE> inline 192cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectconst VALUE& DefaultKeyedVector<KEY,VALUE>::valueFor(const KEY& key) const { 193cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project ssize_t i = indexOfKey(key); 194cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return i >= 0 ? KeyedVector<KEY,VALUE>::valueAt(i) : mDefault; 195cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 196cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 197cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}; // namespace android 198cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 199cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project// --------------------------------------------------------------------------- 200cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 201cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#endif // ANDROID_KEYED_VECTOR_H 202