diff --git a/test/cfoa/emplace_tests.cpp b/test/cfoa/emplace_tests.cpp index 23105cb7..cdb60103 100644 --- a/test/cfoa/emplace_tests.cpp +++ b/test/cfoa/emplace_tests.cpp @@ -52,7 +52,7 @@ namespace { struct lvalue_emplacer_type { - template void operator()(std::vector& values, X& x) + template void call_impl(std::vector& values, X& x) { static constexpr auto value_type_cardinality = value_cardinality::value; @@ -67,28 +67,33 @@ namespace { } }); BOOST_TEST_EQ(num_inserts, x.size()); - BOOST_TEST_EQ( - raii::default_constructor, value_type_cardinality * values.size()); - BOOST_TEST_EQ(raii::copy_constructor, 0u); - BOOST_TEST_GE(raii::move_constructor, value_type_cardinality * x.size()); + std::uint64_t const default_constructors = value_type_cardinality == 2 + ? values.size() + num_inserts + : values.size(); + BOOST_TEST_EQ(raii::default_constructor, default_constructors); BOOST_TEST_EQ(raii::copy_constructor, 0u); BOOST_TEST_EQ(raii::copy_assignment, 0u); BOOST_TEST_EQ(raii::move_assignment, 0u); } + template void operator()(std::vector& values, X& x) + { + static constexpr auto value_type_cardinality = + value_cardinality::value; + + call_impl(values, x); + BOOST_TEST_GE(raii::move_constructor, value_type_cardinality * x.size()); + } } lvalue_emplacer; struct norehash_lvalue_emplacer_type : public lvalue_emplacer_type { template void operator()(std::vector& values, X& x) { - static constexpr auto value_type_cardinality = - value_cardinality::value; - x.reserve(values.size()); - lvalue_emplacer_type::operator()(values, x); - BOOST_TEST_EQ(raii::move_constructor, value_type_cardinality * x.size()); + lvalue_emplacer_type::call_impl(values, x); + BOOST_TEST_EQ(raii::move_constructor, x.size()); } } norehash_lvalue_emplacer;