KeyedVector.h revision e6d77c593d1a25b45c23bf9292ec7ee09fc14b6e
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 /*! 6987548ee2b380c1e76086d21047854fa3425a8f06Glenn Kasten * modifying 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 94e6d77c593d1a25b45c23bf9292ec7ee09fc14b6eJeff Brown// KeyedVector<KEY, VALUE> can be trivially moved using memcpy() because its 95e6d77c593d1a25b45c23bf9292ec7ee09fc14b6eJeff Brown// underlying SortedVector can be trivially moved. 96e6d77c593d1a25b45c23bf9292ec7ee09fc14b6eJeff Browntemplate<typename KEY, typename VALUE> struct trait_trivial_move<KeyedVector<KEY, VALUE> > { 97e6d77c593d1a25b45c23bf9292ec7ee09fc14b6eJeff Brown enum { value = trait_trivial_move<SortedVector< key_value_pair_t<KEY, VALUE> > >::value }; 98e6d77c593d1a25b45c23bf9292ec7ee09fc14b6eJeff Brown}; 99e6d77c593d1a25b45c23bf9292ec7ee09fc14b6eJeff Brown 100e6d77c593d1a25b45c23bf9292ec7ee09fc14b6eJeff Brown 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/** 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Variation of KeyedVector that holds a default value to return when 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * valueFor() is called with a key that doesn't exist. 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate <typename KEY, typename VALUE> 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass DefaultKeyedVector : public KeyedVector<KEY, VALUE> 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic: 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project inline DefaultKeyedVector(const VALUE& defValue = VALUE()); 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const VALUE& valueFor(const KEY& key) const; 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectprivate: 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project VALUE mDefault; 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename KEY, typename VALUE> inline 121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectKeyedVector<KEY,VALUE>::KeyedVector() 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename KEY, typename VALUE> inline 126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectssize_t KeyedVector<KEY,VALUE>::indexOfKey(const KEY& key) const { 127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mVector.indexOf( key_value_pair_t<KEY,VALUE>(key) ); 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>::valueFor(const KEY& key) const { 132579c2b4dc12543f53cf3c885b4a8525cfe4a533dAl Sutton ssize_t i = this->indexOfKey(key); 133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project assert(i>=0); 134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mVector.itemAt(i).value; 135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename KEY, typename VALUE> inline 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst VALUE& KeyedVector<KEY,VALUE>::valueAt(size_t index) const { 139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mVector.itemAt(index).value; 140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename KEY, typename VALUE> inline 143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst KEY& KeyedVector<KEY,VALUE>::keyAt(size_t index) const { 144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mVector.itemAt(index).key; 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>::editValueFor(const KEY& key) { 149579c2b4dc12543f53cf3c885b4a8525cfe4a533dAl Sutton ssize_t i = this->indexOfKey(key); 150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project assert(i>=0); 151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mVector.editItemAt(i).value; 152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename KEY, typename VALUE> inline 155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectVALUE& KeyedVector<KEY,VALUE>::editValueAt(size_t index) { 156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mVector.editItemAt(index).value; 157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename KEY, typename VALUE> inline 160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectssize_t KeyedVector<KEY,VALUE>::add(const KEY& key, const VALUE& value) { 161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mVector.add( key_value_pair_t<KEY,VALUE>(key, value) ); 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>::replaceValueFor(const KEY& key, const VALUE& value) { 166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project key_value_pair_t<KEY,VALUE> pair(key, value); 167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mVector.remove(pair); 168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mVector.add(pair); 169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename KEY, typename VALUE> inline 172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectssize_t KeyedVector<KEY,VALUE>::replaceValueAt(size_t index, const VALUE& item) { 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (index<size()) { 1742b2fb1a69394edd58666b89597c560442ccc3a90Mathias Agopian mVector.editItemAt(index).value = item; 175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return index; 176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return BAD_INDEX; 178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename KEY, typename VALUE> inline 181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectssize_t KeyedVector<KEY,VALUE>::removeItem(const KEY& key) { 182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mVector.remove(key_value_pair_t<KEY,VALUE>(key)); 183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename KEY, typename VALUE> inline 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectssize_t KeyedVector<KEY, VALUE>::removeItemsAt(size_t index, size_t count) { 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mVector.removeItemsAt(index, count); 188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename KEY, typename VALUE> inline 193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectDefaultKeyedVector<KEY,VALUE>::DefaultKeyedVector(const VALUE& defValue) 194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : mDefault(defValue) 195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename KEY, typename VALUE> inline 199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst VALUE& DefaultKeyedVector<KEY,VALUE>::valueFor(const KEY& key) const { 200579c2b4dc12543f53cf3c885b4a8525cfe4a533dAl Sutton ssize_t i = this->indexOfKey(key); 201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return i >= 0 ? KeyedVector<KEY,VALUE>::valueAt(i) : mDefault; 202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif // ANDROID_KEYED_VECTOR_H 209