Chromium Code Reviews| Index: src/hashmap.h |
| diff --git a/src/hashmap.h b/src/hashmap.h |
| index ede098cfd0a10fccb121298636004de9828b2e63..0d51db2dde860ca5f265800381f2b49237114d8c 100644 |
| --- a/src/hashmap.h |
| +++ b/src/hashmap.h |
| @@ -36,15 +36,15 @@ namespace v8 { |
| namespace internal { |
| template<class AllocationPolicy> |
| -class TemplateHashMap { |
| +class TemplateHashMapImpl { |
| public: |
| typedef bool (*MatchFun) (void* key1, void* key2); |
| // initial_capacity is the size of the initial hash map; |
| // it must be a power of 2 (and thus must not be 0). |
| - TemplateHashMap(MatchFun match, uint32_t initial_capacity = 8); |
| + TemplateHashMapImpl(MatchFun match, uint32_t initial_capacity = 8); |
| - ~TemplateHashMap(); |
| + ~TemplateHashMapImpl(); |
| // HashMap entries are (key, value, hash) triplets. |
| // Some clients may not need to use the value slot |
| @@ -99,10 +99,10 @@ class TemplateHashMap { |
| void Resize(); |
| }; |
| -typedef TemplateHashMap<FreeStoreAllocationPolicy> HashMap; |
| +typedef TemplateHashMapImpl<FreeStoreAllocationPolicy> HashMap; |
| template<class P> |
| -TemplateHashMap<P>::TemplateHashMap(MatchFun match, |
| +TemplateHashMapImpl<P>::TemplateHashMapImpl(MatchFun match, |
| uint32_t initial_capacity) { |
| match_ = match; |
| Initialize(initial_capacity); |
| @@ -110,13 +110,13 @@ TemplateHashMap<P>::TemplateHashMap(MatchFun match, |
| template<class P> |
| -TemplateHashMap<P>::~TemplateHashMap() { |
| +TemplateHashMapImpl<P>::~TemplateHashMapImpl() { |
| P::Delete(map_); |
| } |
| template<class P> |
| -typename TemplateHashMap<P>::Entry* TemplateHashMap<P>::Lookup( |
| +typename TemplateHashMapImpl<P>::Entry* TemplateHashMapImpl<P>::Lookup( |
| void* key, uint32_t hash, bool insert) { |
| // Find a matching entry. |
| Entry* p = Probe(key, hash); |
| @@ -146,7 +146,7 @@ typename TemplateHashMap<P>::Entry* TemplateHashMap<P>::Lookup( |
| template<class P> |
| -void TemplateHashMap<P>::Remove(void* key, uint32_t hash) { |
| +void TemplateHashMapImpl<P>::Remove(void* key, uint32_t hash) { |
| // Lookup the entry for the key to remove. |
| Entry* p = Probe(key, hash); |
| if (p->key == NULL) { |
| @@ -206,7 +206,7 @@ void TemplateHashMap<P>::Remove(void* key, uint32_t hash) { |
| template<class P> |
| -void TemplateHashMap<P>::Clear() { |
| +void TemplateHashMapImpl<P>::Clear() { |
| // Mark all entries as empty. |
| const Entry* end = map_end(); |
| for (Entry* p = map_; p < end; p++) { |
| @@ -217,13 +217,14 @@ void TemplateHashMap<P>::Clear() { |
| template<class P> |
| -typename TemplateHashMap<P>::Entry* TemplateHashMap<P>::Start() const { |
| +typename TemplateHashMapImpl<P>::Entry* TemplateHashMapImpl<P>::Start() const { |
| return Next(map_ - 1); |
| } |
| template<class P> |
| -typename TemplateHashMap<P>::Entry* TemplateHashMap<P>::Next(Entry* p) const { |
| +typename TemplateHashMapImpl<P>::Entry* TemplateHashMapImpl<P>::Next(Entry* p) |
| + const { |
| const Entry* end = map_end(); |
| ASSERT(map_ - 1 <= p && p < end); |
| for (p++; p < end; p++) { |
| @@ -236,7 +237,7 @@ typename TemplateHashMap<P>::Entry* TemplateHashMap<P>::Next(Entry* p) const { |
| template<class P> |
| -typename TemplateHashMap<P>::Entry* TemplateHashMap<P>::Probe(void* key, |
| +typename TemplateHashMapImpl<P>::Entry* TemplateHashMapImpl<P>::Probe(void* key, |
| uint32_t hash) { |
| ASSERT(key != NULL); |
| @@ -258,7 +259,7 @@ typename TemplateHashMap<P>::Entry* TemplateHashMap<P>::Probe(void* key, |
| template<class P> |
| -void TemplateHashMap<P>::Initialize(uint32_t capacity) { |
| +void TemplateHashMapImpl<P>::Initialize(uint32_t capacity) { |
| ASSERT(IsPowerOf2(capacity)); |
| map_ = reinterpret_cast<Entry*>(P::New(capacity * sizeof(Entry))); |
| if (map_ == NULL) { |
| @@ -271,7 +272,7 @@ void TemplateHashMap<P>::Initialize(uint32_t capacity) { |
| template<class P> |
| -void TemplateHashMap<P>::Resize() { |
| +void TemplateHashMapImpl<P>::Resize() { |
| Entry* map = map_; |
| uint32_t n = occupancy_; |
| @@ -290,6 +291,50 @@ void TemplateHashMap<P>::Resize() { |
| P::Delete(map); |
| } |
| + |
| +// A hash map for pointer keys and values with an STL-like interface. |
| +template<class Key, class Value, class AllocationPolicy> |
| +class TemplateHashMap: private TemplateHashMapImpl<AllocationPolicy> { |
| + public: |
| + STATIC_ASSERT(sizeof(Key*) == sizeof(void*)); // NOLINT |
| + STATIC_ASSERT(sizeof(Value*) == sizeof(void*)); // NOLINT |
| + struct value_type { |
|
rossberg
2012/03/14 16:29:03
Hm, value_type doesn't seem to fit. I'd call this
Sven Panne
2012/03/15 07:12:57
The whole point of this finger exercise was to be
|
| + Key* first; |
| + Value* second; |
| + }; |
| + |
| + class Iterator { |
| + public: |
| + Iterator& operator++() { |
| + entry_ = map_->Next(entry_); |
| + return *this; |
| + } |
| + |
| + value_type* operator->() { return reinterpret_cast<value_type*>(entry_); } |
| + bool operator!=(const Iterator& other) { return entry_ != other.entry_; } |
| + |
| + private: |
| + Iterator(const TemplateHashMapImpl<AllocationPolicy>* map, |
| + typename TemplateHashMapImpl<AllocationPolicy>::Entry* entry) : |
| + map_(map), entry_(entry) { } |
| + |
| + const TemplateHashMapImpl<AllocationPolicy>* map_; |
| + typename TemplateHashMapImpl<AllocationPolicy>::Entry* entry_; |
| + |
| + friend class TemplateHashMap; |
| + }; |
| + |
| + TemplateHashMap( |
| + typename TemplateHashMapImpl<AllocationPolicy>::MatchFun match) |
| + : TemplateHashMapImpl<AllocationPolicy>(match) { } |
| + |
| + Iterator begin() const { return Iterator(this, this->Start()); } |
| + Iterator end() const { return Iterator(this, NULL); } |
| + Iterator find(Key* key, bool insert = false) { |
| + return Iterator(this, Lookup(key, key->Hash(), insert)); |
| + } |
| +}; |
| + |
| } } // namespace v8::internal |
| #endif // V8_HASHMAP_H_ |