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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
#include <library/cpp/testing/unittest/registar.h>
#include <util/system/type_name.h>
#include "typelist.h"
#include "vector.h"
class TTypeListTest: public TTestBase {
UNIT_TEST_SUITE(TTypeListTest);
UNIT_TEST(TestSimple);
UNIT_TEST(TestHave);
UNIT_TEST(TestGet);
UNIT_TEST(TestFloatList);
UNIT_TEST(TestSelectBy);
UNIT_TEST_SUITE_END();
public:
void TestGet() {
using TListType = TTypeList<int, char, float>;
UNIT_ASSERT_TYPES_EQUAL(TListType::TGet<0>, int);
UNIT_ASSERT_TYPES_EQUAL(TListType::TGet<1>, char);
UNIT_ASSERT_TYPES_EQUAL(TListType::TGet<2>, float);
}
void TestSimple() {
using TListType = TTypeList<int, char, float>;
UNIT_ASSERT_EQUAL(TListType::Length, 3);
UNIT_ASSERT_TYPES_EQUAL(TListType::THead, int);
}
struct TA {};
struct TB {};
struct TC {};
void TestHave() {
using TListType = TTypeList<TA, TB*, const TC&>;
UNIT_ASSERT(TListType::THave<TA>::value);
UNIT_ASSERT(TListType::THave<TB*>::value);
UNIT_ASSERT(!TListType::THave<TB>::value);
UNIT_ASSERT(TListType::THave<const TC&>::value);
UNIT_ASSERT(!TListType::THave<TC&>::value);
}
template <class T>
class TT {};
template <class T>
struct TIs1ArgTemplate: std::false_type {};
template <class T, template <class> class TT>
struct TIs1ArgTemplate<TT<T>>: std::true_type {};
template <class T>
struct TIsNArgTemplate: std::false_type {};
template <template <class...> class TT, class... R>
struct TIsNArgTemplate<TT<R...>>: std::true_type {};
template <class>
struct TAnyType: std::true_type {};
template <class T>
struct TMyVector {};
template <class T1, class T2>
struct TMyMap {};
void TestSelectBy() {
using TListType = TTypeList<TA, TB, TMyMap<TA*, TB>, TMyVector<TA>, TC>;
UNIT_ASSERT_TYPES_EQUAL(TListType::TSelectBy<TAnyType>::type, TA);
UNIT_ASSERT_TYPES_EQUAL(TListType::TSelectBy<TIs1ArgTemplate>::type, TMyVector<TA>);
using TMyMapPTATB = TMyMap<TA*, TB>;
UNIT_ASSERT_TYPES_EQUAL(TListType::TSelectBy<TIsNArgTemplate>::type, TMyMapPTATB);
}
void TestFloatList() {
UNIT_ASSERT_TYPES_EQUAL(TFixedWidthFloat<ui32>, float);
UNIT_ASSERT_TYPES_EQUAL(TFixedWidthFloat<i32>, float);
UNIT_ASSERT_TYPES_EQUAL(TFixedWidthFloat<ui64>, double);
UNIT_ASSERT_TYPES_EQUAL(TFixedWidthFloat<i64>, double);
}
};
UNIT_TEST_SUITE_REGISTRATION(TTypeListTest);
|