29#ifndef ETL_TYPE_LIST_INCLUDED
30#define ETL_TYPE_LIST_INCLUDED
35#include "index_of_type.h"
37#include "static_assert.h"
53 template <
typename...
TTypes>
62 static constexpr size_t size = 0
U;
76 template <
typename...
TTypes>
79 using type = type_list<TTypes...>;
90 using tail =
typename private_type_list::recursion_helper<TTail...>::type;
92 static constexpr size_t size =
sizeof...(TTail) + 1U;
98 type_list() ETL_DELETE;
99 type_list(const type_list&) ETL_DELETE;
100 type_list& operator =(const type_list&) ETL_DELETE;
106 template <typename THead>
107 struct type_list<THead> : type_list<>
110 using tail =
typename private_type_list::recursion_helper<>::type;
112 static constexpr size_t size = 1U;
118 type_list() ETL_DELETE;
119 type_list(const type_list&) ETL_DELETE;
120 type_list& operator =(const type_list&) ETL_DELETE;
126 template <typename TTypes>
127 struct type_list_size;
129 template <typename... TTypes>
130 struct type_list_size<
etl::type_list<TTypes...>> : public
etl::integral_constant<
size_t, sizeof...(TTypes)>
135 template <
typename... TTypes>
136 inline constexpr size_t type_list_size_v = type_list_size<
etl::type_list<TTypes...>>::value;
143 template <
typename TTypeList,
size_t Index>
144 struct type_list_type_at_index
146 ETL_STATIC_ASSERT(Index < type_list_size<TTypeList>::value,
"etl::type_list_type_at_index out of range");
149 using type =
typename type_list_type_at_index<
typename TTypeList::tail, Index - 1>::type;
152 template <
typename TTypeList>
153 struct type_list_type_at_index<TTypeList, 0>
155 using type =
typename TTypeList::head;
158 template <
typename TTypeList,
size_t Index>
159 using type_list_type_at_index_t =
typename type_list_type_at_index<TTypeList, Index>::type;
165 template <
typename TTypeList,
typename T>
166 struct type_list_index_of_type
168 (type_list_index_of_type<typename TTypeList::tail, T>::value == etl::type_list_npos ? etl::type_list_npos :
169 type_list_index_of_type<typename TTypeList::tail, T>::value + 1)>
174 template <
typename T>
175 struct type_list_index_of_type<type_list<>, T>
181 template <
typename TTypeList,
typename T>
182 inline constexpr size_t type_list_index_of_v = etl::type_list_index_of_type<TTypeList, T>::value;
188 template <
typename T,
typename TTypes>
189 struct type_list_contains;
191 template <
typename T,
typename... TTypes>
192 struct type_list_contains<
etl::type_list<TTypes...>, T>
197 template <
typename T>
198 struct type_list_contains<type_list<>, T>
204 template <
typename TTypeList,
typename T>
205 inline constexpr bool type_list_contains_v = etl::type_list_contains<TTypeList, T>::value;
212 template <
typename T>
213 struct type_list_max_size;
215 template <
typename... TTypes>
216 struct type_list_max_size<
etl::type_list<TTypes...>>
222 struct type_list_max_size<type_list<>>
228 template <
typename TTypeList>
229 inline constexpr size_t type_list_max_size_v = etl::type_list_max_size<TTypeList>::value;
236 template <
typename T>
237 struct type_list_max_alignment;
239 template <
typename... TTypes>
240 struct type_list_max_alignment<
etl::type_list<TTypes...>>
246 struct type_list_max_alignment<type_list<>>
252 template <
typename TTypeList>
253 inline constexpr size_t type_list_max_alignment_v = etl::type_list_max_alignment<TTypeList>::value;
259 template <
typename TTypeList,
size_t... Indices>
260 struct type_list_select
264 using type = type_list<type_list_type_at_index_t<TTypeList, Indices>...>;
267 template <
typename TTypeList,
size_t... Indices>
268 using type_list_select_t =
typename type_list_select<TTypeList, Indices...>::type;
273 template <
typename... TTypes>
274 struct type_list_cat;
276 template <
typename... TTypes1,
typename... TTypes2,
typename... TTail>
277 struct type_list_cat<
etl::type_list<TTypes1...>,
etl::type_list<TTypes2...>, TTail...>
279 using type =
typename type_list_cat<
etl::type_list<TTypes1..., TTypes2...>, TTail...>::type;
282 template <
typename T>
283 struct type_list_cat<T>
288 template <
typename... TypeLists>
289 using type_list_cat_t =
typename type_list_cat<TypeLists...>::type;
296 template <
typename TFromList,
typename TToList>
297 struct type_lists_are_convertible;
307 template <
typename TFromHead,
typename... TFromTail,
typename TToHead,
typename... TToTail>
308 struct type_lists_are_convertible<
etl::type_list<TFromHead, TFromTail...>,
etl::type_list<TToHead, TToTail...>>
310 etl::type_lists_are_convertible<etl::type_list<TFromTail...>, etl::type_list<TToTail...>>::value>
312 static_assert(
sizeof...(TFromTail) ==
sizeof...(TToTail),
"Type lists are not the same length");
316 template <
typename TFromList,
typename TToList>
317 inline constexpr bool type_lists_are_convertible_v = etl::type_lists_are_convertible<TFromList, TToList>::value;
Definition integral_limits.h:516
integral_constant
Definition type_traits_generator.h:871
is_base_of
Definition type_traits_generator.h:1291
bitset_ext
Definition absolute.h:38
ETL_CONSTEXPR TContainer::size_type size(const TContainer &container)
Definition iterator.h:1187
ETL_NODISCARD ETL_CONSTEXPR14 T round_half_even_unscaled(T value) ETL_NOEXCEPT
Definition scaled_rounding.h:314
Definition type_traits_generator.h:888