Index: compiled/StringMap.h |
=================================================================== |
--- a/compiled/StringMap.h |
+++ b/compiled/StringMap.h |
@@ -13,25 +13,48 @@ |
* |
* You should have received a copy of the GNU General Public License |
* along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
*/ |
#pragma once |
#include <cstddef> |
+#include <type_traits> |
#include "Map.h" |
#include "String.h" |
+namespace { |
+ size_t stringHash(const String& key) |
+ { |
+ // FNV-1a hash function |
+ size_t result = 2166136261; |
+ for (size_t i = 0; i < key.length(); i++) |
+ result = (result ^ key[i]) * 16777619; |
+ return result; |
+ } |
+} |
+ |
+class StringHash |
sergei
2018/01/15 15:31:19
what about making it struct?
hub
2018/01/16 02:57:39
Done.
|
+{ |
+public: |
+ size_t operator()(const String& key) const |
+ { |
+ return stringHash(key); |
+ } |
+}; |
+ |
namespace StringMap_internal |
{ |
+ template<typename Key, |
+ class = typename std::enable_if<std::is_base_of<String, Key>::value>::type> |
struct StringSetEntry |
{ |
- typedef DependentString key_type; |
+ typedef Key key_type; |
typedef const String& key_type_cref; |
typedef size_t size_type; |
key_type first; |
StringSetEntry(key_type_cref key = key_type()) |
{ |
if (!key.is_invalid()) |
@@ -55,42 +78,40 @@ |
void erase() |
{ |
first.erase(); |
} |
static size_type hash(key_type_cref 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 stringHash(key); |
} |
}; |
- template<typename Value> |
- struct StringMapEntry : StringSetEntry |
+ template<typename Key, typename Value> |
+ struct StringMapEntry : StringSetEntry<Key> |
{ |
- typedef StringSetEntry super; |
+ typedef StringSetEntry<Key> super; |
typedef Value value_type; |
value_type second; |
- StringMapEntry(key_type_cref key = DependentString(), |
+ StringMapEntry(typename super::key_type_cref key = Key(), |
value_type value = value_type()) |
: super(key), second(value) |
{ |
} |
void erase() |
{ |
super::erase(); |
second = value_type(); |
} |
}; |
} |
-using StringSet = Set<StringMap_internal::StringSetEntry>; |
+using StringSet = Set<StringMap_internal::StringSetEntry<DependentString>>; |
template<typename Value> |
-using StringMap = Map<StringMap_internal::StringMapEntry<Value>>; |
+using StringMap = Map<StringMap_internal::StringMapEntry<DependentString, Value>>; |
+template<typename Value> |
+using OwnedStringMap = Map<StringMap_internal::StringMapEntry<OwnedString, Value>>; |