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