EBO for flat_set

This commit is contained in:
2019-05-10 07:59:00 +07:00
parent 02b780b9da
commit 797d83fcc8
2 changed files with 62 additions and 32 deletions

View File

@@ -70,6 +70,16 @@ namespace
return !(l == r);
}
template < typename T >
class dummy_less {
public:
dummy_less(int i) : i(i) {}
bool operator()(const T& l, const T& r) const {
return l < r;
}
int i = 0;
};
template < typename T >
constexpr std::add_const_t<T>& my_as_const(T& t) noexcept {
return t;
@@ -77,6 +87,14 @@ namespace
}
TEST_CASE("flat_set") {
SECTION("sizeof") {
REQUIRE(sizeof(flat_set<int>) == sizeof(std::vector<int>));
struct vc : flat_set<int>::value_compare {
int i;
};
REQUIRE(sizeof(vc) == sizeof(int));
}
SECTION("types") {
using set_t = flat_set<int>;
@@ -390,6 +408,16 @@ TEST_CASE("flat_set") {
REQUIRE(my_as_const(s0).key_comp().i == 42);
REQUIRE(my_as_const(s0).value_comp().i == 42);
}
SECTION("custom_less") {
using set_t = flat_set<int, dummy_less<int>>;
auto s0 = set_t(dummy_less<int>(42));
auto s1 = set_t(dummy_less<int>(21));
REQUIRE(s0.key_comp().i == 42);
REQUIRE(s1.key_comp().i == 21);
s0.swap(s1);
REQUIRE(s0.key_comp().i == 21);
REQUIRE(s1.key_comp().i == 42);
}
SECTION("operators") {
using set_t = flat_set<int>;