Index: compiled/StringMap.h |
=================================================================== |
--- a/compiled/StringMap.h |
+++ b/compiled/StringMap.h |
@@ -112,32 +112,26 @@ |
void operator=(const HashContainer& other); |
protected: |
static constexpr size_type MIN_BUCKETS = 1; |
static constexpr double LOAD_FACTOR = 0.8; |
std::unique_ptr<entry_type[]> mBuckets; |
size_type mBucketCount; |
size_type mEntryCount; |
+ size_type mExpectedEntries; |
Wladimir Palant
2017/10/09 08:39:46
No point recalculating bucket count if the map is
|
#if defined(DEBUG) |
size_type mInsertCounter; |
#endif |
explicit HashContainer(size_type expectedEntries = 0) |
- : mEntryCount(0) |
+ : mEntryCount(0), mExpectedEntries(expectedEntries) |
{ |
- expectedEntries = ceil(expectedEntries / LOAD_FACTOR); |
- mBucketCount = MIN_BUCKETS; |
- while (mBucketCount < expectedEntries) |
- mBucketCount <<= 1; |
- |
- mBuckets.reset(new entry_type[mBucketCount]); |
- // Working around https://github.com/waywardmonkeys/emscripten-trace-collector/issues/2 here |
- annotate_address(reinterpret_cast<size_type*>(mBuckets.get()) - 1, "Hash table buffer"); |
+ init(expectedEntries); |
} |
static size_type hash(const String& str) |
{ |
// FNV-1a hash function |
size_type result = 2166136261; |
for (String::size_type i = 0; i < str.length(); i++) |
result = (result ^ str[i]) * 16777619; |
@@ -232,16 +226,35 @@ |
{ |
return const_iterator(&mBuckets[mBucketCount], &mBuckets[mBucketCount]); |
} |
size_type size() const |
{ |
return mEntryCount; |
} |
+ |
+ void clear() |
+ { |
+ mEntryCount = 0; |
+ init(mExpectedEntries); |
Wladimir Palant
2017/10/09 08:39:45
IMHO, the shared function between constructor and
|
+ } |
+ |
+ private: |
+ void init(size_type expectedEntries) |
+ { |
+ expectedEntries = ceil(expectedEntries / LOAD_FACTOR); |
+ mBucketCount = MIN_BUCKETS; |
+ while (mBucketCount < expectedEntries) |
+ mBucketCount <<= 1; |
+ |
+ mBuckets.reset(new entry_type[mBucketCount]); |
+ // Working around https://github.com/waywardmonkeys/emscripten-trace-collector/issues/2 here |
+ annotate_address(reinterpret_cast<size_type*>(mBuckets.get()) - 1, "Hash table buffer"); |
+ } |
}; |
struct StringSetEntry |
{ |
StringSetEntry() {} |
StringSetEntry(const String& key) |
: first(key) |
{ |