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 H,
typename... T>
struct type_list<H, T...> {
39 template <
typename H,
typename... T,
typename... T2>
53 template <
typename T,
typename L>
55 :
conditional_t<std::is_same<remove_cv_t<T>, head_t<L>>::value,
56 std::true_type, is_contained<T, tail_t<L>>> {};
64 template <
typename T, T H, T... V>
struct value_list<T, H, V...> {
65 static constexpr T head = H;
72 template <
typename T, T V,
typename TL>
75 is_contained_value<T, V, tail_t<TL>>> {};
77 template <
typename T, T V>
84 template <access::address_space AS,
typename VL>
88 template <
typename T1,
typename T2>
91 template <
typename T1,
typename T2>
94 template <
typename T1,
typename T2>
98 template <
typename T1,
typename T2>
101 template <typename T1, typename T2>
102 struct is_type_size_half_of : bool_constant<(sizeof(T1) == (sizeof(T2) / 2))> {
106 template <typename TL, template <typename, typename> class C, typename T>
108 using head = head_t<TL>;
109 using tail = typename find_type<tail_t<TL>, C, T>::type;
110 using type = conditional_t<C<head, T>::value, head, tail>;
113 template <template <typename, typename> class C, typename T>
114 struct find_type<empty_type_list, C, T> {
118 template <typename TL, template <typename, typename> class C, typename T>
119 using find_type_t = typename find_type<TL, C, T>::type;
121 template <typename TL, typename T>
122 using find_same_size_type_t = find_type_t<TL, is_type_size_equal, T>;
124 template <typename TL, typename T>
125 using find_smaller_type_t = find_type_t<TL, is_type_size_less, T>;
127 template <typename TL, typename T>
128 using find_larger_type_t = find_type_t<TL, is_type_size_greater, T>;
130 template <typename TL, typename T>
131 using find_twice_as_small_type_t = find_type_t<TL, is_type_size_half_of, T>;
133 template <typename TL, typename T>
134 using find_twice_as_large_type_t = find_type_t<TL, is_type_size_double_of, T>;