forked from boostorg/unordered
Implement initial draft of heterogeneous extract()
This commit is contained in:
@@ -3655,14 +3655,15 @@ namespace boost {
|
||||
|
||||
// Extract and erase
|
||||
|
||||
inline node_pointer extract_by_key(const_key_type& k)
|
||||
template <class Key> node_pointer extract_by_key_impl(Key const& k)
|
||||
{
|
||||
if (!this->size_) {
|
||||
return node_pointer();
|
||||
}
|
||||
std::size_t key_hash = this->hash(k);
|
||||
std::size_t key_hash = policy::apply_hash(this->hash_function(), k);
|
||||
std::size_t bucket_index = this->hash_to_bucket(key_hash);
|
||||
link_pointer prev = this->find_previous_node(k, bucket_index);
|
||||
link_pointer prev =
|
||||
this->find_previous_node_impl(this->key_eq(), k, bucket_index);
|
||||
if (!prev) {
|
||||
return node_pointer();
|
||||
}
|
||||
@@ -3679,6 +3680,11 @@ namespace boost {
|
||||
return n;
|
||||
}
|
||||
|
||||
inline node_pointer extract_by_key(const_key_type& k)
|
||||
{
|
||||
return extract_by_key_impl(k);
|
||||
}
|
||||
|
||||
// Reserve and rehash
|
||||
|
||||
void reserve_for_insert(std::size_t);
|
||||
|
||||
@@ -427,7 +427,20 @@ namespace boost {
|
||||
|
||||
node_type extract(const key_type& k)
|
||||
{
|
||||
return node_type(table_.extract_by_key(k), table_.node_alloc());
|
||||
return node_type(table_.extract_by_key_impl(k), table_.node_alloc());
|
||||
}
|
||||
|
||||
template <class Key>
|
||||
typename boost::enable_if_c<
|
||||
detail::is_transparent<Key, H>::value &&
|
||||
detail::is_transparent<Key, P>::value &&
|
||||
!boost::is_convertible<Key, iterator>::value &&
|
||||
!boost::is_convertible<Key, const_iterator>::value,
|
||||
node_type>::type
|
||||
extract(BOOST_FWD_REF(Key) k)
|
||||
{
|
||||
return node_type(table_.extract_by_key_impl(boost::forward<Key>(k)),
|
||||
table_.node_alloc());
|
||||
}
|
||||
|
||||
insert_return_type insert(BOOST_RV_REF(node_type) np)
|
||||
|
||||
Reference in New Issue
Block a user