forked from boostorg/unordered
Add transparent try_emplace()
This commit is contained in:
@ -337,6 +337,17 @@ namespace boost {
|
|||||||
return table_.try_emplace(std::move(key), std::forward<Args>(args)...);
|
return table_.try_emplace(std::move(key), std::forward<Args>(args)...);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <class K, class... Args>
|
||||||
|
BOOST_FORCEINLINE typename std::enable_if<
|
||||||
|
boost::unordered::detail::transparent_non_iterable<K,
|
||||||
|
unordered_flat_map>::value,
|
||||||
|
std::pair<iterator, bool> >::type
|
||||||
|
try_emplace(K&& key, Args&&... args)
|
||||||
|
{
|
||||||
|
return table_.try_emplace(
|
||||||
|
std::forward<K>(key), std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
template <class... Args>
|
template <class... Args>
|
||||||
BOOST_FORCEINLINE iterator try_emplace(
|
BOOST_FORCEINLINE iterator try_emplace(
|
||||||
const_iterator, key_type const& key, Args&&... args)
|
const_iterator, key_type const& key, Args&&... args)
|
||||||
@ -352,6 +363,18 @@ namespace boost {
|
|||||||
.first;
|
.first;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <class K, class... Args>
|
||||||
|
BOOST_FORCEINLINE typename std::enable_if<
|
||||||
|
boost::unordered::detail::transparent_non_iterable<K,
|
||||||
|
unordered_flat_map>::value,
|
||||||
|
iterator>::type
|
||||||
|
try_emplace(const_iterator, K&& key, Args&&... args)
|
||||||
|
{
|
||||||
|
return table_
|
||||||
|
.try_emplace(std::forward<K>(key), std::forward<Args>(args)...)
|
||||||
|
.first;
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_FORCEINLINE void erase(iterator pos) { table_.erase(pos); }
|
BOOST_FORCEINLINE void erase(iterator pos) { table_.erase(pos); }
|
||||||
BOOST_FORCEINLINE void erase(const_iterator pos)
|
BOOST_FORCEINLINE void erase(const_iterator pos)
|
||||||
{
|
{
|
||||||
|
@ -486,6 +486,16 @@ namespace boost {
|
|||||||
boost::move(k), boost::forward<Args>(args)...);
|
boost::move(k), boost::forward<Args>(args)...);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <class Key, class... Args>
|
||||||
|
typename boost::enable_if_c<
|
||||||
|
detail::transparent_non_iterable<Key, unordered_map>::value,
|
||||||
|
std::pair<iterator, bool> >::type
|
||||||
|
try_emplace(Key&& k, Args&&... args)
|
||||||
|
{
|
||||||
|
return table_.try_emplace_unique(
|
||||||
|
boost::forward<Key>(k), boost::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
template <class... Args>
|
template <class... Args>
|
||||||
iterator try_emplace(
|
iterator try_emplace(
|
||||||
const_iterator hint, key_type const& k, BOOST_FWD_REF(Args)... args)
|
const_iterator hint, key_type const& k, BOOST_FWD_REF(Args)... args)
|
||||||
@ -502,6 +512,16 @@ namespace boost {
|
|||||||
hint, boost::move(k), boost::forward<Args>(args)...);
|
hint, boost::move(k), boost::forward<Args>(args)...);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <class Key, class... Args>
|
||||||
|
typename boost::enable_if_c<
|
||||||
|
detail::transparent_non_iterable<Key, unordered_map>::value,
|
||||||
|
iterator>::type
|
||||||
|
try_emplace(const_iterator hint, Key&& k, Args&&... args)
|
||||||
|
{
|
||||||
|
return table_.try_emplace_hint_unique(
|
||||||
|
hint, boost::forward<Key>(k), boost::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
// In order to make this a template, this handles both:
|
// In order to make this a template, this handles both:
|
||||||
@ -582,6 +602,43 @@ namespace boost {
|
|||||||
boost::forward<A1>(a1), boost::forward<A2>(a2)));
|
boost::forward<A1>(a1), boost::forward<A2>(a2)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// try_emplace(Key&&, Args&&...)
|
||||||
|
|
||||||
|
template <typename Key, typename A0>
|
||||||
|
typename boost::enable_if_c<
|
||||||
|
detail::transparent_non_iterable<Key, unordered_map>::value,
|
||||||
|
std::pair<iterator, bool> >::type
|
||||||
|
try_emplace(BOOST_FWD_REF(Key) k, BOOST_FWD_REF(A0) a0)
|
||||||
|
{
|
||||||
|
return table_.try_emplace_unique(
|
||||||
|
boost::forward<Key>(k), boost::unordered::detail::create_emplace_args(
|
||||||
|
boost::forward<A0>(a0)));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Key, typename A0, typename A1>
|
||||||
|
typename boost::enable_if_c<
|
||||||
|
detail::transparent_non_iterable<Key, unordered_map>::value,
|
||||||
|
std::pair<iterator, bool> >::type
|
||||||
|
try_emplace(
|
||||||
|
BOOST_FWD_REF(Key) k, BOOST_FWD_REF(A0) a0, BOOST_FWD_REF(A1) a1)
|
||||||
|
{
|
||||||
|
return table_.try_emplace_unique(boost::forward<Key>(k),
|
||||||
|
boost::unordered::detail::create_emplace_args(
|
||||||
|
boost::forward<A0>(a0), boost::forward<A1>(a1)));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Key, typename A0, typename A1, typename A2>
|
||||||
|
typename boost::enable_if_c<
|
||||||
|
detail::transparent_non_iterable<Key, unordered_map>::value,
|
||||||
|
std::pair<iterator, bool> >::type
|
||||||
|
try_emplace(BOOST_FWD_REF(Key) k, BOOST_FWD_REF(A0) a0,
|
||||||
|
BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2)
|
||||||
|
{
|
||||||
|
return table_.try_emplace_unique(boost::forward<Key>(k),
|
||||||
|
boost::unordered::detail::create_emplace_args(boost::forward<A0>(a0),
|
||||||
|
boost::forward<A1>(a1), boost::forward<A2>(a2)));
|
||||||
|
}
|
||||||
|
|
||||||
// try_emplace(const_iterator hint, key const&, Args&&...)
|
// try_emplace(const_iterator hint, key const&, Args&&...)
|
||||||
|
|
||||||
template <typename A0>
|
template <typename A0>
|
||||||
@ -640,6 +697,44 @@ namespace boost {
|
|||||||
boost::forward<A1>(a1), boost::forward<A2>(a2)));
|
boost::forward<A1>(a1), boost::forward<A2>(a2)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// try_emplace(const_iterator hint, Key&&, Args&&...)
|
||||||
|
|
||||||
|
template <typename Key, typename A0>
|
||||||
|
typename boost::enable_if_c<
|
||||||
|
detail::transparent_non_iterable<Key, unordered_map>::value,
|
||||||
|
iterator>::type
|
||||||
|
try_emplace(
|
||||||
|
const_iterator hint, BOOST_FWD_REF(Key) k, BOOST_FWD_REF(A0) a0)
|
||||||
|
{
|
||||||
|
return table_.try_emplace_hint_unique(hint, boost::forward<Key>(k),
|
||||||
|
boost::unordered::detail::create_emplace_args(
|
||||||
|
boost::forward<A0>(a0)));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Key, typename A0, typename A1>
|
||||||
|
typename boost::enable_if_c<
|
||||||
|
detail::transparent_non_iterable<Key, unordered_map>::value,
|
||||||
|
iterator>::type
|
||||||
|
try_emplace(const_iterator hint, BOOST_FWD_REF(Key) k,
|
||||||
|
BOOST_FWD_REF(A0) a0, BOOST_FWD_REF(A1) a1)
|
||||||
|
{
|
||||||
|
return table_.try_emplace_hint_unique(hint, boost::forward<Key>(k),
|
||||||
|
boost::unordered::detail::create_emplace_args(
|
||||||
|
boost::forward<A0>(a0), boost::forward<A1>(a1)));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Key, typename A0, typename A1, typename A2>
|
||||||
|
typename boost::enable_if_c<
|
||||||
|
detail::transparent_non_iterable<Key, unordered_map>::value,
|
||||||
|
iterator>::type
|
||||||
|
try_emplace(const_iterator hint, BOOST_FWD_REF(Key) k,
|
||||||
|
BOOST_FWD_REF(A0) a0, BOOST_FWD_REF(A1) a1, BOOST_FWD_REF(A2) a2)
|
||||||
|
{
|
||||||
|
return table_.try_emplace_hint_unique(hint, boost::forward<Key>(k),
|
||||||
|
boost::unordered::detail::create_emplace_args(boost::forward<A0>(a0),
|
||||||
|
boost::forward<A1>(a1), boost::forward<A2>(a2)));
|
||||||
|
}
|
||||||
|
|
||||||
#define BOOST_UNORDERED_TRY_EMPLACE(z, n, _) \
|
#define BOOST_UNORDERED_TRY_EMPLACE(z, n, _) \
|
||||||
\
|
\
|
||||||
template <BOOST_PP_ENUM_PARAMS_Z(z, n, typename A)> \
|
template <BOOST_PP_ENUM_PARAMS_Z(z, n, typename A)> \
|
||||||
|
Reference in New Issue
Block a user