1e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier/* 2e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier * Copyright (C) 2014 The Android Open Source Project 3e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier * 4e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier * Licensed under the Apache License, Version 2.0 (the "License"); 5e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier * you may not use this file except in compliance with the License. 6e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier * You may obtain a copy of the License at 7e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier * 8e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier * http://www.apache.org/licenses/LICENSE-2.0 9e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier * 10e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier * Unless required by applicable law or agreed to in writing, software 11e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier * distributed under the License is distributed on an "AS IS" BASIS, 12e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier * See the License for the specific language governing permissions and 14e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier * limitations under the License. 15e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier */ 16e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier 17e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier#ifndef ART_RUNTIME_BASE_HASH_MAP_H_ 18e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier#define ART_RUNTIME_BASE_HASH_MAP_H_ 19e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier 20e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier#include <utility> 21e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier 22e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier#include "hash_set.h" 23e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier 24e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartiernamespace art { 25e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier 26e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartiertemplate <typename Fn> 27e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartierclass HashMapWrapper { 28e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier public: 29e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier // Hash function. 30e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier template <class Key, class Value> 31e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier size_t operator()(const std::pair<Key, Value>& pair) const { 32e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier return fn_(pair.first); 33e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier } 34e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier template <class Key> 35e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier size_t operator()(const Key& key) const { 36e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier return fn_(key); 37e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier } 38e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier template <class Key, class Value> 39e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier bool operator()(const std::pair<Key, Value>& a, const std::pair<Key, Value>& b) const { 40e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier return fn_(a.first, b.first); 41e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier } 42e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier template <class Key, class Value, class Element> 43e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier bool operator()(const std::pair<Key, Value>& a, const Element& element) const { 44e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier return fn_(a.first, element); 45e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier } 46e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier 47e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier private: 48e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier Fn fn_; 49e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier}; 50e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier 51a552e1c0584b8ab63150510286478c68cdbce13fRoland Levillaintemplate <class Key, class Value, class EmptyFn, 52e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier class HashFn = std::hash<Key>, class Pred = std::equal_to<Key>, 53e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier class Alloc = std::allocator<std::pair<Key, Value>>> 54e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartierclass HashMap : public HashSet<std::pair<Key, Value>, EmptyFn, HashMapWrapper<HashFn>, 55e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier HashMapWrapper<Pred>, Alloc> { 56e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier}; 57e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier 58e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier} // namespace art 59e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier 60e7c9a8c2b8481aafbc6af4ce6229bd361ba24742Mathieu Chartier#endif // ART_RUNTIME_BASE_HASH_MAP_H_ 61