-
Notifications
You must be signed in to change notification settings - Fork 0
/
variadic_set_test.cc
70 lines (60 loc) · 2.48 KB
/
variadic_set_test.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include <variadic_set.h>
namespace {
TEST(Sorting, SmallList) {
static constexpr auto s1 = internal_variadic_set::sorted_<int, 1, 2, 3>();
static_assert(s1.list[0] == 1);
static_assert(s1.list[1] == 2);
static_assert(s1.list[2] == 3);
static_assert(s1.data_index[0] == 0);
static_assert(s1.data_index[1] == 1);
static_assert(s1.data_index[2] == 2);
static constexpr auto s2 = internal_variadic_set::sorted_<int, 3, 2, 1>();
static_assert(s2.list[0] == 1);
static_assert(s2.list[1] == 2);
static_assert(s2.list[2] == 3);
static_assert(s2.data_index[0] == 2);
static_assert(s2.data_index[1] == 1);
static_assert(s2.data_index[2] == 0);
}
template <typename C, C... vs>
constexpr auto sort_list(std::integer_sequence<C, vs...>) noexcept {
return internal_variadic_set::sorted_<C, vs...>();
}
template <typename C, C... vs>
constexpr auto inverted_list(std::integer_sequence<C, vs...>) noexcept {
return std::integer_sequence<C, (sizeof...(vs) - 1 - vs)...>{};
}
template <typename C, C... v2s, size_t... is>
constexpr bool lists_eq(std::array<C, sizeof...(is)> a1,
std::integer_sequence<C, v2s...>,
std::index_sequence<is...>) noexcept {
constexpr std::array<C, sizeof...(v2s)> a2{v2s...};
return ((a1[is] == a2[is]) && ...);
}
TEST(Sorting, LargeList) {
static constexpr auto s1 = sort_list(std::make_integer_sequence<int, 250>{});
static_assert(lists_eq(s1.list, std::make_integer_sequence<int, 250>{},
std::make_index_sequence<250>{}));
static_assert(lists_eq(s1.data_index, std::make_index_sequence<250>{},
std::make_index_sequence<250>{}));
static constexpr auto s2 =
sort_list(inverted_list(std::make_integer_sequence<int, 250>{}));
static_assert(lists_eq(s2.list, std::make_integer_sequence<int, 250>{},
std::make_index_sequence<250>{}));
static_assert(lists_eq(s2.data_index,
inverted_list(std::make_index_sequence<250>{}),
std::make_index_sequence<250>{}));
}
TEST(VariadicSet, SmallSet) {
static constexpr auto s = variadic_set<int, 1, 2, 3>();
static_assert(s.contains(1));
static_assert(s.contains(2));
static_assert(s.contains(3));
static_assert(!s.contains(0));
static_assert(s.size() == 3);
static constexpr auto s2 = variadic_set<int, 3, 2, 1>();
static_assert(std::is_same_v<decltype(s), decltype(s2)>);
}
} // namespace