29#ifndef ETL_TYPE_LIST_INCLUDED
30#define ETL_TYPE_LIST_INCLUDED
34#include "index_of_type.h"
37#include "static_assert.h"
47 static ETL_CONSTANT
size_t type_list_npos = etl::integral_limits<size_t>::max;
52 template <
typename... TTypes>
63 template <
typename... TTypes>
64 struct is_type_list<etl::type_list<TTypes...>> : etl::true_type
70 inline constexpr bool is_type_list_v = is_type_list<T>::value;
79 static constexpr size_t size = 0U;
81 using index_sequence_type = etl::make_index_sequence<0>;
88 type_list() ETL_DELETE;
89 type_list(const type_list&) ETL_DELETE;
90 type_list& operator=(const type_list&) ETL_DELETE;
93 namespace private_type_list
97 template <
typename... TTypes>
98 struct recursion_helper
100 using type = type_list<TTypes...>;
107 template <
typename THead,
typename... TTail>
108 struct type_list<THead, TTail...> : type_list<TTail...>
111 using tail =
typename private_type_list::recursion_helper<TTail...>::type;
113 static constexpr size_t size =
sizeof...(TTail) + 1U;
115 using index_sequence_type = etl::make_index_sequence<
sizeof...(TTail) + 1U>;
121 type_list() ETL_DELETE;
122 type_list(const type_list&) ETL_DELETE;
123 type_list& operator=(const type_list&) ETL_DELETE;
129 template <typename THead>
130 struct type_list<THead> : type_list<>
133 using tail =
typename private_type_list::recursion_helper<>::type;
135 static constexpr size_t size = 1U;
137 using index_sequence_type = etl::make_index_sequence<1>;
142 type_list() ETL_DELETE;
143 type_list(const type_list&) ETL_DELETE;
144 type_list& operator=(const type_list&) ETL_DELETE;
150 template <typename TTypes>
151 struct type_list_size;
153 template <typename... TTypes>
154 struct type_list_size<etl::type_list<TTypes...>> : public etl::integral_constant<
size_t, sizeof...(TTypes)>
159 template <
typename... TTypes>
160 inline constexpr size_t type_list_size_v = type_list_size<etl::type_list<TTypes...>>::value;
167 template <
typename TTypeList,
size_t Index>
168 struct type_list_type_at_index
170 ETL_STATIC_ASSERT(Index < TTypeList::size,
"etl::type_list_type_at_index out of range");
171 ETL_STATIC_ASSERT((etl::is_type_list<TTypeList>::value),
"TTypeList must be an etl::type_list");
173 using type =
typename type_list_type_at_index<
typename TTypeList::tail, Index - 1>::type;
176 template <
typename TTypeList>
177 struct type_list_type_at_index<TTypeList, 0>
179 ETL_STATIC_ASSERT((etl::is_type_list<TTypeList>::value),
"TTypeList must be an etl::type_list");
181 using type =
typename TTypeList::head;
184 template <
typename TTypeList,
size_t Index>
185 using type_list_type_at_index_t =
typename type_list_type_at_index<TTypeList, Index>::type;
194 template <
typename TTypeList,
typename T>
195 struct type_list_index_of_type
196 :
public etl::integral_constant< size_t, etl::is_same<typename TTypeList::head, T>::value
198 : (type_list_index_of_type<typename TTypeList::tail, T>::value == etl::type_list_npos
199 ? etl::type_list_npos
200 : type_list_index_of_type<typename TTypeList::tail, T>::value + 1)>
202 ETL_STATIC_ASSERT((etl::is_type_list<TTypeList>::value),
"TTypeList must be an etl::type_list");
205 template <
typename T>
206 struct type_list_index_of_type<type_list<>, T> :
public etl::integral_constant<size_t, etl::type_list_npos>
211 template <
typename TTypeList,
typename T>
212 inline constexpr size_t type_list_index_of_type_v = etl::type_list_index_of_type<TTypeList, T>::value;
222 namespace private_type_list
224 template <
typename TTypeList,
typename T,
size_t Index,
typename TResult>
225 struct type_list_indices_of_type_impl;
229 template <
typename Head,
typename... Tail,
typename T,
size_t Index,
typename TResult>
230 struct type_list_indices_of_type_impl<etl::type_list<Head, Tail...>, T, Index, TResult>
236 using next_result = etl::conditional_t<etl::is_same<Head, T>::value, etl::index_sequence_push_back_t<TResult, Index>, TResult>;
241 using type =
typename type_list_indices_of_type_impl<etl::type_list<Tail...>, T, Index + 1U, next_result>::type;
246 template <
typename T,
size_t Index,
typename TResult>
247 struct type_list_indices_of_type_impl<etl::type_list<>, T, Index, TResult>
249 using type = TResult;
253 template <
typename TTypeList,
typename T>
254 struct type_list_indices_of_type
256 ETL_STATIC_ASSERT((etl::is_type_list<TTypeList>::value),
"TTypeList must be an etl::type_list");
258 using type =
typename private_type_list::type_list_indices_of_type_impl< TTypeList, T, 0U, etl::index_sequence<>>::type;
262 template <
typename TTypeList,
typename T>
263 using type_list_indices_of_type_t =
typename type_list_indices_of_type<TTypeList, T>::type;
270 template <
typename TTypeList,
typename T>
271 struct type_list_contains;
273 template <
typename T,
typename... TTypes>
274 struct type_list_contains<etl::type_list<TTypes...>, T> :
public etl::is_one_of<T, TTypes...>
278 template <
typename T>
279 struct type_list_contains<type_list<>, T> :
public etl::bool_constant<false>
284 template <
typename TTypeList,
typename T>
285 inline constexpr bool type_list_contains_v = etl::type_list_contains<TTypeList, T>::value;
292 template <
typename TTypeList,
typename T>
293 struct type_list_has_duplicates_of;
295 template <
typename T,
typename... TTypes>
296 struct type_list_has_duplicates_of<etl::type_list<TTypes...>, T> :
public etl::has_duplicates_of<T, TTypes...>
300 template <
typename T>
301 struct type_list_has_duplicates_of<type_list<>, T> :
public etl::integral_constant<bool, false>
306 template <
typename TTypeList,
typename T>
307 inline constexpr bool type_list_has_duplicates_of_v = etl::type_list_has_duplicates_of<TTypeList, T>::value;
314 template <
typename TTypeList,
typename T>
315 struct type_list_count_of;
317 template <
typename T,
typename... TTypes>
318 struct type_list_count_of<etl::type_list<TTypes...>, T> :
public etl::count_of<T, TTypes...>
322 template <
typename T>
323 struct type_list_count_of<type_list<>, T> :
public etl::integral_constant<size_t, 0>
328 template <
typename TTypeList,
typename T>
329 inline constexpr size_t type_list_count_of_v = etl::type_list_count_of<TTypeList, T>::value;
336 template <
typename T>
337 struct type_list_max_size;
339 template <
typename... TTypes>
340 struct type_list_max_size<etl::type_list<TTypes...>> :
public etl::integral_constant<size_t, etl::largest<TTypes...>::size>
345 struct type_list_max_size<type_list<>> :
public etl::integral_constant<size_t, 0>
350 template <
typename TTypeList>
351 inline constexpr size_t type_list_max_size_v = etl::type_list_max_size<TTypeList>::value;
358 template <
typename T>
359 struct type_list_max_alignment;
361 template <
typename... TTypes>
362 struct type_list_max_alignment<etl::type_list<TTypes...>> :
public etl::integral_constant<size_t, etl::largest<TTypes...>::alignment>
367 struct type_list_max_alignment<type_list<>> :
public etl::integral_constant<size_t, 1>
372 template <
typename TTypeList>
373 inline constexpr size_t type_list_max_alignment_v = etl::type_list_max_alignment<TTypeList>::value;
380 template <
typename TTypeList,
size_t... Indices>
381 struct type_list_select
383 ETL_STATIC_ASSERT((etl::is_type_list<TTypeList>::value),
"TTypeList must be an etl::type_list");
385 using type = type_list<type_list_type_at_index_t<TTypeList, Indices>...>;
388 template <
typename TTypeList,
size_t... Indices>
389 using type_list_select_t =
typename type_list_select<TTypeList, Indices...>::type;
391 template <
typename TTypeList,
size_t... Indices>
392 using type_list_select_from_indexes = type_list_select<TTypeList, Indices...>;
394 template <
typename TTypeList,
size_t... Indices>
395 using type_list_select_from_indexes_t =
typename type_list_select<TTypeList, Indices...>::type;
401 template <
typename TTypeList,
typename TIndexSequence>
402 struct type_list_select_from_index_sequence;
404 template <
typename TTypeList,
size_t... Indices>
405 struct type_list_select_from_index_sequence<TTypeList, etl::index_sequence<Indices...>>
407 using type = etl::type_list_select_t<TTypeList, Indices...>;
410 template <
typename TTypeList,
typename TIndexSequence>
411 using type_list_select_from_index_sequence_t =
typename type_list_select_from_index_sequence<TTypeList, TIndexSequence>::type;
416 template <
typename... TTypes>
417 struct type_list_cat;
421 template <
typename... TTypes1,
typename... TTypes2,
typename... TTail>
422 struct type_list_cat<etl::type_list<TTypes1...>, etl::type_list<TTypes2...>, TTail...>
424 using type =
typename type_list_cat<etl::type_list<TTypes1..., TTypes2...>, TTail...>::type;
427 template <
typename T>
428 struct type_list_cat<T>
434 struct type_list_cat<>
436 using type = etl::type_list<>;
439 template <
typename... TypeLists>
440 using type_list_cat_t =
typename type_list_cat<TypeLists...>::type;
445 template <
typename T,
typename... TTypes>
446 struct type_list_push_front;
448 template <
typename T,
typename... TTypes>
449 struct type_list_push_front<etl::type_list<TTypes...>, T>
451 using type = type_list<T, TTypes...>;
454 template <
typename TypeList,
typename T>
455 using type_list_push_front_t =
typename type_list_push_front<TypeList, T>::type;
460 template <
typename T,
typename... TTypes>
461 struct type_list_push_back;
463 template <
typename T,
typename... TTypes>
464 struct type_list_push_back<etl::type_list<TTypes...>, T>
466 using type = type_list<TTypes..., T>;
469 template <
typename TypeList,
typename T>
470 using type_list_push_back_t =
typename type_list_push_back<TypeList, T>::type;
477 template <
typename TTypeList,
typename T,
size_t Index>
478 struct type_list_insert
482 ETL_STATIC_ASSERT((etl::is_type_list<TTypeList>::value),
"TTypeList must be an etl::type_list");
483 ETL_STATIC_ASSERT(Index <= TTypeList::size,
"Index out of range");
485 using index_sequence_for_prefix = etl::make_index_sequence<Index>;
486 using index_sequence_for_suffix = etl::make_index_sequence_with_offset<Index, TTypeList::size - Index>;
488 using prefix = etl::type_list_select_from_index_sequence_t<TTypeList, index_sequence_for_prefix>;
489 using suffix = etl::type_list_select_from_index_sequence_t<TTypeList, index_sequence_for_suffix>;
495 using type = etl::type_list_cat_t<prefix, etl::type_list<T>, suffix>;
499 template <
typename TTypeList,
typename T,
size_t Index>
500 using type_list_insert_t =
typename etl::type_list_insert<TTypeList, T, Index>::type;
506 template <
typename TTypeList,
size_t Index>
507 struct type_list_remove
511 ETL_STATIC_ASSERT((etl::is_type_list<TTypeList>::value),
"TTypeList must be an etl::type_list");
512 ETL_STATIC_ASSERT(Index < TTypeList::size,
"Index out of range");
514 using index_sequence_for_prefix = etl::make_index_sequence<Index>;
515 using index_sequence_for_suffix = etl::make_index_sequence_with_offset<Index + 1, TTypeList::size - Index - 1>;
517 using prefix = etl::type_list_select_from_index_sequence_t<TTypeList, index_sequence_for_prefix>;
518 using suffix = etl::type_list_select_from_index_sequence_t<TTypeList, index_sequence_for_suffix>;
524 using type = etl::type_list_cat_t<prefix, suffix>;
528 template <
typename TTypeList,
size_t Index>
529 using type_list_remove_t =
typename etl::type_list_remove<TTypeList, Index>::type;
535 namespace private_type_list
537 template <
typename TTypeList,
template <
typename>
class TPredicate>
538 struct type_list_remove_if_impl;
540 template <
template <
typename>
class TPredicate>
541 struct type_list_remove_if_impl<etl::type_list<>, TPredicate>
543 using type = etl::type_list<>;
546 template <
typename Head,
typename... Tail,
template <
typename>
class TPredicate>
547 struct type_list_remove_if_impl<etl::type_list<Head, Tail...>, TPredicate>
551 using rest =
typename type_list_remove_if_impl<etl::type_list<Tail...>, TPredicate>::type;
555 using type =
typename etl::conditional< TPredicate<Head>::value, rest, etl::type_list_push_front_t<rest, Head>>::type;
564 template <
typename TTypeList,
template <
typename>
class TPredicate>
565 struct type_list_remove_if
569 ETL_STATIC_ASSERT((etl::is_type_list<TTypeList>::value),
"TTypeList must be an etl::type_list");
573 using type =
typename private_type_list::type_list_remove_if_impl<TTypeList, TPredicate>::type;
577 template <
typename TTypeList,
template <
typename>
class TPredicate>
578 using type_list_remove_if_t =
typename etl::type_list_remove_if<TTypeList, TPredicate>::type;
584 template <
typename TTypeList>
585 struct type_list_pop_front
589 ETL_STATIC_ASSERT((etl::is_type_list<TTypeList>::value),
"TTypeList must be an etl::type_list");
590 ETL_STATIC_ASSERT(TTypeList::size > 0U,
"Cannot pop_front from an empty type_list");
594 using type =
typename TTypeList::tail;
598 template <
typename TTypeList>
599 using type_list_pop_front_t =
typename etl::type_list_pop_front<TTypeList>::type;
605 template <
typename TTypeList>
606 struct type_list_pop_back
610 ETL_STATIC_ASSERT((etl::is_type_list<TTypeList>::value),
"TTypeList must be an etl::type_list");
611 ETL_STATIC_ASSERT(TTypeList::size > 0U,
"Cannot pop_back from an empty type_list");
615 using type =
typename etl::type_list_remove<TTypeList, TTypeList::size - 1U>::type;
619 template <
typename TTypeList>
620 using type_list_pop_back_t =
typename etl::type_list_pop_back<TTypeList>::type;
626 namespace private_type_list
628 template <
typename TTypeList,
typename TResult>
629 struct type_list_unique_impl;
632 template <
typename TResult>
633 struct type_list_unique_impl<etl::type_list<>, TResult>
635 using type = TResult;
640 template <
typename Head,
typename... Tail,
typename TResult>
641 struct type_list_unique_impl<etl::type_list<Head, Tail...>, TResult>
645 using next_result = etl::conditional_t<etl::type_list_contains<TResult, Head>::value, TResult, etl::type_list_push_back_t<TResult, Head>>;
649 using type =
typename type_list_unique_impl<etl::type_list<Tail...>, next_result>::type;
657 template <
typename TTypeList>
658 struct type_list_unique
660 ETL_STATIC_ASSERT((etl::is_type_list<TTypeList>::value),
"TTypeList must be an etl::type_list");
662 using type =
typename private_type_list::type_list_unique_impl<TTypeList, etl::type_list<>>::type;
666 template <
typename TTypeList>
667 using type_list_unique_t =
typename etl::type_list_unique<TTypeList>::type;
673 template <
typename TTypeList>
674 struct type_list_is_unique
678 : etl::bool_constant< etl::is_same< TTypeList, typename type_list_unique<TTypeList>::type>::value>
680 ETL_STATIC_ASSERT((etl::is_type_list<TTypeList>::value),
"TTypeList must be an etl::type_list");
684 template <
typename TTypeList>
685 inline constexpr bool type_list_is_unique_v = etl::type_list_is_unique<TTypeList>::value;
691 template <
typename T>
692 struct type_list_is_empty;
695 struct type_list_is_empty<etl::type_list<>> : etl::true_type
699 template <
typename... TTypes>
705 template <
typename... TTypes>
706 inline constexpr bool type_list_is_empty_v = type_list_is_empty<TTypes...>::value;
714 template <
typename TTypeList,
template <
typename>
class TPredicate>
715 struct type_list_all_of;
717 template <
template <
typename>
class TPredicate,
typename... TTypes>
718 struct type_list_all_of<etl::type_list<TTypes...>, TPredicate> : etl::conjunction<TPredicate<TTypes>...>
723 template <
typename TTypeList,
template <
typename>
class TPredicate>
724 inline constexpr bool type_list_all_of_v = type_list_all_of<TTypeList, TPredicate>::value;
732 template <
typename TTypeList,
template <
typename>
class TPredicate>
733 struct type_list_any_of;
735 template <
template <
typename>
class TPredicate,
typename... TTypes>
736 struct type_list_any_of<etl::type_list<TTypes...>, TPredicate> : etl::disjunction<TPredicate<TTypes>...>
741 template <
typename TTypeList,
template <
typename>
class TPredicate>
742 inline constexpr bool type_list_any_of_v = type_list_any_of<TTypeList, TPredicate>::value;
750 template <
typename TTypeList,
template <
typename>
class TPredicate>
751 struct type_list_none_of;
753 template <
template <
typename>
class TPredicate,
typename... TTypes>
754 struct type_list_none_of<etl::type_list<TTypes...>, TPredicate> : etl::negation<etl::disjunction<TPredicate<TTypes>...>>
759 template <
typename TTypeList,
template <
typename>
class TPredicate>
760 inline constexpr bool type_list_none_of_v = type_list_none_of<TTypeList, TPredicate>::value;
768 template <
typename TFromList,
typename TToList>
769 struct type_lists_are_convertible;
773 struct type_lists_are_convertible<etl::type_list<>, etl::type_list<>> :
public etl::true_type
778 template <
typename TFromHead,
typename... TFromTail,
typename TToHead,
typename... TToTail>
779 struct type_lists_are_convertible<etl::type_list<TFromHead, TFromTail...>, etl::type_list<TToHead, TToTail...>>
780 :
public etl::bool_constant< etl::is_convertible<TFromHead, TToHead>::value
781 && etl::type_lists_are_convertible< etl::type_list<TFromTail...>, etl::type_list<TToTail...>>::value>
783 static_assert(
sizeof...(TFromTail) ==
sizeof...(TToTail),
"Type lists are not the same length");
787 template <
typename TFromList,
typename TToList>
788 inline constexpr bool type_lists_are_convertible_v = etl::type_lists_are_convertible<TFromList, TToList>::value;
791 namespace private_type_list
794 template <
typename TTypeList,
template <
typename,
typename>
class TCompare>
795 struct type_list_is_sorted_impl;
799 template <
template <
typename,
typename>
class TCompare>
800 struct type_list_is_sorted_impl<etl::type_list<>, TCompare> : etl::true_type
806 template <
typename T0,
template <
typename,
typename>
class TCompare>
807 struct type_list_is_sorted_impl<etl::type_list<T0>, TCompare> : etl::true_type
815 template <
typename Head,
typename Next,
typename... Tail,
template <
typename,
typename>
class TCompare>
816 struct type_list_is_sorted_impl<etl::type_list<Head, Next, Tail...>, TCompare>
817 : etl::bool_constant< !TCompare<Next, Head>::value && type_list_is_sorted_impl< etl::type_list<Next, Tail...>, TCompare>::value>
828 template <
typename TTypeList,
template <
typename,
typename>
class TCompare>
829 struct type_list_is_sorted :
public private_type_list::type_list_is_sorted_impl<TTypeList, TCompare>
831 ETL_STATIC_ASSERT((etl::is_type_list<TTypeList>::value),
"TTypeList must be an etl::type_list");
835 template <
typename TTypeList,
template <
typename,
typename>
class TCompare>
836 inline constexpr bool type_list_is_sorted_v = etl::type_list_is_sorted<TTypeList, TCompare>::value;
840 namespace private_type_list
843 template <
bool InsertBefore,
typename Head,
typename T,
template <
typename,
typename>
class TCompare,
typename... Tail>
844 struct insert_sorted_impl;
847 template <
typename TSortedList,
typename T,
template <
typename,
typename>
class TCompare>
848 struct type_list_insert_sorted_impl;
853 template <
typename T,
template <
typename,
typename>
class TCompare>
854 struct type_list_insert_sorted_impl<etl::type_list<>, T, TCompare>
856 using type = etl::type_list<T>;
862 template <
typename Head,
typename... Tail,
typename T,
template <
typename,
typename>
class TCompare>
863 struct type_list_insert_sorted_impl<etl::type_list<Head, Tail...>, T, TCompare>
865 using type =
typename insert_sorted_impl<TCompare<T, Head>::value, Head, T, TCompare, Tail...>::type;
870 template <
typename Head,
typename T,
template <
typename,
typename>
class TCompare,
typename... Tail>
871 struct insert_sorted_impl<true, Head, T, TCompare, Tail...>
873 using type = etl::type_list<T, Head, Tail...>;
879 template <
typename Head,
typename T,
template <
typename,
typename>
class TCompare,
typename... Tail>
880 struct insert_sorted_impl<false, Head, T, TCompare, Tail...>
882 using type = etl::type_list_push_front_t<
typename type_list_insert_sorted_impl<etl::type_list<Tail...>, T, TCompare>::type, Head>;
892 template <
typename TTypeList,
typename T,
template <
typename,
typename>
class TCompare>
893 struct type_list_insert_sorted :
public private_type_list::type_list_insert_sorted_impl<TTypeList, T, TCompare>
895 ETL_STATIC_ASSERT((etl::is_type_list<TTypeList>::value),
"TTypeList must be an etl::type_list");
896 ETL_STATIC_ASSERT((etl::type_list_is_sorted<TTypeList, TCompare>::value),
"Cannot insert into a non-sorted type list");
900 template <
typename TTypeList,
typename T,
template <
typename,
typename>
class TCompare>
901 using type_list_insert_sorted_t =
typename etl::type_list_insert_sorted<TTypeList, T, TCompare>::type;
905 namespace private_type_list
909 template <
typename TTypeList,
template <
typename,
typename>
class TCompare>
910 struct type_list_sort_impl;
914 template <
template <
typename,
typename>
class TCompare>
915 struct type_list_sort_impl<etl::type_list<>, TCompare>
917 using type = etl::type_list<>;
922 template <
typename T0,
template <
typename,
typename>
class TCompare>
923 struct type_list_sort_impl<etl::type_list<T0>, TCompare>
925 using type = etl::type_list<T0>;
930 template <
typename Head,
typename... Tail,
template <
typename,
typename>
class TCompare>
931 struct type_list_sort_impl<etl::type_list<Head, Tail...>, TCompare>
935 using sorted_tail =
typename type_list_sort_impl<etl::type_list<Tail...>, TCompare>::type;
939 using type =
typename etl::type_list_insert_sorted<sorted_tail, Head, TCompare>::type;
948 template <
typename TTypeList,
template <
typename,
typename>
class TCompare>
949 struct type_list_sort :
public private_type_list::type_list_sort_impl<TTypeList, TCompare>
951 ETL_STATIC_ASSERT((etl::is_type_list<TTypeList>::value),
"TTypeList must be an etl::type_list");
955 template <
typename TTypeList,
template <
typename,
typename>
class TCompare>
956 using type_list_sort_t =
typename etl::type_list_sort<TTypeList, TCompare>::type;
963 template <
typename T,
typename... TypeLists>
964 struct type_list_in_all_lists : etl::conjunction<etl::type_list_contains<TypeLists, T>...>
969 template <
typename T>
975 template <
typename T,
typename... TypeLists>
976 inline constexpr bool type_list_in_all_lists_v = type_list_in_all_lists<T, TypeLists...>::value;
983 template <
typename T,
typename... TypeLists>
989 template <
typename T,
typename FirstList,
typename... RestLists>
990 struct type_list_in_any_list<T, FirstList, RestLists...>
991 : etl::conditional<type_list_contains<FirstList, T>::value, etl::true_type, type_list_in_any_list<T, RestLists...>>::type
996 template <
typename T,
typename... TypeLists>
997 inline constexpr bool type_list_in_any_list_v = type_list_in_any_list<T, TypeLists...>::value;
1004 template <
typename T,
typename... Lists>
1005 using type_list_in_no_lists = etl::bool_constant<!type_list_in_any_list<T, Lists...>::value>;
1008 template <
typename T,
typename... Lists>
1009 inline constexpr bool type_list_in_no_lists_v = type_list_in_no_lists<T, Lists...>::value;
1013 namespace private_type_list
1015 template <
typename TInputList,
typename TAccumulatedResult,
typename... TOtherLists>
1016 struct type_list_remove_from_accumulator;
1019 template <
typename TAccumulatedResult,
typename... TOtherLists>
1020 struct type_list_remove_from_accumulator<etl::type_list<>, TAccumulatedResult, TOtherLists...>
1022 using type = TAccumulatedResult;
1026 template <
typename Head,
typename... Tail,
typename TAccumulatedResult,
typename... TOtherLists>
1027 struct type_list_remove_from_accumulator<etl::type_list<Head, Tail...>, TAccumulatedResult, TOtherLists...>
1032 static constexpr bool head_is_not_in_other_lists = etl::type_list_in_no_lists<Head, TOtherLists...>::value;
1035 using accumulated = etl::conditional_t<head_is_not_in_other_lists, etl::type_list_push_back_t<TAccumulatedResult, Head>, TAccumulatedResult>;
1040 using type =
typename type_list_remove_from_accumulator<etl::type_list<Tail...>, accumulated, TOtherLists...>::type;
1046 template <
typename... TypeLists>
1047 struct type_list_remove_from_helper;
1051 struct type_list_remove_from_helper<>
1053 using type = etl::type_list<>;
1057 template <
typename TypeList>
1058 struct type_list_remove_from_helper<TypeList>
1060 using type = TypeList;
1064 template <
typename TFirstList,
typename... TRestLists>
1065 struct type_list_remove_from_helper<TFirstList, TRestLists...>
1067 using type =
typename type_list_remove_from_accumulator<TFirstList, etl::type_list<>, TRestLists...>::type;
1076 template <
typename... TypeLists>
1077 struct type_list_remove_from
1080 static_assert(etl::conjunction<etl::is_type_list<TypeLists>...>::value,
"All parameters must be etl::type_list types");
1082 using type =
typename private_type_list::type_list_remove_from_helper<TypeLists...>::type;
1085 template <
typename... TypeLists>
1086 using type_list_remove_from_t =
typename type_list_remove_from<TypeLists...>::type;
1091 template <
typename... TypeLists>
1092 struct type_list_cat_unique
1095 static_assert(etl::conjunction<etl::is_type_list<TypeLists>...>::value,
"All parameters must be etl::type_list types");
1097 using type = etl::type_list_unique_t<type_list_cat_t<TypeLists...>>;
1100 template <
typename... TypeLists>
1101 using type_list_cat_unique_t =
typename type_list_cat_unique<TypeLists...>::type;
1104 namespace private_type_list
1106 template <
typename TInputList,
typename TAccumulatedResult,
typename... TOtherLists>
1107 struct type_list_select_common_types_accumulator;
1110 template <
typename TAccumulatedResult,
typename... TOtherLists>
1111 struct type_list_select_common_types_accumulator<etl::type_list<>, TAccumulatedResult, TOtherLists...>
1113 using type = TAccumulatedResult;
1117 template <
typename Head,
typename... Tail,
typename TAccumulatedResult,
typename... TOtherLists>
1118 struct type_list_select_common_types_accumulator<etl::type_list<Head, Tail...>, TAccumulatedResult, TOtherLists...>
1123 static constexpr bool head_is_in_all_lists = etl::type_list_in_all_lists<Head, TOtherLists...>::value;
1126 using accumulated = etl::conditional_t<head_is_in_all_lists, etl::type_list_push_back_t<TAccumulatedResult, Head>, TAccumulatedResult>;
1131 using type =
typename type_list_select_common_types_accumulator<etl::type_list<Tail...>, accumulated, TOtherLists...>::type;
1137 template <
typename... TypeLists>
1138 struct type_list_select_common_types_helper;
1142 struct type_list_select_common_types_helper<>
1144 using type = etl::type_list<>;
1148 template <
typename TypeList>
1149 struct type_list_select_common_types_helper<TypeList>
1151 using type = etl::type_list_unique_t<TypeList>;
1155 template <
typename TFirstList,
typename... TRestLists>
1156 struct type_list_select_common_types_helper<TFirstList, TRestLists...>
1161 using first_unique = etl::type_list_unique_t<TFirstList>;
1165 using type =
typename type_list_select_common_types_accumulator<first_unique, etl::type_list<>, TRestLists...>::type;
1174 template <
typename... TypeLists>
1175 struct type_list_select_common_types
1178 static_assert(etl::conjunction<etl::is_type_list<TypeLists>...>::value,
"All parameters must be etl::type_list types");
1180 using type =
typename private_type_list::type_list_select_common_types_helper<TypeLists...>::type;
1183 template <
typename... TypeLists>
1184 using type_list_select_common_types_t =
typename type_list_select_common_types<TypeLists...>::type;
1191 template <
typename... TypeLists>
1192 struct type_list_select_not_common_types
1195 static_assert(etl::conjunction<etl::is_type_list<TypeLists>...>::value,
"All parameters must be etl::type_list types");
1197 using type = etl::type_list_remove_from_t<etl::type_list_cat_unique_t<TypeLists...>, etl::type_list_select_common_types_t<TypeLists...>>;
1200 template <
typename... TypeLists>
1201 using type_list_select_not_common_types_t =
typename type_list_select_not_common_types<TypeLists...>::type;
integral_constant< bool, false > false_type
integral_constant specialisations
Definition type_traits.h:80
ETL_CONSTEXPR TContainer::size_type size(const TContainer &container)
Definition iterator.h:1434