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