Index: compiled/StringMap.h |
=================================================================== |
--- a/compiled/StringMap.h |
+++ b/compiled/StringMap.h |
@@ -17,24 +17,38 @@ |
#pragma once |
#include <cstddef> |
#include "Map.h" |
#include "String.h" |
+class StringHash |
hub
2017/10/25 01:19:38
this is needed for the unordered_map<>. Otherwise
|
+{ |
+public: |
+ size_t operator()(const String& key) const |
+ { |
+ // FNV-1a hash function |
+ size_t result = 2166136261; |
+ for (size_t i = 0; i < key.length(); i++) |
+ result = (result ^ key[i]) * 16777619; |
+ return result; |
+ } |
+}; |
+ |
namespace StringMap_internal |
{ |
struct StringSetEntry |
{ |
typedef String key_type; |
typedef size_t size_type; |
DependentString first; |
+ static StringHash hashFunctor; |
StringSetEntry(const key_type& key = DependentString()) |
{ |
if (!key.is_invalid()) |
first.reset(key); |
} |
bool equals(const key_type& other) const |
@@ -54,21 +68,17 @@ |
void erase() |
{ |
first.erase(); |
} |
static size_type hash(const key_type& key) |
{ |
- // FNV-1a hash function |
- size_type result = 2166136261; |
- for (String::size_type i = 0; i < key.length(); i++) |
- result = (result ^ key[i]) * 16777619; |
- return result; |
+ return hashFunctor(key); |
} |
}; |
template<typename Value> |
struct StringMapEntry : StringSetEntry |
{ |
typedef StringSetEntry super; |
typedef Value value_type; |