Optimize emplace() for exactly a value_type or init_type argument (#227)

* Add structs to count special member functions

* Add failing emplace tests, that will pass after making the optimization

* Optimize emplace() to not allocate when we already have a value_type or init_type

* Fix newly failing cfoa tests
This commit is contained in:
Braden Ganetsky
2023-12-31 11:56:14 -06:00
committed by GitHub
parent 75a94781d5
commit 67c5cdb3a6
10 changed files with 418 additions and 37 deletions
+12 -22
View File
@@ -968,11 +968,9 @@ namespace {
BOOST_TEST_EQ(x.key_eq(), key_equal(2));
BOOST_TEST_EQ(
raii::copy_constructor, value_type_cardinality * values.size());
BOOST_TEST_EQ(
raii::destructor, value_type_cardinality * values.size());
BOOST_TEST_EQ(
raii::move_constructor, value_type_cardinality * reference_cont.size());
raii::copy_constructor, value_type_cardinality * reference_cont.size());
BOOST_TEST_EQ(raii::destructor, 0u);
BOOST_TEST_EQ(raii::move_constructor, 0u);
BOOST_TEST_EQ(raii::copy_assignment, 0u);
BOOST_TEST_EQ(raii::move_assignment, 0u);
}
@@ -998,11 +996,9 @@ namespace {
BOOST_TEST_EQ(flat.key_eq(), key_equal(2));
BOOST_TEST_EQ(
raii::copy_constructor, value_type_cardinality * values.size());
BOOST_TEST_EQ(
raii::destructor, value_type_cardinality * values.size());
BOOST_TEST_EQ(
raii::move_constructor, value_type_cardinality * reference_cont.size());
raii::copy_constructor, value_type_cardinality * reference_cont.size());
BOOST_TEST_EQ(raii::destructor, 0u);
BOOST_TEST_EQ(raii::move_constructor, 0u);
BOOST_TEST_EQ(raii::copy_assignment, 0u);
BOOST_TEST_EQ(raii::move_assignment, 0u);
}
@@ -1030,14 +1026,11 @@ namespace {
BOOST_TEST_EQ(x.key_eq(), key_equal(2));
BOOST_TEST_EQ(
raii::copy_constructor, value_type_cardinality * values.size());
raii::copy_constructor, value_type_cardinality * reference_cont.size());
BOOST_TEST_EQ(
raii::destructor,
value_type_cardinality * values.size() +
value_type_cardinality * reference_cont.size());
raii::destructor, value_type_cardinality * reference_cont.size());
BOOST_TEST_EQ(
raii::move_constructor,
2 * value_type_cardinality * reference_cont.size());
raii::move_constructor, value_type_cardinality * reference_cont.size());
BOOST_TEST_EQ(raii::copy_assignment, 0u);
BOOST_TEST_EQ(raii::move_assignment, 0u);
}
@@ -1063,14 +1056,11 @@ namespace {
BOOST_TEST_EQ(flat.key_eq(), key_equal(2));
BOOST_TEST_EQ(
raii::copy_constructor, value_type_cardinality * values.size());
raii::copy_constructor, value_type_cardinality * reference_cont.size());
BOOST_TEST_EQ(
raii::destructor,
value_type_cardinality * values.size() +
value_type_cardinality * reference_cont.size());
raii::destructor, value_type_cardinality * reference_cont.size());
BOOST_TEST_EQ(
raii::move_constructor,
2 * value_type_cardinality * reference_cont.size());
raii::move_constructor, value_type_cardinality * reference_cont.size());
BOOST_TEST_EQ(raii::copy_assignment, 0u);
BOOST_TEST_EQ(raii::move_assignment, 0u);
}