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