29#ifndef ETL_TUPLE_INCLUDED
30#define ETL_TUPLE_INCLUDED
34#if ETL_NOT_USING_CPP11 && !defined(ETL_IN_UNIT_TEST)
35 #error NOT SUPPORTED FOR C++03 OR BELOW
58 template <
typename... TTypes>
74 template <
typename... TTypes>
75 struct is_tuple<etl::tuple<TTypes...>> : etl::true_type
79 namespace private_tuple
84 template <
typename T,
typename TTuple>
85 struct tuple_type_base;
89 struct tuple_type_base<T, tuple<>>
95 template <
typename T,
typename THead,
typename... TTail>
96 struct tuple_type_base<T, tuple<THead, TTail...>>
98 using type = etl::conditional_t<etl::is_same<T, THead>::value,
99 tuple<THead, TTail...>,
100 typename tuple_type_base<T, tuple<TTail...>>::type>;
104 template <
typename T,
typename TTuple>
105 using tuple_type_base_t =
typename tuple_type_base<T, TTuple>::type;
115 template <
typename T>
116 ETL_CONSTEXPR ignore_t operator =(T&&) const ETL_NOEXCEPT
131 using value_type = void;
132 using this_type = tuple<>;
133 using base_type = void;
134 using index_sequence_type = etl::make_index_sequence<0>;
140 void copy_assignment(
const this_type& )
148 void forward_assignment(this_type&& )
156 void swap(this_type& )
175 template<
typename THead,
typename... TTail>
176 class tuple<THead, TTail...> :
public tuple<TTail...>
184 template <
typename... UTypes>
185 static constexpr size_t number_of_types()
187 return sizeof...(UTypes);
195 template<
typename... UTypes>
198 template <
size_t Index,
typename... TTypes>
200 friend etl::tuple_element_t<Index, etl::tuple<TTypes...>>&
get(tuple<TTypes...>&);
202 template <
size_t Index,
typename... TTypes>
204 friend etl::tuple_element_t<Index, etl::tuple<TTypes...>>&&
get(tuple<TTypes...>&&);
206 template <
size_t Index,
typename... TTypes>
208 friend const etl::tuple_element_t<Index, etl::tuple<TTypes...>>&
get(
const tuple<TTypes...>&);
210 template <
size_t Index,
typename... TTypes>
212 friend const etl::tuple_element_t<Index, etl::tuple<TTypes...>>&&
get(
const tuple<TTypes...>&&);
214 template <
typename T,
typename... TTypes>
216 friend T&
get(tuple<TTypes...>&);
218 template <
typename T,
typename... TTypes>
220 friend T&&
get(tuple<TTypes...>&&);
222 template <
typename T,
typename... TTypes>
224 friend const T&
get(
const tuple<TTypes...>&);
226 template <
typename T,
typename... TTypes>
228 friend const T&&
get(
const tuple<TTypes...>&&);
233 using value_type = THead;
234 using this_type = tuple<THead, TTail...>;
235 using base_type = tuple<TTail...>;
236 using index_sequence_type = etl::make_index_sequence<number_of_types<THead, TTail...>()>;
251 tuple(
const tuple<THead, TTail...>& other) =
default;
257 tuple(tuple<THead, TTail...>&& other) =
default;
263 tuple& operator =(
const tuple<THead, TTail...>& other) =
default;
269 tuple& operator =(tuple<THead, TTail...>&& other) =
default;
275 template <
typename UHead,
typename... UTail, etl::enable_if_t<(number_of_types<THead, TTail...>() == number_of_types<UHead, UTail...>()) &&
276 (number_of_types<THead, TTail...>() >= 1U) &&
277 etl::is_convertible<UHead, THead>::value,
int> = 0>
279 tuple(tuple<UHead, UTail...>& other)
280 : base_type(other.get_base())
281 , value(other.get_value())
289 template <
typename UHead,
typename... UTail, etl::enable_if_t<(number_of_types<THead, TTail...>() == number_of_types<UHead, UTail...>()) &&
290 (number_of_types<THead, TTail...>() >= 1U) &&
291 !etl::is_convertible<UHead, THead>::value,
int> = 0>
293 explicit tuple(tuple<UHead, UTail...>& other)
294 : base_type(other.get_base())
295 , value(other.get_value())
303 template <
typename UHead,
typename... UTail, etl::enable_if_t<(number_of_types<THead, TTail...>() == number_of_types<UHead, UTail...>()) &&
304 (number_of_types<THead, TTail...>() >= 1U) &&
305 etl::is_convertible<UHead, THead>::value,
int> = 0>
307 tuple(
const tuple<UHead, UTail...>& other)
308 : base_type(other.get_base())
309 , value(other.get_value())
317 template <
typename UHead,
typename... UTail, etl::enable_if_t<(number_of_types<THead, TTail...>() == number_of_types<UHead, UTail...>()) &&
318 (number_of_types<THead, TTail...>() >= 1U) &&
319 !etl::is_convertible<UHead, THead>::value,
int> = 0>
321 explicit tuple(
const tuple<UHead, UTail...>& other)
322 : base_type(other.get_base())
323 , value(other.get_value())
331 template <
typename UHead,
typename... UTail, etl::enable_if_t<(number_of_types<THead, TTail...>() == number_of_types<UHead, UTail...>()) &&
332 (number_of_types<THead, TTail...>() >= 1U) &&
333 etl::is_convertible<UHead, THead>::value,
int> = 0>
335 tuple(tuple<UHead, UTail...>&& other)
336 : base_type(etl::forward<tuple<UTail...>>(other.get_base()))
337 , value(etl::forward<UHead>(other.get_value()))
345 template <
typename UHead,
typename... UTail, etl::enable_if_t<(number_of_types<THead, TTail...>() == number_of_types<UHead, UTail...>()) &&
346 (number_of_types<THead, TTail...>() >= 1U) &&
347 !etl::is_convertible<UHead, THead>::value,
int> = 0>
349 explicit tuple(tuple<UHead, UTail...>&& other)
350 : base_type(etl::forward<tuple<UTail...>>(other.get_base()))
351 , value(etl::forward<UHead>(other.get_value()))
359 template <
typename UHead,
typename... UTail, etl::enable_if_t<(number_of_types<THead, TTail...>() == number_of_types<UHead, UTail...>()) &&
360 (number_of_types<THead, TTail...>() >= 1U) &&
361 etl::is_convertible<UHead, THead>::value,
int> = 0>
363 tuple(
const tuple<UHead, UTail...>&& other)
364 : base_type(other.get_base())
365 , value(other.get_value())
373 template <
typename UHead,
typename... UTail, etl::enable_if_t<(number_of_types<THead, TTail...>() == number_of_types<UHead, UTail...>()) &&
374 (number_of_types<THead, TTail...>() >= 1U) &&
375 !etl::is_convertible<UHead, THead>::value,
int> = 0>
377 explicit tuple(
const tuple<UHead, UTail...>&& other)
378 : base_type(other.get_base())
379 , value(other.get_value())
387 tuple(
const THead& head,
const TTail&... tail)
397 template <
typename UHead,
typename... UTail, etl::enable_if_t<!is_tuple<etl::remove_reference_t<UHead>>::value &&
398 (number_of_types<THead, TTail...>() == number_of_types<UHead, UTail...>()) &&
399 (number_of_types<THead, TTail...>() >= 1U) &&
400 etl::is_convertible<UHead, THead>::value,
int> = 0>
402 tuple(UHead&& head, UTail&&... tail) ETL_NOEXCEPT
403 : base_type(etl::forward<UTail>(tail)...)
404 , value(etl::forward<UHead>(head))
412 template <
typename UHead,
typename... UTail, etl::enable_if_t<!is_tuple<etl::remove_reference_t<UHead>>::value &&
413 (number_of_types<THead, TTail...>() == number_of_types<UHead, UTail...>()) &&
414 (number_of_types<THead, TTail...>() >= 1U) &&
415 !etl::is_convertible<UHead, THead>::value,
int> = 0>
417 explicit tuple(UHead&& head, UTail&&... tail) ETL_NOEXCEPT
418 : base_type(etl::forward<UTail>(tail)...)
419 , value(etl::forward<UHead>(head))
427 template <
typename U1,
typename U2, etl::enable_if_t<number_of_types<THead, TTail...>() == 2U &&
428 etl ::is_convertible<U1, THead>::value &&
429 etl ::is_convertible<U2, typename base_type::value_type>::value,
int> = 0>
431 tuple(ETL_OR_STD::pair<U1, U2>& p) ETL_NOEXCEPT
432 : base_type(p.second)
441 template <
typename U1,
typename U2, etl::enable_if_t<number_of_types<THead, TTail...>() == 2U &&
442 (!etl ::is_convertible<U1, THead>::value ||
443 !etl ::is_convertible<U2, typename base_type::value_type>::value),
int> = 0>
445 explicit tuple(ETL_OR_STD::pair<U1, U2>& p) ETL_NOEXCEPT
446 : base_type(p.second)
455 template <
typename U1,
typename U2, etl::enable_if_t<number_of_types<THead, TTail...>() == 2U &&
456 etl ::is_convertible<U1, THead>::value &&
457 etl ::is_convertible<U2, typename base_type::value_type>::value,
int> = 0>
459 tuple(
const ETL_OR_STD::pair<U1, U2>& p) ETL_NOEXCEPT
460 : base_type(p.second)
469 template <
typename U1,
typename U2, etl::enable_if_t<number_of_types<THead, TTail...>() == 2U &&
470 (!etl ::is_convertible<U1, THead>::value ||
471 !etl ::is_convertible<U2, typename base_type::value_type>::value),
int> = 0>
473 explicit tuple(
const ETL_OR_STD::pair<U1, U2>& p) ETL_NOEXCEPT
474 : base_type(p.second)
483 template <
typename U1,
typename U2, etl::enable_if_t<number_of_types<THead, TTail...>() == 2U &&
484 etl ::is_convertible<U1, THead>::value &&
485 etl ::is_convertible<U2, typename base_type::value_type>::value,
int> = 0>
487 tuple(ETL_OR_STD::pair<U1, U2>&& p) ETL_NOEXCEPT
488 : base_type(etl::forward<U2>(p.second))
489 , value(etl::forward<U1>(p.first))
497 template <
typename U1,
typename U2, etl::enable_if_t<number_of_types<THead, TTail...>() == 2U &&
498 (!etl ::is_convertible<U1, THead>::value ||
499 !etl ::is_convertible<U2, typename base_type::value_type>::value),
int> = 0>
501 explicit tuple(ETL_OR_STD::pair<U1, U2>&& p) ETL_NOEXCEPT
502 : base_type(etl::forward<U2>(p.second))
503 , value(etl::forward<U1>(p.first))
511 template <
typename U1,
typename U2, etl::enable_if_t<number_of_types<THead, TTail...>() == 2U &&
512 etl ::is_convertible<U1, THead>::value &&
513 etl ::is_convertible<U2, typename base_type::value_type>::value,
int> = 0>
515 tuple(
const ETL_OR_STD::pair<U1, U2>&& p) ETL_NOEXCEPT
516 : base_type(etl::forward<U2>(p.second))
517 , value(etl::forward<U1>(p.first))
525 template <
typename U1,
typename U2, etl::enable_if_t<number_of_types<THead, TTail...>() == 2U &&
526 (!etl ::is_convertible<U1, THead>::value ||
527 !etl ::is_convertible<U2, typename base_type::value_type>::value),
int> = 0>
529 explicit tuple(
const ETL_OR_STD::pair<U1, U2>&& p) ETL_NOEXCEPT
530 : base_type(p.second)
538 template <
typename UHead,
typename... UTail, etl::enable_if_t<(number_of_types<THead, TTail...>() == number_of_types<UHead, UTail...>()),
int> = 0>
540 tuple&
operator =(
const tuple<UHead, UTail...>& other)
542 copy_assignment(other);
550 template <
typename UHead,
typename... UTail, etl::enable_if_t<(number_of_types<THead, TTail...>() == number_of_types<UHead, UTail...>()),
int> = 0>
552 tuple&
operator =(tuple<UHead, UTail...>&& other)
554 forward_assignment(etl::forward<tuple<UHead, UTail...>>(other));
562 template <
typename U1,
typename U2,
size_t NTypes = number_of_types<THead, TTail...>, etl::enable_if_t<NTypes == 2U, int> = 0>
564 tuple& operator =(pair<U1, U2>& p)
566 get_value() = p.first;
567 get_base().get_value() = p.second;
575 template <
typename U1,
typename U2,
size_t NTypes = number_of_types<THead, TTail...>, etl::enable_if_t<NTypes == 2U, int> = 0>
577 tuple& operator =(
const pair<U1, U2>& p)
579 get_value() = p.first;
580 get_base().get_value() = p.second;
588 template <
typename U1,
typename U2,
size_t NTypes = number_of_types<THead, TTail...>, etl::enable_if_t<NTypes == 2U, int> = 0>
590 tuple& operator =(pair<U1, U2>&& p)
592 get_value() = etl::forward<U1>(p.first);
593 get_base().get_value() = etl::forward<U2>(p.second);
601 template <
typename U1,
typename U2,
size_t NTypes = number_of_types<THead, TTail...>, etl::enable_if_t<NTypes == 2U, int> = 0>
603 tuple& operator =(
const pair<U1, U2>&& p)
605 get_value() = etl::forward<U1>(p.first);
606 get_base().get_value() = etl::forward<U2>(p.second);
615 void swap(this_type& other)
617 using ETL_OR_STD::swap;
620 swap(get_value(), other.get_value());
622 auto& this_base = get_base();
623 auto& other_base = other.get_base();
626 this_base.swap(other_base);
636 return number_of_types<THead, TTail...>();
655 const THead& get_value()
const
665 base_type& get_base()
667 return static_cast<base_type&
>(*this);
675 const base_type& get_base()
const
677 return static_cast<const base_type&
>(*this);
683 template <
typename UHead,
typename... UTail>
685 void copy_assignment(
const tuple<UHead, UTail...>& other)
688 this->value = other.get_value();
691 auto& this_base = get_base();
692 const auto& other_base = other.get_base();
695 this_base.copy_assignment(other_base);
701 template <
typename UHead,
typename... UTail>
703 void forward_assignment(tuple<UHead, UTail...>&& other)
706 this->value = etl::forward<UHead>(other.get_value());
708 auto& this_base = get_base();
709 auto&& other_base = other.get_base();
712 this_base.forward_assignment(etl::forward<tuple<UTail...>>(other_base));
724 template <
typename... TArgs>
725 tuple(TArgs... args) -> tuple<TArgs...>;
730 template <
typename T1,
typename T2>
731 tuple(ETL_OR_STD::pair<T1, T2>) -> tuple<T1, T2>;
737 template<
size_t Index,
typename... TTypes>
738 struct tuple_element<Index, etl::tuple<TTypes...>>
740 using type = etl::nth_type_t<Index, TTypes...>;
746 template <
typename... TTypes>
748 : etl::integral_constant<size_t, sizeof...(TTypes)>
755 template<
typename... Types>
756 struct common_type<etl::tuple<Types...>>
758 using type = etl::common_type_t<Types...>;
766 template <
size_t Index,
typename... TTypes>
769 etl::tuple_element_t<Index, etl::tuple<TTypes...>>&
get(tuple<TTypes...>& t)
771 ETL_STATIC_ASSERT(Index <
sizeof...(TTypes),
"etl::get<Index> - Index out of range");
774 using tuple_type = etl::nth_base_t<Index, tuple<TTypes...>>&;
777 return static_cast<tuple_type
>(t).get_value();
785 template <
size_t Index,
typename... TTypes>
788 const etl::tuple_element_t<Index, etl::tuple<TTypes...>>&
get(
const tuple<TTypes...>& t)
790 ETL_STATIC_ASSERT(Index <
sizeof...(TTypes),
"etl::get<Index> - Index out of range");
793 using tuple_type =
const etl::nth_base_t<Index, tuple<TTypes...>>&;
796 return static_cast<tuple_type
>(t).get_value();
804 template <
size_t Index,
typename... TTypes>
807 etl::tuple_element_t<Index, etl::tuple<TTypes...>>&&
get(tuple<TTypes...>&& t)
809 ETL_STATIC_ASSERT(Index <
sizeof...(TTypes),
"etl::get<Index> - Index out of range");
812 using tuple_type = etl::nth_base_t<Index, tuple<TTypes...>>&&;
815 return etl::move(
static_cast<tuple_type
>(t).get_value());
823 template <
size_t Index,
typename... TTypes>
826 const etl::tuple_element_t<Index, etl::tuple<TTypes...>>&&
get(
const tuple<TTypes...>&& t)
828 ETL_STATIC_ASSERT(Index <
sizeof...(TTypes),
"etl::get<Index> - Index out of range");
831 using tuple_type =
const etl::nth_base_t<Index, etl::tuple<TTypes...>>&&;
834 return etl::move(
static_cast<tuple_type
>(t).get_value());
842 template <
typename T,
typename... TTypes>
845 T&
get(tuple<TTypes...>& t)
847 ETL_STATIC_ASSERT(!(etl::has_duplicates_of<T, TTypes...>::value),
"etl::get<Type> - Tuple contains duplicate instances of T");
848 ETL_STATIC_ASSERT((etl::is_one_of<T, TTypes...>::value),
"etl::get<Type> - Tuple does not contain the specified type");
851 using tuple_type = etl::private_tuple::tuple_type_base_t<T, tuple<TTypes...>>&;
854 return static_cast<tuple_type
>(t).get_value();
862 template <
typename T,
typename... TTypes>
865 const T&
get(
const tuple<TTypes...>& t)
867 ETL_STATIC_ASSERT(!(etl::has_duplicates_of<T, TTypes...>::value),
"etl::get<Type> - Tuple contains duplicate instances of T");
868 ETL_STATIC_ASSERT((etl::is_one_of<T, TTypes...>::value),
"etl::get<Type> - Tuple does not contain the specified type");
871 using tuple_type =
const etl::private_tuple::tuple_type_base_t<T, tuple<TTypes...>>&;
874 return static_cast<tuple_type
>(t).get_value();
882 template <
typename T,
typename... TTypes>
885 T&&
get(tuple<TTypes...>&& t)
887 ETL_STATIC_ASSERT(!(etl::has_duplicates_of<T, TTypes...>::value),
"etl::get<Type> - Tuple contains duplicate instances of T");
888 ETL_STATIC_ASSERT((etl::is_one_of<T, TTypes...>::value),
"etl::get<Type> - Tuple does not contain the specified type");
891 using tuple_type = etl::private_tuple::tuple_type_base_t<T, tuple<TTypes...>>&&;
894 return etl::move(
static_cast<tuple_type
>(t).get_value());
902 template <
typename T,
typename... TTypes>
905 const T&&
get(
const tuple<TTypes...>&& t)
907 ETL_STATIC_ASSERT(!(etl::has_duplicates_of<T, TTypes...>::value),
"etl::get<Type> - Tuple contains duplicate instances of T");
908 ETL_STATIC_ASSERT((etl::is_one_of<T, TTypes...>::value),
"etl::get<Type> - Tuple does not contain the specified type");
911 using tuple_type =
const etl::private_tuple::tuple_type_base_t<T, tuple<TTypes...>>&&;
914 return etl::move(
static_cast<tuple_type
>(t).get_value());
918 inline constexpr private_tuple::ignore_t ignore;
920 static constexpr private_tuple::ignore_t ignore;
926 template <
typename... TTypes>
928 etl::tuple<TTypes&...> tie(TTypes&... args)
936 template <
typename... TTypes>
939 etl::tuple<etl::unwrap_ref_decay_t<TTypes>...> make_tuple(TTypes&&... args)
941 return etl::tuple<unwrap_ref_decay_t<TTypes>...>(etl::forward<TTypes>(args)...);
948 template <
typename TTuple,
size_t... Indices>
951 auto select_from_tuple(TTuple&& tuple, etl::index_sequence<Indices...>)
952 -> etl::tuple<etl::tuple_element_t<Indices, etl::decay_t<TTuple>>...>
954 ETL_STATIC_ASSERT(
sizeof...(Indices) <= etl::tuple_size<etl::decay_t<TTuple>>::value,
"Number of indices is greater than the tuple size");
956 return etl::make_tuple(etl::forward<etl::tuple_element_t<Indices, etl::decay_t<TTuple>>>(
etl::get<Indices>(etl::forward<TTuple>(tuple)))...);
963 template <
size_t... Indices,
typename TTuple>
966 auto select_from_tuple(TTuple&& tuple)
967 -> etl::tuple<etl::tuple_element_t<Indices, etl::decay_t<TTuple>>...>
969 return select_from_tuple(etl::forward<TTuple>(tuple), etl::index_sequence<Indices...>{});
975 template <
typename... TTypes>
978 etl::tuple<TTypes&&...> forward_as_tuple(TTypes&&... args)
980 return tuple<TTypes&&...>(etl::forward<TTypes>(args)...);
983 namespace private_tuple
988 template <
typename Tuple1,
typename Tuple2,
size_t... Index1,
size_t... Index2>
990 auto tuple_cat_impl(Tuple1&& t1, etl::index_sequence<Index1...>, Tuple2&& t2, etl::index_sequence<Index2...>)
991 -> etl::tuple<etl::tuple_element_t<Index1, etl::decay_t<Tuple1>>..., etl::tuple_element_t<Index2, etl::decay_t<Tuple2>>...>
993 return etl::tuple<etl::tuple_element_t<Index1, etl::decay_t<Tuple1>>...,
994 etl::tuple_element_t<Index2, etl::decay_t<Tuple2>>...>
1002 template <
typename Tuple>
1005 auto tuple_cat(Tuple&& t) -> Tuple
1007 return etl::forward<Tuple>(t);
1013 template <
typename Tuple1,
typename Tuple2,
typename... Tuples>
1016 auto tuple_cat(Tuple1&& t1, Tuple2&& t2, Tuples&&... ts)
1017 ->
decltype(private_tuple::tuple_cat_impl(etl::forward<Tuple1>(t1),
1018 etl::make_index_sequence<etl::tuple_size<etl::decay_t<Tuple1>>::value>{},
1019 etl::forward<Tuple2>(t2),
1020 etl::make_index_sequence<etl::tuple_size<etl::decay_t<Tuple2>>::value>{}))
1022 auto concatenated = private_tuple::tuple_cat_impl(etl::forward<Tuple1>(t1),
1023 etl::make_index_sequence<etl::tuple_size<etl::decay_t<Tuple1>>::value>{},
1024 etl::forward<Tuple2>(t2),
1025 etl::make_index_sequence<etl::tuple_size<etl::decay_t<Tuple2>>::value>{});
1027 return tuple_cat(etl::move(concatenated), etl::forward<Tuples>(ts)...);
1035 namespace private_tuple
1038 template<
typename TEtl_Tuple,
size_t... Indices>
1041 auto to_std_impl(
const TEtl_Tuple& etl_tuple, etl::index_sequence<Indices...>)
1042 -> std::tuple<typename etl::tuple_element_t<Indices, TEtl_Tuple>...>
1044 return std::tuple<etl::tuple_element_t<Indices, TEtl_Tuple>...>(
etl::get<Indices>(etl_tuple)...);
1048 template<
typename TEtl_Tuple,
size_t... Indices>
1051 auto to_std_impl(TEtl_Tuple&& etl_tuple, etl::index_sequence<Indices...>)
1052 -> std::tuple<etl::tuple_element_t<Indices, TEtl_Tuple>...>
1054 return std::tuple<etl::tuple_element_t<Indices, TEtl_Tuple>...>(etl::move(
etl::get<Indices>(etl_tuple))...);
1061 template<
typename... TTypes>
1064 auto to_std(
const etl::tuple<TTypes...>& etl_tuple)
1065 -> std::tuple<etl::decay_t<TTypes>...>
1067 return private_tuple::to_std_impl(etl_tuple, etl::make_index_sequence_for<TTypes...>());
1073 template<
typename... TTypes>
1076 auto to_std(etl::tuple<TTypes...>&& etl_tuple)
1077 -> std::tuple<etl::decay_t<TTypes>...>
1079 return private_tuple::to_std_impl(etl::move(etl_tuple), etl::make_index_sequence_for<TTypes...>());
1086 namespace private_tuple
1089 template<
typename TStd_Tuple,
size_t... Indices>
1092 auto to_etl_impl(
const TStd_Tuple& std_tuple, etl::index_sequence<Indices...>)
1093 -> etl::tuple<typename std::tuple_element<Indices, TStd_Tuple>::type...>
1095 return etl::tuple<typename std::tuple_element<Indices, TStd_Tuple>::type...>(std::get<Indices>(std_tuple)...);
1099 template<
typename TStd_Tuple,
size_t... Indices>
1102 auto to_etl_impl(TStd_Tuple&& std_tuple, etl::index_sequence<Indices...>)
1103 -> etl::tuple<typename std::tuple_element<Indices, TStd_Tuple>::type...>
1105 return etl::tuple<typename std::tuple_element<Indices, TStd_Tuple>::type...>(std::move(std::get<Indices>(std_tuple))...);
1112 template<
typename... TTypes>
1115 auto to_etl(
const std::tuple<TTypes...>& std_tuple)
1116 -> etl::tuple<etl::decay_t<TTypes>...>
1118 return private_tuple::to_etl_impl(std_tuple, etl::make_index_sequence_for<TTypes...>());
1124 template<
typename... TTypes>
1127 auto to_etl(std::tuple<TTypes...>&& std_tuple)
1128 -> etl::tuple<etl::decay_t<TTypes>...>
1130 return private_tuple::to_etl_impl(etl::move(std_tuple), etl::make_index_sequence_for<TTypes...>());
1134 namespace private_tuple
1140 template <
typename TTuple1,
typename TTuple2>
1143 bool tuple_equality(
const TTuple1& ,
const TTuple2& , etl::index_sequence<>)
1149 template <
typename TTuple1,
typename TTuple2,
size_t Index,
size_t... Indices>
1152 bool tuple_equality(
const TTuple1& lhs,
const TTuple2& rhs, etl::index_sequence<Index, Indices...>)
1161 template <
typename TTuple1,
typename TTuple2>
1164 bool tuple_less_than(
const TTuple1& ,
const TTuple2& , etl::index_sequence<>)
1170 template <
typename TTuple1,
typename TTuple2,
size_t Index,
size_t... Indices>
1173 bool tuple_less_than(
const TTuple1& lhs,
const TTuple2& rhs, etl::index_sequence<Index, Indices...>)
1175 if (get<Index>(lhs) < get<Index>(rhs))
1180 if (get<Index>(rhs) < get<Index>(lhs))
1185 return tuple_less_than(lhs, rhs, etl::index_sequence<Indices...>{});
1192 template <
typename... TTypes,
typename... UTypes>
1195 bool operator ==(
const etl::tuple<TTypes...>& lhs,
1196 const etl::tuple<UTypes...>& rhs)
1198 ETL_STATIC_ASSERT(
sizeof...(TTypes) ==
sizeof...(UTypes),
"Cannot compare tuples of different sizes");
1201 return private_tuple::tuple_equality(lhs, rhs, etl::make_index_sequence<etl::tuple<TTypes...>::size()>{});
1207 template <
typename... TTypes,
typename... UTypes>
1210 bool operator !=(
const etl::tuple<TTypes...>& lhs,
1211 const etl::tuple<UTypes...>& rhs)
1213 return !(lhs == rhs);
1219 template <
typename... TTypes,
typename... UTypes>
1222 bool operator <(
const etl::tuple<TTypes...>& lhs,
1223 const etl::tuple<UTypes...>& rhs)
1225 ETL_STATIC_ASSERT(
sizeof...(TTypes) ==
sizeof...(UTypes),
"Cannot compare tuples of different sizes");
1228 return private_tuple::tuple_less_than(lhs, rhs, etl::make_index_sequence<etl::tuple<TTypes...>::size()>{});
1234 template <
typename... TTypes,
typename... UTypes>
1237 bool operator <=(
const etl::tuple<TTypes...>& lhs,
1238 const etl::tuple<UTypes...>& rhs)
1240 return !(rhs < lhs);
1246 template <
typename... TTypes,
typename... UTypes>
1249 bool operator >(
const etl::tuple<TTypes...>& lhs,
1250 const etl::tuple<UTypes...>& rhs)
1258 template <
typename... TTypes,
typename... UTypes>
1261 bool operator >=(
const etl::tuple<TTypes...>& lhs,
1262 const etl::tuple<UTypes...>& rhs)
1264 return !(lhs < rhs);
1270 template <
typename... TTypes>
1272 void swap(etl::tuple<TTypes...>& lhs, etl::tuple<TTypes...>& rhs)
1280#if ETL_NOT_USING_STL && !((defined(ETL_DEVELOPMENT_OS_APPLE) || \
1281 (ETL_COMPILER_FULL_VERSION >= 190000)) && defined(ETL_COMPILER_CLANG))
1282 template <
typename T>
1285 template <
size_t Index,
typename TType>
1286 struct tuple_element;
1292 template <
typename... Types>
1293 struct tuple_size<etl::tuple<Types...>> : etl::integral_constant<size_t, sizeof...(Types)>
1300 template <
size_t Index,
typename... Types>
1301 struct tuple_element<Index, etl::tuple<Types...>>
1303 using type =
typename etl::nth_type_t<Index, Types...>;
void swap(etl::array_view< T > &lhs, etl::array_view< T > &rhs) ETL_NOEXCEPT
Swaps the values.
Definition array_view.h:650
integral_constant< bool, false > false_type
integral_constant specialisations
Definition type_traits_generator.h:899
bitset_ext
Definition absolute.h:39
ETL_CONSTEXPR14 void swap(etl::typed_storage_ext< T > &lhs, etl::typed_storage_ext< T > &rhs) ETL_NOEXCEPT
Swap two etl::typed_storage_ext.
Definition alignment.h:838
bool operator>(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1190
bool operator>=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1202
bool operator!=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1151
ETL_CONSTEXPR TContainer::size_type size(const TContainer &container)
Definition iterator.h:1187
bool operator==(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1139
T & get(array< T, Size > &a)
Definition array.h:1216
bool operator<(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1163
bool operator<=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1178
Definition tuple_size.h:38