| // Copyright 2016 the V8 project authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef V8_BASE_HASHMAP_ENTRY_H_ | |
| #define V8_BASE_HASHMAP_ENTRY_H_ | |
| #include <cstdint> | |
| namespace v8 { | |
| namespace base { | |
| // HashMap entries are (key, value, hash) triplets, with a boolean indicating if | |
| // they are an empty entry. Some clients may not need to use the value slot | |
| // (e.g. implementers of sets, where the key is the value). | |
| template <typename Key, typename Value> | |
| struct TemplateHashMapEntry { | |
| Key key; | |
| Value value; | |
| uint32_t hash; // The full hash value for key | |
| TemplateHashMapEntry(Key key, Value value, uint32_t hash) | |
| : key(key), value(value), hash(hash), exists_(true) {} | |
| bool exists() const { return exists_; } | |
| void clear() { exists_ = false; } | |
| private: | |
| bool exists_; | |
| }; | |
| // Specialization for pointer-valued keys | |
| template <typename Key, typename Value> | |
| struct TemplateHashMapEntry<Key*, Value> { | |
| Key* key; | |
| Value value; | |
| uint32_t hash; // The full hash value for key | |
| TemplateHashMapEntry(Key* key, Value value, uint32_t hash) | |
| : key(key), value(value), hash(hash) {} | |
| bool exists() const { return key != nullptr; } | |
| void clear() { key = nullptr; } | |
| }; | |
| // TODO(leszeks): There could be a specialisation for void values (e.g. for | |
| // sets), which omits the value field | |
| } // namespace base | |
| } // namespace v8 | |
| #endif // V8_BASE_HASHMAP_ENTRY_H_ |