Update insert(Iterator, Iterator) overloads to use emplace internally instead of insert()'ing

This commit is contained in:
Christian Mazakas
2022-10-21 11:24:34 -07:00
parent ad1e3a49a5
commit e0b680ac29
4 changed files with 35 additions and 3 deletions

View File

@ -1256,7 +1256,14 @@ public:
template<typename... Args>
BOOST_FORCEINLINE std::pair<iterator,bool> emplace(Args&&... args)
{
return emplace_impl(init_type(std::forward<Args>(args)...));
using emplace_type = typename std::conditional<
std::is_constructible<
init_type, Args...
>::value,
init_type,
value_type
>::type;
return emplace_impl(emplace_type(std::forward<Args>(args)...));
}
template<typename Key,typename... Args>

View File

@ -242,7 +242,7 @@ namespace boost {
void insert(InputIterator first, InputIterator last)
{
for (auto pos = first; pos != last; ++pos) {
table_.insert(*pos);
table_.emplace(*pos);
}
}

View File

@ -222,7 +222,7 @@ namespace boost {
void insert(InputIterator first, InputIterator last)
{
for (auto pos = first; pos != last; ++pos) {
table_.insert(*pos);
table_.emplace(*pos);
}
}

View File

@ -17,6 +17,8 @@
#include "../helpers/input_iterator.hpp"
#include "../helpers/helpers.hpp"
#include <vector>
namespace insert_tests {
test::seed_t initialize_seed(243432);
@ -674,6 +676,23 @@ namespace insert_tests {
}
}
template <class X> void set_tests(X*, test::random_generator)
{
// prove that our insert(iterator, iterator) implementation honors
// Cpp17EmplaceConstructible
//
X x;
std::vector<int> v;
v.reserve(1000);
for (unsigned i = 0; i < 1000; ++i) {
v.push_back(static_cast<int>(i));
}
x.insert(v.begin(), v.end());
BOOST_TEST_EQ(x.size(), 1000u);
}
template <class X>
void try_emplace_tests(X*, test::random_generator generator)
{
@ -909,6 +928,9 @@ namespace insert_tests {
UNORDERED_TEST(map_insert_range_test2,
((test_map))((default_generator)(generate_collisions)(limited_range)))
UNORDERED_TEST(
set_tests, ((test_set_std_alloc)(test_set))((default_generator)))
#else
boost::unordered_set<test::movable, test::hash, test::equal_to,
std::allocator<test::movable> >* test_set_std_alloc;
@ -965,6 +987,9 @@ namespace insert_tests {
UNORDERED_TEST(map_insert_range_test2,
((test_multimap_std_alloc)(test_map)(test_multimap))(
(default_generator)(generate_collisions)(limited_range)))
UNORDERED_TEST(
set_tests, ((test_set_std_alloc)(test_set)(test_multiset))((default_generator)))
#endif
#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)