| Index: src/base/hashmap.h | 
| diff --git a/src/base/hashmap.h b/src/base/hashmap.h | 
| index ce72f84d2ad05a3f1b4e5d03fa80b9e208f7e774..d8151861cbe070457560602aab02768927d60b93 100644 | 
| --- a/src/base/hashmap.h | 
| +++ b/src/base/hashmap.h | 
| @@ -36,8 +36,8 @@ class TemplateHashMapImpl { | 
|  | 
| // initial_capacity is the size of the initial hash map; | 
| // it must be a power of 2 (and thus must not be 0). | 
| -  TemplateHashMapImpl(MatchFun match = MatchFun(), | 
| -                      uint32_t capacity = kDefaultHashMapCapacity, | 
| +  TemplateHashMapImpl(uint32_t capacity = kDefaultHashMapCapacity, | 
| +                      MatchFun match = MatchFun(), | 
| AllocationPolicy allocator = AllocationPolicy()); | 
|  | 
| ~TemplateHashMapImpl(); | 
| @@ -93,6 +93,8 @@ class TemplateHashMapImpl { | 
| Entry* map_; | 
| uint32_t capacity_; | 
| uint32_t occupancy_; | 
| +  // TODO(leszeks): This takes up space even if it has no state, maybe replace | 
| +  // with something that does the empty base optimisation e.g. std::tuple | 
| MatchFun match_; | 
|  | 
| Entry* map_end() const { return map_ + capacity_; } | 
| @@ -106,7 +108,7 @@ class TemplateHashMapImpl { | 
| template <typename Key, typename Value, typename MatchFun, | 
| class AllocationPolicy> | 
| TemplateHashMapImpl<Key, Value, MatchFun, AllocationPolicy>:: | 
| -    TemplateHashMapImpl(MatchFun match, uint32_t initial_capacity, | 
| +    TemplateHashMapImpl(uint32_t initial_capacity, MatchFun match, | 
| AllocationPolicy allocator) | 
| : match_(match) { | 
| Initialize(initial_capacity, allocator); | 
| @@ -336,7 +338,7 @@ void TemplateHashMapImpl<Key, Value, MatchFun, AllocationPolicy>::Resize( | 
| } | 
|  | 
| template <typename AllocationPolicy> | 
| -class PointerTemplateHashMapImpl | 
| +class CustomMatcherTemplateHashMapImpl | 
| : public TemplateHashMapImpl<void*, void*, bool (*)(void*, void*), | 
| AllocationPolicy> { | 
| typedef TemplateHashMapImpl<void*, void*, bool (*)(void*, void*), | 
| @@ -346,24 +348,38 @@ class PointerTemplateHashMapImpl | 
| public: | 
| typedef bool (*MatchFun)(void*, void*); | 
|  | 
| -  PointerTemplateHashMapImpl(MatchFun match = PointersMatch, | 
| -                             uint32_t capacity = Base::kDefaultHashMapCapacity, | 
| -                             AllocationPolicy allocator = AllocationPolicy()) | 
| -      : Base(match, capacity, allocator) {} | 
| +  CustomMatcherTemplateHashMapImpl( | 
| +      MatchFun match, uint32_t capacity = Base::kDefaultHashMapCapacity, | 
| +      AllocationPolicy allocator = AllocationPolicy()) | 
| +      : Base(capacity, match, allocator) {} | 
| +}; | 
| + | 
| +typedef CustomMatcherTemplateHashMapImpl<DefaultAllocationPolicy> | 
| +    CustomMatcherHashMap; | 
| + | 
| +template <typename AllocationPolicy> | 
| +class PointerTemplateHashMapImpl | 
| +    : public TemplateHashMapImpl<void*, void*, std::equal_to<void*>, | 
| +                                 AllocationPolicy> { | 
| +  typedef TemplateHashMapImpl<void*, void*, std::equal_to<void*>, | 
| +                              AllocationPolicy> | 
| +      Base; | 
|  | 
| -  static bool PointersMatch(void* key1, void* key2) { return key1 == key2; } | 
| + public: | 
| +  PointerTemplateHashMapImpl(uint32_t capacity = Base::kDefaultHashMapCapacity, | 
| +                             AllocationPolicy allocator = AllocationPolicy()) | 
| +      : Base(capacity, std::equal_to<void*>(), allocator) {} | 
| }; | 
|  | 
| typedef PointerTemplateHashMapImpl<DefaultAllocationPolicy> HashMap; | 
|  | 
| // A hash map for pointer keys and values with an STL-like interface. | 
| -template <class Key, class Value, class AllocationPolicy> | 
| -class TemplateHashMap : private PointerTemplateHashMapImpl<AllocationPolicy> { | 
| -  typedef PointerTemplateHashMapImpl<AllocationPolicy> Base; | 
| +template <class Key, class Value, class MatchFun, class AllocationPolicy> | 
| +class TemplateHashMap | 
| +    : private TemplateHashMapImpl<void*, void*, MatchFun, AllocationPolicy> { | 
| +  typedef TemplateHashMapImpl<void*, void*, MatchFun, AllocationPolicy> Base; | 
|  | 
| public: | 
| -  typedef bool (*MatchFun)(void*, void*); | 
| - | 
| STATIC_ASSERT(sizeof(Key*) == sizeof(void*));    // NOLINT | 
| STATIC_ASSERT(sizeof(Value*) == sizeof(void*));  // NOLINT | 
| struct value_type { | 
| @@ -393,7 +409,7 @@ class TemplateHashMap : private PointerTemplateHashMapImpl<AllocationPolicy> { | 
|  | 
| TemplateHashMap(MatchFun match, | 
| AllocationPolicy allocator = AllocationPolicy()) | 
| -      : Base(match, Base::kDefaultHashMapCapacity, allocator) {} | 
| +      : Base(Base::kDefaultHashMapCapacity, match, allocator) {} | 
|  | 
| Iterator begin() const { return Iterator(this, this->Start()); } | 
| Iterator end() const { return Iterator(this, nullptr); } | 
|  |