29#ifndef ETL_PARAMETER_PACK
30#define ETL_PARAMETER_PACK
37#if ETL_CPP11_SUPPORTED
43 template <
typename... TTypes>
48 static constexpr size_t size =
sizeof...(TTypes);
59 template <
typename Type,
typename T1,
typename... TRest>
60 struct index_of_type_helper
62 static constexpr size_t value = etl::is_same<Type, T1>::value ? 1 : 1 + index_of_type_helper<Type, TRest...>::value;
66 template <
typename Type,
typename T1>
67 struct index_of_type_helper<Type, T1>
69 static constexpr size_t value = 1;
74 static_assert(etl::is_one_of<T, TTypes...>::value,
"T is not in parameter pack");
77 static constexpr size_t value = index_of_type_helper<T, TTypes...>::value - 1;
82 static constexpr size_t index_of_type_v = index_of_type<T>::value;
88 template <
size_t Index>
94 template <
size_t Desired_Index,
size_t Current_Index,
typename T1,
typename... TRest>
95 struct type_from_index_helper
97 using type =
typename etl::conditional< Desired_Index == Current_Index, T1,
98 typename type_from_index_helper<Desired_Index, Current_Index + 1, TRest...>::type>::type;
102 template <
size_t Desired_Index,
size_t Current_Index,
typename T1>
103 struct type_from_index_helper<Desired_Index, Current_Index, T1>
110 static_assert(Index <
sizeof...(TTypes),
"Index out of bounds of parameter pack");
113 using type =
typename type_from_index_helper<Index, 0, TTypes...>::type;
117 template <
size_t Index>
118 using type_from_index_t =
typename type_from_index<Index>::type;
122 template <
size_t Index,
typename... TTypes>
123 using parameter_pack_t =
typename etl::parameter_pack<TTypes...>::template type_from_index_t<Index>;
126 template <
typename... TTypes>
127 constexpr size_t parameter_pack<TTypes...>
::size;
130 template <
typename T,
typename... TTypes>
131 inline constexpr size_t parameter_pack_v = etl::parameter_pack<TTypes...>::template index_of_type<T>::value;
134 #if ETL_USING_CPP17 && !ETL_USING_GCC_COMPILER && !ETL_USING_CLANG_COMPILER
136 template <
typename... TTypes>
137 template <
typename T>
138 constexpr size_t parameter_pack<TTypes...>::template index_of_type<T>::value;
141 template <
typename... TTypes>
142 template <
typename T>
143 constexpr size_t parameter_pack<TTypes...>::index_of_type<T>::value;
ETL_CONSTEXPR TContainer::size_type size(const TContainer &container)
Definition iterator.h:1434