From 55d4aaeef5731dd0899b75f2e481fe13ea2ebc27 Mon Sep 17 00:00:00 2001 From: Christian Mazakas Date: Fri, 25 Feb 2022 13:58:09 -0800 Subject: [PATCH] Update `node_handle_tests` to prove that nodes can be safely transferred between plain maps/sets and their multi- versions --- test/unordered/node_handle_tests.cpp | 138 +++++++++++++++++++++++++-- 1 file changed, 132 insertions(+), 6 deletions(-) diff --git a/test/unordered/node_handle_tests.cpp b/test/unordered/node_handle_tests.cpp index 2d5b1eab..89648d0f 100644 --- a/test/unordered/node_handle_tests.cpp +++ b/test/unordered/node_handle_tests.cpp @@ -245,6 +245,49 @@ UNORDERED_AUTO_TEST (node_handle_tests) { node_handle_tests_impl(x2); } +template +typename boost::unordered_map::iterator +insert_empty_node(boost::unordered_map& c) +{ + typedef + typename boost::unordered_map::node_type + node_type; + + return c.insert(node_type()).position; +} + +template +typename boost::unordered_set::iterator +insert_empty_node(boost::unordered_set& c) +{ + typedef typename boost::unordered_set::node_type + node_type; + + return c.insert(node_type()).position; +} + +template +typename boost::unordered_multimap::iterator +insert_empty_node( + boost::unordered_multimap& c) +{ + typedef typename boost::unordered_multimap::node_type node_type; + + return c.insert(node_type()); +} + +template +typename boost::unordered_multiset::iterator +insert_empty_node(boost::unordered_multiset& c) +{ + typedef + typename boost::unordered_multiset::node_type + node_type; + + return c.insert(node_type()); +} + template void insert_node_handle_unique(Container1& c1, Container2& c2) { @@ -253,14 +296,12 @@ void insert_node_handle_unique(Container1& c1, Container2& c2) BOOST_STATIC_ASSERT( (boost::is_same::value)); - typedef typename Container1::insert_return_type insert_return_type1; + typedef typename Container1::iterator iterator1; typedef typename Container2::insert_return_type insert_return_type2; - insert_return_type1 r1 = c1.insert(node_type()); + iterator1 r1 = insert_empty_node(c1); insert_return_type2 r2 = c2.insert(node_type()); - BOOST_TEST(!r1.inserted); - BOOST_TEST(!r1.node); - BOOST_TEST(r1.position == c1.end()); + BOOST_TEST(r1 == c1.end()); BOOST_TEST(!r2.inserted); BOOST_TEST(!r2.node); BOOST_TEST(r2.position == c2.end()); @@ -332,7 +373,7 @@ void insert_node_handle_equiv(Container1& c1, Container2& c2) typedef typename Container1::iterator iterator1; typedef typename Container2::iterator iterator2; - iterator1 r1 = c1.insert(node_type()); + iterator1 r1 = insert_empty_node(c1); iterator2 r2 = c2.insert(node_type()); BOOST_TEST(r1 == c1.end()); BOOST_TEST(r2 == c2.end()); @@ -368,6 +409,17 @@ UNORDERED_AUTO_TEST (insert_node_handle_unique_tests) { BOOST_TEST(x2.size() == 3); } + { + boost::unordered_multiset x1; + boost::unordered_set x2; + x1.emplace(100); + x1.emplace(140); + x1.emplace(-55); + x2.emplace(140); + insert_node_handle_unique(x1, x2); + BOOST_TEST(x2.size() == 3); + } + { boost::unordered_map x1; boost::unordered_map x2; @@ -379,6 +431,18 @@ UNORDERED_AUTO_TEST (insert_node_handle_unique_tests) { insert_node_handle_unique(x1, x2); BOOST_TEST(x2.size() == 4); } + + { + boost::unordered_multimap x1; + boost::unordered_map x2; + x1.emplace(67, 50); + x1.emplace(23, 45); + x1.emplace(18, 19); + x2.emplace(23, 50); + x2.emplace(12, 49); + insert_node_handle_unique(x1, x2); + BOOST_TEST(x2.size() == 4); + } } UNORDERED_AUTO_TEST (insert_node_handle_equiv_tests) { @@ -394,6 +458,45 @@ UNORDERED_AUTO_TEST (insert_node_handle_equiv_tests) { insert_node_handle_equiv(x1, x2); BOOST_TEST(x2.size() == 6); } + + { + boost::unordered_map x1; + boost::unordered_multimap x2; + x1.emplace(67, 50); + x1.emplace(67, 100); + x1.emplace(23, 45); + x1.emplace(18, 19); + x2.emplace(23, 50); + x2.emplace(12, 49); + insert_node_handle_equiv(x1, x2); + BOOST_TEST(x2.size() == 5); + } + + { + boost::unordered_multiset x1; + boost::unordered_multiset x2; + x1.emplace(67); + x1.emplace(67); + x1.emplace(23); + x1.emplace(18); + x2.emplace(23); + x2.emplace(12); + insert_node_handle_equiv(x1, x2); + BOOST_TEST(x2.size() == 6); + } + + { + boost::unordered_set x1; + boost::unordered_multiset x2; + x1.emplace(67); + x1.emplace(67); + x1.emplace(23); + x1.emplace(18); + x2.emplace(23); + x2.emplace(12); + insert_node_handle_equiv(x1, x2); + BOOST_TEST(x2.size() == 5); + } } UNORDERED_AUTO_TEST (insert_node_handle_unique_tests2) { @@ -408,6 +511,17 @@ UNORDERED_AUTO_TEST (insert_node_handle_unique_tests2) { BOOST_TEST(x2.size() == 3); } + { + boost::unordered_multiset x1; + boost::unordered_set x2; + x1.emplace(100); + x1.emplace(140); + x1.emplace(-55); + x2.emplace(140); + insert_node_handle_unique2(x1, x2); + BOOST_TEST(x2.size() == 3); + } + { boost::unordered_map x1; boost::unordered_map x2; @@ -419,6 +533,18 @@ UNORDERED_AUTO_TEST (insert_node_handle_unique_tests2) { insert_node_handle_unique2(x1, x2); BOOST_TEST(x2.size() == 4); } + + { + boost::unordered_multimap x1; + boost::unordered_map x2; + x1.emplace(67, 50); + x1.emplace(23, 45); + x1.emplace(18, 19); + x2.emplace(23, 50); + x2.emplace(12, 49); + insert_node_handle_unique2(x1, x2); + BOOST_TEST(x2.size() == 4); + } } RUN_TESTS()