| Index: compiled/StringMap.h |
| =================================================================== |
| --- a/compiled/StringMap.h |
| +++ b/compiled/StringMap.h |
| @@ -13,30 +13,53 @@ |
| * |
| * 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 |
| +{ |
| +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 String key_type; |
| typedef size_t size_type; |
| - DependentString first; |
| + Key first; |
| - StringSetEntry(const key_type& key = DependentString()) |
| + StringSetEntry(const key_type& key = Key()) |
| { |
| if (!key.is_invalid()) |
| first.reset(key); |
| } |
| bool equals(const key_type& other) const |
| { |
| return first.equals(other); |
| @@ -54,42 +77,40 @@ |
| 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 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 second; |
| - StringMapEntry(const key_type& key = DependentString(), |
| + StringMapEntry(const typename super::key_type& 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>>; |