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