18 template <
typename T>
using head_t =
typename T::head;
20 template <
typename T>
using tail_t =
typename T::tail;
29 :
conditional_t<std::is_same<T, empty_type_list>::value, std::true_type,
34 template <
typename Head,
typename... Tail>
struct type_list<Head, Tail...> {
39 template <
typename Head,
typename... Tail,
typename... Tail2>
53 template <
typename T,
typename TypeList>
55 :
conditional_t<std::is_same<remove_cv_t<T>, head_t<TypeList>>::value,
56 std::true_type, is_contained<T, tail_t<TypeList>>> {};
64 template <
typename T, T Head, T... Tail>
struct value_list<T, Head, Tail...> {
65 static constexpr T head = Head;
72 template <
typename T, T Value,
typename ValueList>
75 is_contained_value<T, Value, tail_t<ValueList>>> {};
77 template <
typename T, T Value>
84 template <access::address_space AddressSpace,
typename ValueList>
89 template <
typename T1,
typename T2>
92 template <
typename T1,
typename T2>
95 template <
typename T1,
typename T2>
99 template <
typename T1,
typename T2>
102 template <typename T1, typename T2>
103 struct is_type_size_half_of : bool_constant<(sizeof(T1) == (sizeof(T2) / 2))> {
107 template <typename TypeList, template <typename, typename> class Comp,
110 using head = head_t<TypeList>;
111 using tail = typename find_type<tail_t<TypeList>, Comp, T>::type;
112 using type = conditional_t<Comp<head, T>::value, head, tail>;
115 template <template <typename, typename> class Comp, typename T>
116 struct find_type<empty_type_list, Comp, T> {
120 template <typename TypeList, template <typename, typename> class Comp,
122 using find_type_t = typename find_type<TypeList, Comp, T>::type;
124 template <typename TypeList, typename T>
125 using find_same_size_type_t = find_type_t<TypeList, is_type_size_equal, T>;
127 template <typename TypeList, typename T>
128 using find_smaller_type_t = find_type_t<TypeList, is_type_size_less, T>;
130 template <typename TypeList, typename T>
131 using find_larger_type_t = find_type_t<TypeList, is_type_size_greater, T>;
133 template <typename TypeList, typename T>
134 using find_twice_as_small_type_t =
135 find_type_t<TypeList, is_type_size_half_of, T>;
137 template <typename TypeList, typename T>
138 using find_twice_as_large_type_t =
139 find_type_t<TypeList, is_type_size_double_of, T>;