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