Chromium Code Reviews| Index: runtime/bin/hashmap.h |
| diff --git a/runtime/bin/hashmap.h b/runtime/bin/hashmap.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..4c6564ed345c933cde44cecba86701f7dc842916 |
| --- /dev/null |
| +++ b/runtime/bin/hashmap.h |
| @@ -0,0 +1,77 @@ |
| +// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| +// for details. All rights reserved. Use of this source code is governed by a |
| +// BSD-style license that can be found in the LICENSE file. |
| + |
| +#ifndef BIN_HASHMAP_H_ |
| +#define BIN_HASHMAP_H_ |
| + |
| +#include "platform/globals.h" |
| + |
| +class HashMap { |
| + public: |
| + typedef bool (*MatchFun) (void* key1, void* key2); |
| + |
| + static bool SamePointerValue(void* key1, void* key2) { |
| + return key1 == key2; |
| + } |
| + |
| + // initial_capacity is the size of the initial hash map; |
| + // it must be a power of 2 (and thus must not be 0). |
| + HashMap(MatchFun match = &SamePointerValue, uint32_t initial_capacity = 8); |
| + |
| + ~HashMap(); |
| + |
| + // HashMap entries are (key, value, hash) triplets. |
| + // Some clients may not need to use the value slot |
| + // (e.g. implementers of sets, where the key is the value). |
| + struct Entry { |
| + void* key; |
| + void* value; |
| + uint32_t hash; // The full hash value for key. |
| + }; |
| + |
| + // If an entry with matching key is found, Lookup() |
| + // returns that entry. If no matching entry is found, |
| + // but insert is set, a new entry is inserted with |
| + // corresponding key, key hash, and NULL value. |
| + // Otherwise, NULL is returned. |
| + Entry* Lookup(void* key, uint32_t hash, bool insert); |
| + |
| + // Removes the entry with matching key. |
| + void Remove(void* key, uint32_t hash); |
| + |
| + // Empties the hash map (occupancy() == 0). |
| + void Clear(); |
| + |
| + // The number of (non-empty) entries in the table. |
| + uint32_t occupancy() const { return occupancy_; } |
|
Ivan Posva
2012/01/17 07:57:41
We have been using intptr_t for sizes all across t
Søren Gjesse
2012/01/17 09:28:04
Done.
|
| + |
| + // The capacity of the table. The implementation |
| + // makes sure that occupancy is at most 80% of |
| + // the table capacity. |
| + uint32_t capacity() const { return capacity_; } |
|
Ivan Posva
2012/01/17 07:57:41
ditto.
Søren Gjesse
2012/01/17 09:28:04
Done.
|
| + |
| + // Iteration |
| + // |
| + // for (Entry* p = map.Start(); p != NULL; p = map.Next(p)) { |
| + // ... |
| + // } |
| + // |
| + // If entries are inserted during iteration, the effect of |
| + // calling Next() is undefined. |
| + Entry* Start() const; |
| + Entry* Next(Entry* p) const; |
| + |
| + private: |
| + MatchFun match_; |
| + Entry* map_; |
| + uint32_t capacity_; |
| + uint32_t occupancy_; |
| + |
| + Entry* map_end() const { return map_ + capacity_; } |
| + Entry* Probe(void* key, uint32_t hash); |
| + void Initialize(uint32_t capacity); |
| + void Resize(); |
| +}; |
| + |
| +#endif // BIN_HASHMAP_H_ |