forked from boostorg/unordered
Implement try_emplace
This commit is contained in:
@@ -1721,6 +1721,35 @@ construct_node_pair(Alloc& alloc, BOOST_FWD_REF(Key) k, BOOST_FWD_REF(Mapped) m)
|
||||
BOOST_CATCH_END
|
||||
return a.release();
|
||||
}
|
||||
|
||||
template <typename Alloc, typename Key, BOOST_UNORDERED_EMPLACE_TEMPLATE>
|
||||
inline typename boost::unordered::detail::allocator_traits<Alloc>::pointer
|
||||
construct_node_pair_from_args(
|
||||
Alloc& alloc, BOOST_FWD_REF(Key) k, BOOST_UNORDERED_EMPLACE_ARGS)
|
||||
{
|
||||
node_constructor<Alloc> a(alloc);
|
||||
a.create_node();
|
||||
boost::unordered::detail::func::call_construct(
|
||||
alloc, boost::unordered::detail::func::const_cast_pointer(
|
||||
boost::addressof(a.node_->value_ptr()->first)),
|
||||
boost::forward<Key>(k));
|
||||
BOOST_TRY
|
||||
{
|
||||
boost::unordered::detail::func::construct_from_args(
|
||||
alloc, boost::unordered::detail::func::const_cast_pointer(
|
||||
boost::addressof(a.node_->value_ptr()->second)),
|
||||
BOOST_UNORDERED_EMPLACE_FORWARD);
|
||||
}
|
||||
BOOST_CATCH(...)
|
||||
{
|
||||
boost::unordered::detail::func::call_destroy(
|
||||
alloc, boost::unordered::detail::func::const_cast_pointer(
|
||||
boost::addressof(a.node_->value_ptr()->first)));
|
||||
BOOST_RETHROW;
|
||||
}
|
||||
BOOST_CATCH_END
|
||||
return a.release();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3547,22 +3576,6 @@ struct table_impl : boost::unordered::detail::table<Types>
|
||||
return this->add_node(b.release(), key_hash);
|
||||
}
|
||||
|
||||
value_type& operator[](const_key_type& k)
|
||||
{
|
||||
std::size_t key_hash = this->hash(k);
|
||||
node_pointer pos = this->find_node(key_hash, k);
|
||||
if (pos) {
|
||||
return pos->value();
|
||||
} else {
|
||||
return this
|
||||
->resize_and_add_node(
|
||||
boost::unordered::detail::func::construct_node_pair(
|
||||
this->node_alloc(), k),
|
||||
key_hash)
|
||||
->value();
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
|
||||
#if defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES)
|
||||
emplace_return emplace(boost::unordered::detail::emplace_args1<
|
||||
@@ -3704,6 +3717,64 @@ struct table_impl : boost::unordered::detail::table<Types>
|
||||
}
|
||||
}
|
||||
|
||||
template <typename Key>
|
||||
emplace_return try_emplace_impl(BOOST_FWD_REF(Key) k)
|
||||
{
|
||||
std::size_t key_hash = this->hash(k);
|
||||
node_pointer pos = this->find_node(key_hash, k);
|
||||
if (pos) {
|
||||
return emplace_return(iterator(pos), false);
|
||||
} else {
|
||||
return emplace_return(
|
||||
iterator(this->resize_and_add_node(
|
||||
boost::unordered::detail::func::construct_node_pair(
|
||||
this->node_alloc(), boost::forward<Key>(k)),
|
||||
key_hash)),
|
||||
true);
|
||||
}
|
||||
}
|
||||
|
||||
template <typename Key>
|
||||
iterator try_emplace_hint_impl(c_iterator hint, BOOST_FWD_REF(Key) k)
|
||||
{
|
||||
if (hint.node_ && this->key_eq()(hint->first, k)) {
|
||||
return iterator(hint.node_);
|
||||
} else {
|
||||
return try_emplace_impl(k).first;
|
||||
}
|
||||
}
|
||||
|
||||
template <typename Key, BOOST_UNORDERED_EMPLACE_TEMPLATE>
|
||||
emplace_return try_emplace_impl(
|
||||
BOOST_FWD_REF(Key) k, BOOST_UNORDERED_EMPLACE_ARGS)
|
||||
{
|
||||
std::size_t key_hash = this->hash(k);
|
||||
node_pointer pos = this->find_node(key_hash, k);
|
||||
if (pos) {
|
||||
return emplace_return(iterator(pos), false);
|
||||
} else {
|
||||
return emplace_return(
|
||||
iterator(this->resize_and_add_node(
|
||||
boost::unordered::detail::func::
|
||||
construct_node_pair_from_args(this->node_alloc(),
|
||||
boost::forward<Key>(k),
|
||||
BOOST_UNORDERED_EMPLACE_FORWARD),
|
||||
key_hash)),
|
||||
true);
|
||||
}
|
||||
}
|
||||
|
||||
template <typename Key, BOOST_UNORDERED_EMPLACE_TEMPLATE>
|
||||
iterator try_emplace_hint_impl(
|
||||
c_iterator hint, BOOST_FWD_REF(Key) k, BOOST_UNORDERED_EMPLACE_ARGS)
|
||||
{
|
||||
if (hint.node_ && this->key_eq()(hint->first, k)) {
|
||||
return iterator(hint.node_);
|
||||
} else {
|
||||
return try_emplace_impl(k, BOOST_UNORDERED_EMPLACE_FORWARD).first;
|
||||
}
|
||||
}
|
||||
|
||||
template <typename Key, typename M>
|
||||
emplace_return insert_or_assign_impl(
|
||||
BOOST_FWD_REF(Key) k, BOOST_FWD_REF(M) obj)
|
||||
|
||||
Reference in New Issue
Block a user