-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtypelist.h
87 lines (68 loc) · 1.75 KB
/
typelist.h
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
85
86
87
#ifndef _TYPELIST_H_
#define _TYPELIST_H_
struct NullType {};
template <class T, class U>
struct Typelist {
typedef T Head;
typedef U Tail;
};
template <typename T1 = NullType, typename T2 = NullType, typename T3 = NullType, typename T4 = NullType>
struct MakeTypelist {
private:
typedef typename MakeTypelist<T2, T3, T4>::Type TailType;
public:
typedef Typelist<T1, TailType> Type;
};
template <>
struct MakeTypelist<> {
typedef NullType Type;
};
template <class TList> struct Length;
template <> struct Length<NullType> {
enum { value = 0 };
};
template <class T, class U>
struct Length<Typelist<T, U> > {
enum { value = 1 + Length<U>::value };
};
template <class TList, int i>
struct TypeAt;
template <class Head, class Tail>
struct TypeAt<Typelist<Head, Tail>, 0> {
typedef Head Type;
};
template <class Head, class Tail, int i>
struct TypeAt<Typelist<Head, Tail>, i> {
typedef typename TypeAt<Tail, i - 1>::Type Type;
};
template <class TList, class T>
struct Append;
template <>
struct Append<NullType, NullType> {
typedef NullType Type;
};
template <class T>
struct Append<NullType, T> {
typedef Typelist<T, NullType> Type;
};
template <class Head, class Tail>
struct Append<NullType, Typelist<Head, Tail> > {
typedef Typelist<Head, Tail> Type;
};
template <class Head, class Tail, class T>
struct Append<Typelist<Head, Tail>, T> {
typedef Typelist<Head, typename Append<Tail, T>::Type> Type;
};
template <class TList1, class TList2>
struct Splice;
template <class TList1>
struct Splice<TList1, NullType> {
typedef TList1 Type;
};
template <class TList1, class TList2>
struct Splice {
typedef typename Splice<
typename Append<TList1, typename TList2::Head>::Type,
typename TList2::Tail>::Type Type;
};
#endif // _TYPELIST_H_