From 955dab463756989f34bd02f89791aefa303f2741 Mon Sep 17 00:00:00 2001 From: Christian Mazakas Date: Mon, 24 Oct 2022 11:17:05 -0700 Subject: [PATCH] Add missing init_type overloads for insert(hint) --- .../boost/unordered/unordered_flat_map.hpp | 8 ++- test/unordered/init_type_insert_tests.cpp | 67 +++++++++++++++++++ 2 files changed, 72 insertions(+), 3 deletions(-) diff --git a/include/boost/unordered/unordered_flat_map.hpp b/include/boost/unordered/unordered_flat_map.hpp index 82aa4f16..aa39fcfd 100644 --- a/include/boost/unordered/unordered_flat_map.hpp +++ b/include/boost/unordered/unordered_flat_map.hpp @@ -231,12 +231,14 @@ namespace boost { return table_.insert(std::move(value)); } - iterator insert(const_iterator, value_type const& value) + template + auto insert(const_iterator, Ty&& value) + -> decltype(table_.insert(std::forward(value)).first) { - return table_.insert(value).first; + return table_.insert(std::forward(value)).first; } - iterator insert(const_iterator, value_type&& value) + iterator insert(const_iterator, init_type&& value) { return table_.insert(std::move(value)).first; } diff --git a/test/unordered/init_type_insert_tests.cpp b/test/unordered/init_type_insert_tests.cpp index 94afce4b..efa1df37 100644 --- a/test/unordered/init_type_insert_tests.cpp +++ b/test/unordered/init_type_insert_tests.cpp @@ -164,9 +164,76 @@ static void test_insert_tracking() BOOST_TEST_EQ(raii_tracker::move_constructs, 7u + 2u * map.size()); } +static void test_insert_hint_tracking() +{ + raii_tracker::reset_counts(); + + BOOST_TEST_EQ(raii_tracker::copy_constructs, 0u); + BOOST_TEST_EQ(raii_tracker::move_constructs, 0u); + + boost::unordered_flat_map > + map; + + { + std::pair value{1, 2}; + + map.insert(map.begin(), value); + + BOOST_TEST_EQ(raii_tracker::copy_constructs, 2u); + BOOST_TEST_EQ(raii_tracker::move_constructs, 0u); + } + + { + std::pair value{2, 3}; + + map.insert(std::move(value)); + + BOOST_TEST_EQ(raii_tracker::copy_constructs, 2u); + BOOST_TEST_EQ(raii_tracker::move_constructs, 2u); + } + + { + std::pair value{3, 4}; + + map.insert(map.begin(), value); + + BOOST_TEST_EQ(raii_tracker::copy_constructs, 4u); + BOOST_TEST_EQ(raii_tracker::move_constructs, 2u); + } + + { + std::pair value{4, 5}; + + map.insert(map.begin(), std::move(value)); + + BOOST_TEST_EQ(raii_tracker::copy_constructs, 5u); + BOOST_TEST_EQ(raii_tracker::move_constructs, 3u); + } + + { + map.insert(map.begin(), std::make_pair(5, 6)); + BOOST_TEST_EQ(raii_tracker::copy_constructs, 5u); + BOOST_TEST_EQ(raii_tracker::move_constructs, 5u); + } + + { + map.insert(map.begin(), {6, 7}); + BOOST_TEST_EQ(raii_tracker::copy_constructs, 5u); + BOOST_TEST_EQ(raii_tracker::move_constructs, 7u); + } + + BOOST_TEST_EQ(map.size(), 6u); + + map.rehash(1024); + BOOST_TEST_EQ(raii_tracker::copy_constructs, 5u); + BOOST_TEST_EQ(raii_tracker::move_constructs, 7u + 2u * map.size()); +} + int main() { test_move_only(); test_insert_tracking(); + test_insert_hint_tracking(); return boost::report_errors(); }