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
24bdf73c7efcfdefe990f55541b71e7869ac378090Mathias Agopian#include <cutils/log.h>
25bdf73c7efcfdefe990f55541b71e7869ac378090Mathias Agopian
26cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#include <utils/SortedVector.h>
27cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#include <utils/TypeHelpers.h>
28cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#include <utils/Errors.h>
29cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
30cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project// ---------------------------------------------------------------------------
31cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
32cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectnamespace android {
33cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
34cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate <typename KEY, typename VALUE>
35cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectclass KeyedVector
36cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{
37cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectpublic:
38cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    typedef KEY    key_type;
39cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    typedef VALUE  value_type;
40cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
41cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    inline                  KeyedVector();
42cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
43cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    /*
44cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project     * empty the vector
45cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project     */
46cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
47cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    inline  void            clear()                     { mVector.clear(); }
48cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
49cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    /*!
50cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project     * vector stats
51cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project     */
52cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
53cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    //! returns number of items in the vector
54cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    inline  size_t          size() const                { return mVector.size(); }
55bdf73c7efcfdefe990f55541b71e7869ac378090Mathias Agopian    //! returns whether or not the vector is empty
56cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    inline  bool            isEmpty() const             { return mVector.isEmpty(); }
57cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    //! returns how many items can be stored without reallocating the backing store
58cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    inline  size_t          capacity() const            { return mVector.capacity(); }
59bdf73c7efcfdefe990f55541b71e7869ac378090Mathias Agopian    //! sets the capacity. capacity can never be reduced less than size()
60cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    inline ssize_t          setCapacity(size_t size)    { return mVector.setCapacity(size); }
6167b585149111b68afc250fec978620687892bb67Mathias Agopian
6267b585149111b68afc250fec978620687892bb67Mathias Agopian    // returns true if the arguments is known to be identical to this vector
6367b585149111b68afc250fec978620687892bb67Mathias Agopian    inline bool isIdenticalTo(const KeyedVector& rhs) const;
6467b585149111b68afc250fec978620687892bb67Mathias Agopian
65cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    /*!
66cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project     * accessors
67cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project     */
68cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project            const VALUE&    valueFor(const KEY& key) const;
69cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project            const VALUE&    valueAt(size_t index) const;
70cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project            const KEY&      keyAt(size_t index) const;
71cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project            ssize_t         indexOfKey(const KEY& key) const;
7267b585149111b68afc250fec978620687892bb67Mathias Agopian            const VALUE&    operator[] (size_t index) const;
73cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
74cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    /*!
7573e263e5d698fdd267168dff497e1f5facb9348dGlenn Kasten     * modifying the array
76cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project     */
77cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
78cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project            VALUE&          editValueFor(const KEY& key);
79cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project            VALUE&          editValueAt(size_t index);
80cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
81cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project            /*!
82cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project             * add/insert/replace items
83cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project             */
84cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
85cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project            ssize_t         add(const KEY& key, const VALUE& item);
86cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project            ssize_t         replaceValueFor(const KEY& key, const VALUE& item);
87cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project            ssize_t         replaceValueAt(size_t index, const VALUE& item);
88cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
89cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    /*!
90cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project     * remove items
91cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project     */
92cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
93cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project            ssize_t         removeItem(const KEY& key);
94cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project            ssize_t         removeItemsAt(size_t index, size_t count = 1);
95cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
96cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectprivate:
97cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project            SortedVector< key_value_pair_t<KEY, VALUE> >    mVector;
98cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project};
99cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
1009a0a76df1e961ef4621e81814d8bf891a09bef66Jeff Brown// KeyedVector<KEY, VALUE> can be trivially moved using memcpy() because its
1019a0a76df1e961ef4621e81814d8bf891a09bef66Jeff Brown// underlying SortedVector can be trivially moved.
1029a0a76df1e961ef4621e81814d8bf891a09bef66Jeff Browntemplate<typename KEY, typename VALUE> struct trait_trivial_move<KeyedVector<KEY, VALUE> > {
1039a0a76df1e961ef4621e81814d8bf891a09bef66Jeff Brown    enum { value = trait_trivial_move<SortedVector< key_value_pair_t<KEY, VALUE> > >::value };
1049a0a76df1e961ef4621e81814d8bf891a09bef66Jeff Brown};
1059a0a76df1e961ef4621e81814d8bf891a09bef66Jeff Brown
1069a0a76df1e961ef4621e81814d8bf891a09bef66Jeff Brown
107cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project// ---------------------------------------------------------------------------
108cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
109cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project/**
110cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Variation of KeyedVector that holds a default value to return when
111cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * valueFor() is called with a key that doesn't exist.
112cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */
113cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate <typename KEY, typename VALUE>
114cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectclass DefaultKeyedVector : public KeyedVector<KEY, VALUE>
115cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{
116cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectpublic:
117cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    inline                  DefaultKeyedVector(const VALUE& defValue = VALUE());
118cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project            const VALUE&    valueFor(const KEY& key) const;
119cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
120cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectprivate:
121cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project            VALUE                                           mDefault;
122cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project};
123cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
124cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project// ---------------------------------------------------------------------------
125cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
126cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<typename KEY, typename VALUE> inline
127cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source ProjectKeyedVector<KEY,VALUE>::KeyedVector()
128cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{
129cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
130cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
131cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<typename KEY, typename VALUE> inline
13267b585149111b68afc250fec978620687892bb67Mathias Agopianbool KeyedVector<KEY,VALUE>::isIdenticalTo(const KeyedVector<KEY,VALUE>& rhs) const {
13367b585149111b68afc250fec978620687892bb67Mathias Agopian    return mVector.array() == rhs.mVector.array();
13467b585149111b68afc250fec978620687892bb67Mathias Agopian}
13567b585149111b68afc250fec978620687892bb67Mathias Agopian
13667b585149111b68afc250fec978620687892bb67Mathias Agopiantemplate<typename KEY, typename VALUE> inline
137cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectssize_t KeyedVector<KEY,VALUE>::indexOfKey(const KEY& key) const {
138cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    return mVector.indexOf( key_value_pair_t<KEY,VALUE>(key) );
139cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
140cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
141cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<typename KEY, typename VALUE> inline
142cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectconst VALUE& KeyedVector<KEY,VALUE>::valueFor(const KEY& key) const {
1436c865b58aabe34d2fdcac6ce66a4a0db1e1196f5Al Sutton    ssize_t i = this->indexOfKey(key);
144bdf73c7efcfdefe990f55541b71e7869ac378090Mathias Agopian    LOG_ALWAYS_FATAL_IF(i<0, "%s: key not found", __PRETTY_FUNCTION__);
145cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    return mVector.itemAt(i).value;
146cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
147cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
148cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<typename KEY, typename VALUE> inline
149cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectconst VALUE& KeyedVector<KEY,VALUE>::valueAt(size_t index) const {
150cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    return mVector.itemAt(index).value;
151cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
152cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
153cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<typename KEY, typename VALUE> inline
15467b585149111b68afc250fec978620687892bb67Mathias Agopianconst VALUE& KeyedVector<KEY,VALUE>::operator[] (size_t index) const {
15567b585149111b68afc250fec978620687892bb67Mathias Agopian    return valueAt(index);
15667b585149111b68afc250fec978620687892bb67Mathias Agopian}
15767b585149111b68afc250fec978620687892bb67Mathias Agopian
15867b585149111b68afc250fec978620687892bb67Mathias Agopiantemplate<typename KEY, typename VALUE> inline
159cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectconst KEY& KeyedVector<KEY,VALUE>::keyAt(size_t index) const {
160cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    return mVector.itemAt(index).key;
161cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
162cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
163cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<typename KEY, typename VALUE> inline
164cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source ProjectVALUE& KeyedVector<KEY,VALUE>::editValueFor(const KEY& key) {
1656c865b58aabe34d2fdcac6ce66a4a0db1e1196f5Al Sutton    ssize_t i = this->indexOfKey(key);
166bdf73c7efcfdefe990f55541b71e7869ac378090Mathias Agopian    LOG_ALWAYS_FATAL_IF(i<0, "%s: key not found", __PRETTY_FUNCTION__);
167cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    return mVector.editItemAt(i).value;
168cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
169cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
170cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<typename KEY, typename VALUE> inline
171cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source ProjectVALUE& KeyedVector<KEY,VALUE>::editValueAt(size_t index) {
172cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    return mVector.editItemAt(index).value;
173cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
174cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
175cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<typename KEY, typename VALUE> inline
176cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectssize_t KeyedVector<KEY,VALUE>::add(const KEY& key, const VALUE& value) {
177cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    return mVector.add( key_value_pair_t<KEY,VALUE>(key, value) );
178cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
179cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
180cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<typename KEY, typename VALUE> inline
181cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectssize_t KeyedVector<KEY,VALUE>::replaceValueFor(const KEY& key, const VALUE& value) {
182cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    key_value_pair_t<KEY,VALUE> pair(key, value);
183cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    mVector.remove(pair);
184cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    return mVector.add(pair);
185cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
186cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
187cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<typename KEY, typename VALUE> inline
188cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectssize_t KeyedVector<KEY,VALUE>::replaceValueAt(size_t index, const VALUE& item) {
189cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    if (index<size()) {
190cf89aa42ef888ba1f9787d6bec96394bcb529604Mathias Agopian        mVector.editItemAt(index).value = item;
191cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project        return index;
192cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    }
193cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    return BAD_INDEX;
194cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
195cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
196cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<typename KEY, typename VALUE> inline
197cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectssize_t KeyedVector<KEY,VALUE>::removeItem(const KEY& key) {
198cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    return mVector.remove(key_value_pair_t<KEY,VALUE>(key));
199cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
200cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
201cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<typename KEY, typename VALUE> inline
202cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectssize_t KeyedVector<KEY, VALUE>::removeItemsAt(size_t index, size_t count) {
203cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    return mVector.removeItemsAt(index, count);
204cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
205cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
206cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project// ---------------------------------------------------------------------------
207cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
208cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<typename KEY, typename VALUE> inline
209cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source ProjectDefaultKeyedVector<KEY,VALUE>::DefaultKeyedVector(const VALUE& defValue)
210cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    : mDefault(defValue)
211cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{
212cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
213cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
214cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<typename KEY, typename VALUE> inline
215cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectconst VALUE& DefaultKeyedVector<KEY,VALUE>::valueFor(const KEY& key) const {
2166c865b58aabe34d2fdcac6ce66a4a0db1e1196f5Al Sutton    ssize_t i = this->indexOfKey(key);
217cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project    return i >= 0 ? KeyedVector<KEY,VALUE>::valueAt(i) : mDefault;
218cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}
219cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
220cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}; // namespace android
221cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
222cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project// ---------------------------------------------------------------------------
223cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project
224cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#endif // ANDROID_KEYED_VECTOR_H
225