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 TTypeList,
typename T>
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;
211 template <
typename TTypeList,
typename T>
212 struct type_list_has_duplicates_of;
214 template <
typename T,
typename... TTypes>
215 struct type_list_has_duplicates_of<
etl::type_list<TTypes...>, T>
220 template <
typename T>
221 struct type_list_has_duplicates_of<type_list<>, T>
227 template <
typename TTypeList,
typename T>
228 inline constexpr bool type_list_has_duplicates_of_v = etl::type_list_has_duplicates_of<TTypeList, T>::value;
234 template <
typename TTypeList,
typename T>
235 struct type_list_count_of;
237 template <
typename T,
typename... TTypes>
238 struct type_list_count_of<
etl::type_list<TTypes...>, T>
243 template <
typename T>
244 struct type_list_count_of<type_list<>, T>
250 template <
typename TTypeList,
typename T>
251 inline constexpr size_t type_list_count_of_v = etl::type_list_count_of<TTypeList, T>::value;
258 template <
typename T>
259 struct type_list_max_size;
261 template <
typename... TTypes>
262 struct type_list_max_size<
etl::type_list<TTypes...>>
268 struct type_list_max_size<type_list<>>
274 template <
typename TTypeList>
275 inline constexpr size_t type_list_max_size_v = etl::type_list_max_size<TTypeList>::value;
282 template <
typename T>
283 struct type_list_max_alignment;
285 template <
typename... TTypes>
286 struct type_list_max_alignment<
etl::type_list<TTypes...>>
292 struct type_list_max_alignment<type_list<>>
298 template <
typename TTypeList>
299 inline constexpr size_t type_list_max_alignment_v = etl::type_list_max_alignment<TTypeList>::value;
305 template <
typename TTypeList,
size_t... Indices>
306 struct type_list_select
310 using type = type_list<type_list_type_at_index_t<TTypeList, Indices>...>;
313 template <
typename TTypeList,
size_t... Indices>
314 using type_list_select_t =
typename type_list_select<TTypeList, Indices...>::type;
319 template <
typename... TTypes>
320 struct type_list_cat;
322 template <
typename... TTypes1,
typename... TTypes2,
typename... TTail>
323 struct type_list_cat<
etl::type_list<TTypes1...>,
etl::type_list<TTypes2...>, TTail...>
325 using type =
typename type_list_cat<
etl::type_list<TTypes1..., TTypes2...>, TTail...>::type;
328 template <
typename T>
329 struct type_list_cat<T>
334 template <
typename... TypeLists>
335 using type_list_cat_t =
typename type_list_cat<TypeLists...>::type;
342 template <
typename TFromList,
typename TToList>
343 struct type_lists_are_convertible;
353 template <
typename TFromHead,
typename... TFromTail,
typename TToHead,
typename... TToTail>
354 struct type_lists_are_convertible<
etl::type_list<TFromHead, TFromTail...>,
etl::type_list<TToHead, TToTail...>>
356 etl::type_lists_are_convertible<etl::type_list<TFromTail...>, etl::type_list<TToTail...>>::value>
358 static_assert(
sizeof...(TFromTail) ==
sizeof...(TToTail),
"Type lists are not the same length");
362 template <
typename TFromList,
typename TToList>
363 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:895
is_base_of
Definition type_traits_generator.h:1315
bitset_ext
Definition absolute.h:39
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:315
Definition type_traits_generator.h:912