Add missing init_type overloads for insert(hint)

This commit is contained in:
Christian Mazakas
2022-10-24 11:17:05 -07:00
parent 375d7157b6
commit 955dab4637
2 changed files with 72 additions and 3 deletions

View File

@@ -231,12 +231,14 @@ namespace boost {
return table_.insert(std::move(value)); return table_.insert(std::move(value));
} }
iterator insert(const_iterator, value_type const& value) template <class Ty>
auto insert(const_iterator, Ty&& value)
-> decltype(table_.insert(std::forward<Ty>(value)).first)
{ {
return table_.insert(value).first; return table_.insert(std::forward<Ty>(value)).first;
} }
iterator insert(const_iterator, value_type&& value) iterator insert(const_iterator, init_type&& value)
{ {
return table_.insert(std::move(value)).first; return table_.insert(std::move(value)).first;
} }

View File

@@ -164,9 +164,76 @@ static void test_insert_tracking()
BOOST_TEST_EQ(raii_tracker::move_constructs, 7u + 2u * map.size()); 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<raii_tracker, raii_tracker,
std::hash<raii_tracker> >
map;
{
std::pair<raii_tracker, raii_tracker> 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<raii_tracker, raii_tracker> 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<raii_tracker const, raii_tracker> 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<raii_tracker const, raii_tracker> 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() int main()
{ {
test_move_only(); test_move_only();
test_insert_tracking(); test_insert_tracking();
test_insert_hint_tracking();
return boost::report_errors(); return boost::report_errors();
} }