Replace _Equal_helper with simpler class template
By defining the new helper inside _Hashtable_base it doesn't need all the template parameters to be provided, and by making it only responsible for checking a possibly-cached hash code it only has to do one thing. The caller can use the equality predicate itself instead of duplicating that in the helper template. * include/bits/hashtable_policy.h (_Equal_helper): Remove. (_Hashtable_base::_Equal_hash_code): Define new class template. (_Hashtable_base::_M_equals): Use _Equal_hash_code instead of _Equal_helper. From-SVN: r271291
This commit is contained in:
parent
1f6ea96860
commit
eba20412b4
|
@ -1,5 +1,10 @@
|
|||
2019-05-16 Jonathan Wakely <jwakely@redhat.com>
|
||||
|
||||
* include/bits/hashtable_policy.h (_Equal_helper): Remove.
|
||||
(_Hashtable_base::_Equal_hash_code): Define new class template.
|
||||
(_Hashtable_base::_M_equals): Use _Equal_hash_code instead of
|
||||
_Equal_helper.
|
||||
|
||||
* include/bits/hashtable_policy.h (_Hashtable_ebo_helper::_S_get):
|
||||
Replace with _M_get non-static member function.
|
||||
(_Hashtable_ebo_helper::_S_cget): Replace with _M_cget non-static
|
||||
|
|
|
@ -1403,38 +1403,6 @@ namespace __detail
|
|||
_M_h2() const { return __ebo_h2::_M_cget(); }
|
||||
};
|
||||
|
||||
/**
|
||||
* Primary class template _Equal_helper.
|
||||
*
|
||||
*/
|
||||
template <typename _Key, typename _Value, typename _ExtractKey,
|
||||
typename _Equal, typename _HashCodeType,
|
||||
bool __cache_hash_code>
|
||||
struct _Equal_helper;
|
||||
|
||||
/// Specialization.
|
||||
template<typename _Key, typename _Value, typename _ExtractKey,
|
||||
typename _Equal, typename _HashCodeType>
|
||||
struct _Equal_helper<_Key, _Value, _ExtractKey, _Equal, _HashCodeType, true>
|
||||
{
|
||||
static bool
|
||||
_S_equals(const _Equal& __eq, const _ExtractKey& __extract,
|
||||
const _Key& __k, _HashCodeType __c, _Hash_node<_Value, true>* __n)
|
||||
{ return __c == __n->_M_hash_code && __eq(__k, __extract(__n->_M_v())); }
|
||||
};
|
||||
|
||||
/// Specialization.
|
||||
template<typename _Key, typename _Value, typename _ExtractKey,
|
||||
typename _Equal, typename _HashCodeType>
|
||||
struct _Equal_helper<_Key, _Value, _ExtractKey, _Equal, _HashCodeType, false>
|
||||
{
|
||||
static bool
|
||||
_S_equals(const _Equal& __eq, const _ExtractKey& __extract,
|
||||
const _Key& __k, _HashCodeType, _Hash_node<_Value, false>* __n)
|
||||
{ return __eq(__k, __extract(__n->_M_v())); }
|
||||
};
|
||||
|
||||
|
||||
/// Partial specialization used when nodes contain a cached hash code.
|
||||
template<typename _Key, typename _Value, typename _ExtractKey,
|
||||
typename _H1, typename _H2, typename _Hash>
|
||||
|
@ -1788,8 +1756,22 @@ namespace __detail
|
|||
iterator>::type;
|
||||
private:
|
||||
using _EqualEBO = _Hashtable_ebo_helper<0, _Equal>;
|
||||
using _EqualHelper = _Equal_helper<_Key, _Value, _ExtractKey, _Equal,
|
||||
__hash_code, __hash_cached::value>;
|
||||
|
||||
template<typename _NodeT>
|
||||
struct _Equal_hash_code
|
||||
{
|
||||
static bool
|
||||
_S_equals(__hash_code, const _NodeT&)
|
||||
{ return true; }
|
||||
};
|
||||
|
||||
template<typename _Ptr2>
|
||||
struct _Equal_hash_code<_Hash_node<_Ptr2, true>>
|
||||
{
|
||||
static bool
|
||||
_S_equals(__hash_code __c, const _Hash_node<_Ptr2, true>& __n)
|
||||
{ return __c == __n._M_hash_code; }
|
||||
};
|
||||
|
||||
protected:
|
||||
_Hashtable_base() = default;
|
||||
|
@ -1801,8 +1783,8 @@ namespace __detail
|
|||
bool
|
||||
_M_equals(const _Key& __k, __hash_code __c, __node_type* __n) const
|
||||
{
|
||||
return _EqualHelper::_S_equals(_M_eq(), this->_M_extract(),
|
||||
__k, __c, __n);
|
||||
return _Equal_hash_code<__node_type>::_S_equals(__c, *__n)
|
||||
&& _M_eq()(__k, this->_M_extract()(__n->_M_v()));
|
||||
}
|
||||
|
||||
void
|
||||
|
|
Loading…
Reference in New Issue