1f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// Copyright 2016 the V8 project authors. All rights reserved.
2f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// found in the LICENSE file.
4f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
5f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#ifndef V8_BASE_HASHMAP_ENTRY_H_
6f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#define V8_BASE_HASHMAP_ENTRY_H_
7f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
8f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include <cstdint>
9f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
10f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochnamespace v8 {
11f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochnamespace base {
12f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
13f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// HashMap entries are (key, value, hash) triplets, with a boolean indicating if
14f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// they are an empty entry. Some clients may not need to use the value slot
15f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// (e.g. implementers of sets, where the key is the value).
16f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochtemplate <typename Key, typename Value>
17f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochstruct TemplateHashMapEntry {
18f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Key key;
19f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Value value;
20f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  uint32_t hash;  // The full hash value for key
21f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
22f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  TemplateHashMapEntry(Key key, Value value, uint32_t hash)
23f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      : key(key), value(value), hash(hash), exists_(true) {}
24f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
25f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  bool exists() const { return exists_; }
26f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
27f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  void clear() { exists_ = false; }
28f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
29f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch private:
30f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  bool exists_;
31f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch};
32f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
33f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// Specialization for pointer-valued keys
34f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochtemplate <typename Key, typename Value>
35f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochstruct TemplateHashMapEntry<Key*, Value> {
36f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Key* key;
37f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Value value;
38f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  uint32_t hash;  // The full hash value for key
39f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
40f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  TemplateHashMapEntry(Key* key, Value value, uint32_t hash)
41f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      : key(key), value(value), hash(hash) {}
42f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
43f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  bool exists() const { return key != nullptr; }
44f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
45f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  void clear() { key = nullptr; }
46f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch};
47f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
48f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// TODO(leszeks): There could be a specialisation for void values (e.g. for
49f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// sets), which omits the value field
50f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
51f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}  // namespace base
52f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}  // namespace v8
53f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
54f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#endif  // V8_BASE_HASHMAP_ENTRY_H_
55