29#ifndef ETL_TYPE_LIST_INCLUDED
30#define ETL_TYPE_LIST_INCLUDED
35#include "index_of_type.h"
37#include "static_assert.h"
48 static ETL_CONSTANT
size_t type_list_npos = etl::integral_limits<size_t>::max;
53 template <
typename... TTypes>
62 static constexpr size_t size = 0U;
64 using index_sequence_type = etl::make_index_sequence<0>;
68 type_list() ETL_DELETE;
69 type_list(const type_list&) ETL_DELETE;
70 type_list& operator =(const type_list&) ETL_DELETE;
73 namespace private_type_list
76 template <
typename... TTypes>
77 struct recursion_helper
79 using type = type_list<TTypes...>;
86 template <
typename THead,
typename... TTail>
87 struct type_list<THead, TTail...> : type_list<TTail...>
90 using tail =
typename private_type_list::recursion_helper<TTail...>::type;
92 static constexpr size_t size =
sizeof...(TTail) + 1U;
94 using index_sequence_type = etl::make_index_sequence<
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;
114 using index_sequence_type = etl::make_index_sequence<1>;
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");
147 ETL_STATIC_ASSERT((etl::is_base_of<etl::type_list<>, TTypeList>::value),
"TTypeList must be an etl::type_list");
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
167 :
public etl::integral_constant<size_t, etl::is_same<typename TTypeList::head, T>::value ? 0 :
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)>
171 ETL_STATIC_ASSERT((etl::is_base_of<etl::type_list<>, TTypeList>::value),
"TTypeList must be an etl::type_list");
174 template <
typename T>
175 struct type_list_index_of_type<type_list<>, T>
176 :
public etl::integral_constant<size_t, etl::type_list_npos>
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>
193 :
public etl::integral_constant<bool, etl::is_one_of<T, TTypes...>::value>
197 template <
typename T>
198 struct type_list_contains<type_list<>, T>
199 :
public etl::integral_constant<bool, false>
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>
216 :
public etl::has_duplicates_of<T, TTypes...>
220 template <
typename T>
221 struct type_list_has_duplicates_of<type_list<>, T>
222 :
public etl::integral_constant<bool, false>
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>
239 :
public etl::count_of<T, TTypes...>
243 template <
typename T>
244 struct type_list_count_of<type_list<>, T>
245 :
public etl::integral_constant<size_t, 0>
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...>>
263 :
public etl::integral_constant<size_t, etl::largest<TTypes...>::size>
268 struct type_list_max_size<type_list<>>
269 :
public etl::integral_constant<size_t, 0>
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...>>
287 :
public etl::integral_constant<size_t, etl::largest<TTypes...>::alignment>
292 struct type_list_max_alignment<type_list<>>
293 :
public etl::integral_constant<size_t, 1>
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
308 ETL_STATIC_ASSERT((etl::is_base_of<etl::type_list<>, TTypeList>::value),
"TTypeList must be an etl::type_list");
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;
347 struct type_lists_are_convertible<etl::type_list<>, etl::type_list<>>
348 :
public etl::true_type
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...>>
355 :
public etl::bool_constant<etl::is_convertible<TFromHead, TToHead>::value &&
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;
bitset_ext
Definition absolute.h:39
ETL_CONSTEXPR TContainer::size_type size(const TContainer &container)
Definition iterator.h:1187