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