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