Commit 696dd65b authored by leszeks's avatar leszeks Committed by Commit bot

[base] Template hashmap on key and value

Adds template parameters for the TemplateHashMapImpl for the key and
value type, to allow them to be something other than pointers. To keep
the impact of this patch low, uses of TemplateHashMapImpl set these
types to void* to emulate the previous behaviour.

This is part of a wider set of changes discussed in:
https://groups.google.com/forum/#!topic/v8-dev/QLsC0XPYLeM

Review-Url: https://codereview.chromium.org/2343123002
Cr-Commit-Position: refs/heads/master@{#39530}
parent eb57f22e
...@@ -2101,6 +2101,7 @@ v8_source_set("v8_libbase") { ...@@ -2101,6 +2101,7 @@ v8_source_set("v8_libbase") {
"src/base/free_deleter.h", "src/base/free_deleter.h",
"src/base/functional.cc", "src/base/functional.cc",
"src/base/functional.h", "src/base/functional.h",
"src/base/hashmap-entry.h",
"src/base/hashmap.h", "src/base/hashmap.h",
"src/base/ieee754.cc", "src/base/ieee754.cc",
"src/base/ieee754.h", "src/base/ieee754.h",
......
// 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_
This diff is collapsed.
...@@ -1818,6 +1818,7 @@ ...@@ -1818,6 +1818,7 @@
'base/functional.cc', 'base/functional.cc',
'base/functional.h', 'base/functional.h',
'base/hashmap.h', 'base/hashmap.h',
'base/hashmap-entry.h',
'base/ieee754.cc', 'base/ieee754.cc',
'base/ieee754.h', 'base/ieee754.h',
'base/iterator.h', 'base/iterator.h',
......
...@@ -244,7 +244,8 @@ class ZoneSplayTree final : public SplayTree<Config, ZoneAllocationPolicy> { ...@@ -244,7 +244,8 @@ class ZoneSplayTree final : public SplayTree<Config, ZoneAllocationPolicy> {
void operator delete(void* pointer, Zone* zone) { UNREACHABLE(); } void operator delete(void* pointer, Zone* zone) { UNREACHABLE(); }
}; };
typedef base::TemplateHashMapImpl<ZoneAllocationPolicy> ZoneHashMap; typedef base::TemplateHashMapImpl<void*, void*, ZoneAllocationPolicy>
ZoneHashMap;
} // namespace internal } // namespace internal
} // namespace v8 } // namespace v8
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment