1527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik/*
2527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik * Copyright (C) 2013 The Android Open Source Project
3527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik *
4527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik * Licensed under the Apache License, Version 2.0 (the "License");
5527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik * you may not use this file except in compliance with the License.
6527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik * You may obtain a copy of the License at
7527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik *
8527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik *      http://www.apache.org/licenses/LICENSE-2.0
9527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik *
10527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik * Unless required by applicable law or agreed to in writing, software
11527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik * distributed under the License is distributed on an "AS IS" BASIS,
12527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik * See the License for the specific language governing permissions and
14527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik * limitations under the License.
15527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik */
16527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik
17527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik#ifndef ANDROID_HWUI_TINYHASHMAP_H
18527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik#define ANDROID_HWUI_TINYHASHMAP_H
19527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik
20527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik#include <utils/BasicHashtable.h>
21527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik
22527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craiknamespace android {
23527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craiknamespace uirenderer {
24527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik
25527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik/**
26527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik * A very simple hash map that doesn't allow duplicate keys, overwriting the older entry.
27527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik */
28527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craiktemplate <typename TKey, typename TValue>
29527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craikclass TinyHashMap {
30527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craikpublic:
31527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik    typedef key_value_pair_t<TKey, TValue> TEntry;
32527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik
33527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik    /**
34527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik     * Puts an entry in the hash, removing any existing entry with the same key
35527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik     */
36527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik    void put(TKey key, TValue value) {
37e9bea2a18201d079831750865ab1d013528d862aAshok Bhat        hash_t hash = android::hash_type(key);
38527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik
39527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik        ssize_t index = mTable.find(-1, hash, key);
40527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik        if (index != -1) {
41527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik            mTable.removeAt(index);
42527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik        }
43527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik
44527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik        TEntry initEntry(key, value);
45527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik        mTable.add(hash, initEntry);
46527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik    }
47527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik
48527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik    /**
49527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik     * Return true if key is in the map, in which case stores the value in the output ref
50527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik     */
51527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik    bool get(TKey key, TValue& outValue) {
52e9bea2a18201d079831750865ab1d013528d862aAshok Bhat        hash_t hash = android::hash_type(key);
53527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik        ssize_t index = mTable.find(-1, hash, key);
54527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik        if (index == -1) {
55527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik            return false;
56527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik        }
57527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik        outValue = mTable.entryAt(index).value;
58527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik        return true;
59527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik    }
60527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik
61527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik    void clear() { mTable.clear(); }
62527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik
63527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craikprivate:
64527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik    BasicHashtable<TKey, TEntry> mTable;
65527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik};
66527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik
67527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik}; // namespace uirenderer
68527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik}; // namespace android
69527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik
70527a3aace1dd72432c2e0472a570e030ad04bf16Chris Craik#endif // ANDROID_HWUI_TINYHASHMAP_H
71