29#ifndef ETL_TUPLE_INCLUDED
30#define ETL_TUPLE_INCLUDED
43 #include "type_list.h"
56 template <
typename... TTypes>
72 template <
typename... TTypes>
73 struct is_tuple<etl::tuple<TTypes...>> : etl::true_type
77 namespace private_tuple
82 template <
typename T,
typename TTuple>
83 struct tuple_type_base;
87 struct tuple_type_base<T, tuple<>>
93 template <
typename T,
typename THead,
typename... TTail>
94 struct tuple_type_base<T, tuple<THead, TTail...>>
96 using type = etl::conditional_t<etl::is_same<T, THead>::value, tuple<THead, TTail...>,
typename tuple_type_base<T, tuple<TTail...>>::type>;
100 template <
typename T,
typename TTuple>
101 using tuple_type_base_t =
typename tuple_type_base<T, TTuple>::type;
112 template <
typename T>
113 ETL_CONSTEXPR ignore_t operator=(T&&) const ETL_NOEXCEPT
128 using value_type = void;
129 using this_type = tuple<>;
130 using base_type = void;
131 using type_list = etl::type_list<>;
132 using index_sequence_type = etl::make_index_sequence<0>;
137 ETL_CONSTEXPR14
void copy_assignment(
const this_type& )
144 ETL_CONSTEXPR14
void forward_assignment(this_type&& )
151 ETL_CONSTEXPR14
void swap(this_type& )
159 ETL_NODISCARD ETL_CONSTEXPR
static size_t size()
168 template <
typename THead,
typename... TTail>
169 class tuple<THead, TTail...> :
public tuple<TTail...>
177 template <
typename... UTypes>
178 static constexpr size_t number_of_types()
180 return sizeof...(UTypes);
188 template <
typename... UTypes>
191 template <
size_t Index,
typename... TTypes>
192 ETL_CONSTEXPR14
friend etl::tuple_element_t<Index, etl::tuple<TTypes...>>&
get(tuple<TTypes...>&);
194 template <
size_t Index,
typename... TTypes>
195 ETL_CONSTEXPR14
friend etl::tuple_element_t<Index, etl::tuple<TTypes...>>&&
get(tuple<TTypes...>&&);
197 template <
size_t Index,
typename... TTypes>
198 ETL_CONSTEXPR14
friend const etl::tuple_element_t<Index, etl::tuple<TTypes...>>&
get(
const tuple<TTypes...>&);
200 template <
size_t Index,
typename... TTypes>
201 ETL_CONSTEXPR14
friend const etl::tuple_element_t<Index, etl::tuple<TTypes...>>&&
get(
const tuple<TTypes...>&&);
203 template <
typename T,
typename... TTypes>
204 ETL_CONSTEXPR14
friend T&
get(tuple<TTypes...>&);
206 template <
typename T,
typename... TTypes>
207 ETL_CONSTEXPR14
friend T&&
get(tuple<TTypes...>&&);
209 template <
typename T,
typename... TTypes>
210 ETL_CONSTEXPR14
friend const T&
get(
const tuple<TTypes...>&);
212 template <
typename T,
typename... TTypes>
213 ETL_CONSTEXPR14
friend const T&&
get(
const tuple<TTypes...>&&);
218 using value_type = THead;
219 using this_type = tuple<THead, TTail...>;
220 using base_type = tuple<TTail...>;
221 using type_list = etl::type_list<THead, TTail...>;
222 using index_sequence_type = etl::make_index_sequence< number_of_types< THead, TTail...>()>;
228 ETL_CONSTEXPR14 tuple()
236 ETL_CONSTEXPR14 tuple(
const tuple<THead, TTail...>& other) =
default;
241 ETL_CONSTEXPR14 tuple(tuple<THead, TTail...>&& other) =
default;
246 ETL_CONSTEXPR14 tuple& operator=(
const tuple<THead, TTail...>& other) =
default;
251 ETL_CONSTEXPR14 tuple& operator=(tuple<THead, TTail...>&& other) =
default;
257 template <
typename UHead,
typename... UTail,
258 etl::enable_if_t<(number_of_types<THead, TTail...>() == number_of_types<UHead, UTail...>())
259 && (number_of_types<THead, TTail...>() >= 1U) && etl::is_convertible<UHead, THead>::value,
261 ETL_CONSTEXPR14 tuple(tuple<UHead, UTail...>& other)
262 : base_type(other.get_base())
263 , value(other.get_value())
271 template <
typename UHead,
typename... UTail,
272 etl::enable_if_t<(number_of_types<THead, TTail...>() == number_of_types<UHead, UTail...>())
273 && (number_of_types<THead, TTail...>() >= 1U) && !etl::is_convertible<UHead, THead>::value,
275 ETL_CONSTEXPR14
explicit tuple(tuple<UHead, UTail...>& other)
276 : base_type(other.get_base())
277 , value(other.get_value())
285 template <
typename UHead,
typename... UTail,
286 etl::enable_if_t<(number_of_types<THead, TTail...>() == number_of_types<UHead, UTail...>())
287 && (number_of_types<THead, TTail...>() >= 1U) && etl::is_convertible<UHead, THead>::value,
289 ETL_CONSTEXPR14 tuple(
const tuple<UHead, UTail...>& other)
290 : base_type(other.get_base())
291 , value(other.get_value())
299 template <
typename UHead,
typename... UTail,
300 etl::enable_if_t<(number_of_types<THead, TTail...>() == number_of_types<UHead, UTail...>())
301 && (number_of_types<THead, TTail...>() >= 1U) && !etl::is_convertible<UHead, THead>::value,
303 ETL_CONSTEXPR14
explicit tuple(
const tuple<UHead, UTail...>& other)
304 : base_type(other.get_base())
305 , value(other.get_value())
313 template <
typename UHead,
typename... UTail,
314 etl::enable_if_t<(number_of_types<THead, TTail...>() == number_of_types<UHead, UTail...>())
315 && (number_of_types<THead, TTail...>() >= 1U) && etl::is_convertible<UHead, THead>::value,
317 ETL_CONSTEXPR14 tuple(tuple<UHead, UTail...>&& other)
318 : base_type(etl::forward<tuple<UTail...>>(other.get_base()))
319 , value(etl::forward<UHead>(other.get_value()))
327 template <
typename UHead,
typename... UTail,
328 etl::enable_if_t<(number_of_types<THead, TTail...>() == number_of_types<UHead, UTail...>())
329 && (number_of_types<THead, TTail...>() >= 1U) && !etl::is_convertible<UHead, THead>::value,
331 ETL_CONSTEXPR14
explicit tuple(tuple<UHead, UTail...>&& other)
332 : base_type(etl::forward<tuple<UTail...>>(other.get_base()))
333 , value(etl::forward<UHead>(other.get_value()))
341 template <
typename UHead,
typename... UTail,
342 etl::enable_if_t<(number_of_types<THead, TTail...>() == number_of_types<UHead, UTail...>())
343 && (number_of_types<THead, TTail...>() >= 1U) && etl::is_convertible<UHead, THead>::value,
345 ETL_CONSTEXPR14 tuple(
const tuple<UHead, UTail...>&& other)
346 : base_type(other.get_base())
347 , value(other.get_value())
355 template <
typename UHead,
typename... UTail,
356 etl::enable_if_t<(number_of_types<THead, TTail...>() == number_of_types<UHead, UTail...>())
357 && (number_of_types<THead, TTail...>() >= 1U) && !etl::is_convertible<UHead, THead>::value,
359 ETL_CONSTEXPR14
explicit tuple(
const tuple<UHead, UTail...>&& other)
360 : base_type(other.get_base())
361 , value(other.get_value())
368 ETL_CONSTEXPR14 tuple(
const THead& head,
const TTail&... tail)
379 typename UHead,
typename... UTail,
380 etl::enable_if_t< !is_tuple<etl::remove_reference_t<UHead>>::value && (number_of_types<THead, TTail...>() == number_of_types<UHead, UTail...>())
381 && (number_of_types<THead, TTail...>() >= 1U) && etl::is_convertible<UHead, THead>::value,
383 ETL_CONSTEXPR14 tuple(UHead&& head, UTail&&... tail) ETL_NOEXCEPT
384 : base_type(etl::forward<UTail>(tail)...)
385 , value(etl::forward<UHead>(head))
394 typename UHead,
typename... UTail,
395 etl::enable_if_t<!is_tuple<etl::remove_reference_t<UHead>>::value && (number_of_types<THead, TTail...>() == number_of_types<UHead, UTail...>())
396 && (number_of_types<THead, TTail...>() >= 1U) && !etl::is_convertible<UHead, THead>::value,
398 ETL_CONSTEXPR14
explicit tuple(UHead&& head, UTail&&... tail) ETL_NOEXCEPT
399 : base_type(etl::forward<UTail>(tail)...)
400 , value(etl::forward<UHead>(head))
408 template <
typename U1,
typename U2,
409 etl::enable_if_t<number_of_types<THead, TTail...>() == 2U && etl::is_convertible<U1, THead>::value
410 && etl::is_convertible< U2, typename base_type::value_type>::value,
412 ETL_CONSTEXPR14 tuple(ETL_OR_STD::pair<U1, U2>& p) ETL_NOEXCEPT
413 : base_type(p.second)
422 template <
typename U1,
typename U2,
423 etl::enable_if_t<number_of_types<THead, TTail...>() == 2U
424 && (!etl::is_convertible<U1, THead>::value || !etl::is_convertible< U2, typename base_type::value_type>::value),
426 ETL_CONSTEXPR14
explicit tuple(ETL_OR_STD::pair<U1, U2>& p) ETL_NOEXCEPT
427 : base_type(p.second)
436 template <
typename U1,
typename U2,
437 etl::enable_if_t<number_of_types<THead, TTail...>() == 2U && etl::is_convertible<U1, THead>::value
438 && etl::is_convertible< U2, typename base_type::value_type>::value,
440 ETL_CONSTEXPR14 tuple(
const ETL_OR_STD::pair<U1, U2>& p) ETL_NOEXCEPT
441 : base_type(p.second)
450 template <
typename U1,
typename U2,
451 etl::enable_if_t<number_of_types<THead, TTail...>() == 2U
452 && (!etl::is_convertible<U1, THead>::value || !etl::is_convertible< U2, typename base_type::value_type>::value),
454 ETL_CONSTEXPR14
explicit tuple(
const ETL_OR_STD::pair<U1, U2>& p) ETL_NOEXCEPT
455 : base_type(p.second)
464 template <
typename U1,
typename U2,
465 etl::enable_if_t<number_of_types<THead, TTail...>() == 2U && etl::is_convertible<U1, THead>::value
466 && etl::is_convertible< U2, typename base_type::value_type>::value,
468 ETL_CONSTEXPR14 tuple(ETL_OR_STD::pair<U1, U2>&& p) ETL_NOEXCEPT
469 : base_type(etl::forward<U2>(p.second))
470 , value(etl::forward<U1>(p.first))
478 template <
typename U1,
typename U2,
479 etl::enable_if_t<number_of_types<THead, TTail...>() == 2U
480 && (!etl::is_convertible<U1, THead>::value || !etl::is_convertible< U2, typename base_type::value_type>::value),
482 ETL_CONSTEXPR14
explicit tuple(ETL_OR_STD::pair<U1, U2>&& p) ETL_NOEXCEPT
483 : base_type(etl::forward<U2>(p.second))
484 , value(etl::forward<U1>(p.first))
492 template <
typename U1,
typename U2,
493 etl::enable_if_t<number_of_types<THead, TTail...>() == 2U && etl::is_convertible<U1, THead>::value
494 && etl::is_convertible< U2, typename base_type::value_type>::value,
496 ETL_CONSTEXPR14 tuple(
const ETL_OR_STD::pair<U1, U2>&& p) ETL_NOEXCEPT
497 : base_type(etl::forward<const U2>(p.second))
498 , value(etl::forward<const U1>(p.first))
506 template <
typename U1,
typename U2,
507 etl::enable_if_t<number_of_types<THead, TTail...>() == 2U
508 && (!etl::is_convertible<U1, THead>::value || !etl::is_convertible< U2, typename base_type::value_type>::value),
510 ETL_CONSTEXPR14
explicit tuple(
const ETL_OR_STD::pair<U1, U2>&& p) ETL_NOEXCEPT
511 : base_type(etl::forward<const U2>(p.second))
512 , value(etl::forward<const U1>(p.first))
519 template <
typename UHead,
typename... UTail,
520 etl::enable_if_t<(number_of_types<THead, TTail...>() == number_of_types<UHead, UTail...>()),
int> = 0>
521 ETL_CONSTEXPR14 tuple&
operator=(
const tuple<UHead, UTail...>& other)
523 copy_assignment(other);
531 template <
typename UHead,
typename... UTail,
532 etl::enable_if_t<(number_of_types<THead, TTail...>() == number_of_types<UHead, UTail...>()),
int> = 0>
533 ETL_CONSTEXPR14 tuple&
operator=(tuple<UHead, UTail...>&& other)
535 forward_assignment(etl::forward<tuple<UHead, UTail...>>(other));
543 template <
typename U1,
typename U2,
size_t NTypes = number_of_types<THead, TTail...>(), etl::enable_if_t<NTypes == 2U, int> = 0>
544 ETL_CONSTEXPR14 tuple&
operator=(ETL_OR_STD::pair<U1, U2>& p)
546 get_value() = p.first;
547 get_base().get_value() = p.second;
555 template <
typename U1,
typename U2,
size_t NTypes = number_of_types<THead, TTail...>(), etl::enable_if_t<NTypes == 2U, int> = 0>
556 ETL_CONSTEXPR14 tuple&
operator=(
const ETL_OR_STD::pair<U1, U2>& p)
558 get_value() = p.first;
559 get_base().get_value() = p.second;
567 template <
typename U1,
typename U2,
size_t NTypes = number_of_types<THead, TTail...>(), etl::enable_if_t<NTypes == 2U, int> = 0>
568 ETL_CONSTEXPR14 tuple&
operator=(ETL_OR_STD::pair<U1, U2>&& p)
570 get_value() = etl::forward<U1>(p.first);
571 get_base().get_value() = etl::forward<U2>(p.second);
579 template <
typename U1,
typename U2,
size_t NTypes = number_of_types<THead, TTail...>(), etl::enable_if_t<NTypes == 2U, int> = 0>
580 ETL_CONSTEXPR14 tuple&
operator=(
const ETL_OR_STD::pair<U1, U2>&& p)
582 get_value() = etl::forward<const U1>(p.first);
583 get_base().get_value() = etl::forward<const U2>(p.second);
591 ETL_CONSTEXPR14
void swap(this_type& other)
593 using ETL_OR_STD::swap;
596 swap(get_value(), other.get_value());
598 auto& this_base = get_base();
599 auto& other_base = other.get_base();
603 this_base.swap(other_base);
610 constexpr static size_t size()
612 return number_of_types<THead, TTail...>();
620 ETL_NODISCARD ETL_CONSTEXPR14 THead& get_value()
628 ETL_CONSTEXPR
const THead& get_value()
const
636 ETL_NODISCARD ETL_CONSTEXPR14 base_type& get_base()
638 return static_cast<base_type&
>(*this);
644 ETL_NODISCARD ETL_CONSTEXPR14
const base_type& get_base()
const
646 return static_cast<const base_type&
>(*this);
652 template <
typename UHead,
typename... UTail>
653 ETL_CONSTEXPR14
void copy_assignment(
const tuple<UHead, UTail...>& other)
656 this->value = other.get_value();
659 auto& this_base = get_base();
660 const auto& other_base = other.get_base();
664 this_base.copy_assignment(other_base);
670 template <
typename UHead,
typename... UTail>
671 ETL_CONSTEXPR14
void forward_assignment(tuple<UHead, UTail...>&& other)
674 this->value = etl::forward<UHead>(other.get_value());
676 auto& this_base = get_base();
677 auto&& other_base = other.get_base();
681 this_base.forward_assignment(etl::forward<tuple<UTail...>>(other_base));
693 template <
typename... TArgs>
694 tuple(TArgs... args) -> tuple<TArgs...>;
699 template <
typename T1,
typename T2>
700 tuple(ETL_OR_STD::pair<T1, T2>) -> tuple<T1, T2>;
706 template <
size_t Index,
typename... TTypes>
707 struct tuple_element<Index, etl::tuple<TTypes...>>
709 using type = etl::nth_type_t<Index, TTypes...>;
715 template <
typename... TTypes>
716 struct tuple_size<etl::tuple<TTypes...>> : etl::integral_constant<size_t, sizeof...(TTypes)>
723 template <
typename... Types>
724 struct common_type<etl::tuple<Types...>>
726 using type = etl::common_type_t<Types...>;
734 template <
size_t Index,
typename... TTypes>
735 ETL_NODISCARD ETL_CONSTEXPR14 etl::tuple_element_t<Index, etl::tuple<TTypes...>>&
get(tuple<TTypes...>& t)
737 ETL_STATIC_ASSERT(Index <
sizeof...(TTypes),
"etl::get<Index> - Index out of range");
740 using tuple_type = etl::nth_base_t<Index, tuple<TTypes...>>&;
743 return static_cast<tuple_type
>(t).get_value();
751 template <
size_t Index,
typename... TTypes>
752 ETL_NODISCARD ETL_CONSTEXPR14
const etl::tuple_element_t<Index, etl::tuple<TTypes...>>&
get(
const tuple<TTypes...>& t)
754 ETL_STATIC_ASSERT(Index <
sizeof...(TTypes),
"etl::get<Index> - Index out of range");
757 using tuple_type =
const etl::nth_base_t<Index, tuple<TTypes...>>&;
760 return static_cast<tuple_type
>(t).get_value();
768 template <
size_t Index,
typename... TTypes>
769 ETL_NODISCARD ETL_CONSTEXPR14 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...>>&&;
775 using element_type = etl::tuple_element_t<Index, etl::tuple<TTypes...>>;
780 return static_cast<element_type&&
>(
static_cast<tuple_type
>(t).get_value());
788 template <
size_t Index,
typename... TTypes>
789 ETL_NODISCARD ETL_CONSTEXPR14
const etl::tuple_element_t<Index, etl::tuple<TTypes...>>&&
get(
const tuple<TTypes...>&& t)
791 ETL_STATIC_ASSERT(Index <
sizeof...(TTypes),
"etl::get<Index> - Index out of range");
794 using tuple_type =
const etl::nth_base_t<Index, etl::tuple<TTypes...>>&&;
795 using element_type = etl::tuple_element_t<Index, etl::tuple<TTypes...>>;
800 return static_cast<const element_type&&
>(
static_cast<tuple_type
>(t).get_value());
808 template <
typename T,
typename... TTypes>
809 ETL_NODISCARD ETL_CONSTEXPR14 T&
get(tuple<TTypes...>& t)
811 ETL_STATIC_ASSERT(!(etl::has_duplicates_of<T, TTypes...>::value),
"etl::get<Type> - Tuple contains duplicate instances of T");
812 ETL_STATIC_ASSERT((etl::is_one_of<T, TTypes...>::value),
"etl::get<Type> - Tuple does not contain the specified type");
815 using tuple_type = etl::private_tuple::tuple_type_base_t<T, tuple<TTypes...>>&;
818 return static_cast<tuple_type
>(t).get_value();
826 template <
typename T,
typename... TTypes>
827 ETL_NODISCARD ETL_CONSTEXPR14
const T&
get(
const tuple<TTypes...>& t)
829 ETL_STATIC_ASSERT(!(etl::has_duplicates_of<T, TTypes...>::value),
"etl::get<Type> - Tuple contains duplicate instances of T");
830 ETL_STATIC_ASSERT((etl::is_one_of<T, TTypes...>::value),
"etl::get<Type> - Tuple does not contain the specified type");
833 using tuple_type =
const etl::private_tuple::tuple_type_base_t<T, tuple<TTypes...>>&;
836 return static_cast<tuple_type
>(t).get_value();
844 template <
typename T,
typename... TTypes>
845 ETL_NODISCARD ETL_CONSTEXPR14 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...>>&&;
856 return static_cast<T&&
>(
static_cast<tuple_type
>(t).get_value());
864 template <
typename T,
typename... TTypes>
865 ETL_NODISCARD ETL_CONSTEXPR14
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...>>&&;
876 return static_cast<const T&&
>(
static_cast<tuple_type
>(t).get_value());
880 inline constexpr private_tuple::ignore_t ignore;
882 static constexpr private_tuple::ignore_t ignore;
888 template <
typename... TTypes>
889 ETL_CONSTEXPR etl::tuple<TTypes&...> tie(TTypes&... args)
897 template <
typename... TTypes>
898 ETL_NODISCARD ETL_CONSTEXPR14 etl::tuple<etl::unwrap_ref_decay_t<TTypes>...> make_tuple(TTypes&&... args)
900 return etl::tuple<unwrap_ref_decay_t<TTypes>...>(etl::forward<TTypes>(args)...);
908 template <
typename TTuple,
size_t... Indices>
909 ETL_NODISCARD ETL_CONSTEXPR14
auto select_from_tuple(TTuple&& tuple,
910 etl::index_sequence<Indices...>) -> etl::tuple<etl::tuple_element_t<Indices, etl::decay_t<TTuple>>...>
912 ETL_STATIC_ASSERT(
sizeof...(Indices) <= etl::tuple_size<etl::decay_t<TTuple>>::value,
"Number of indices is greater than the tuple size");
914 return etl::make_tuple(etl::forward<etl::tuple_element_t<Indices, etl::decay_t<TTuple>>>(
etl::get<Indices>(etl::forward<TTuple>(tuple)))...);
922 template <
size_t... Indices,
typename TTuple>
923 ETL_NODISCARD ETL_CONSTEXPR14
auto select_from_tuple(TTuple&& tuple) -> etl::tuple<etl::tuple_element_t<Indices, etl::decay_t<TTuple>>...>
925 return select_from_tuple(etl::forward<TTuple>(tuple), etl::index_sequence<Indices...>{});
931 template <
typename... TTypes>
932 ETL_NODISCARD ETL_CONSTEXPR14 etl::tuple<TTypes&&...> forward_as_tuple(TTypes&&... args)
934 return tuple<TTypes&&...>(etl::forward<TTypes>(args)...);
937 namespace private_tuple
942 template <
typename Tuple1,
typename Tuple2,
size_t... Index1,
size_t... Index2>
943 ETL_CONSTEXPR14
auto tuple_cat_impl(Tuple1&& t1, etl::index_sequence<Index1...>, Tuple2&& t2, etl::index_sequence<Index2...>)
944 -> etl::tuple<etl::tuple_element_t<Index1, etl::decay_t<Tuple1>>..., etl::tuple_element_t<Index2, etl::decay_t<Tuple2>>...>
946 return etl::tuple<etl::tuple_element_t<Index1, etl::decay_t<Tuple1>>..., etl::tuple_element_t<Index2, etl::decay_t<Tuple2>>...>(
954 template <
typename Tuple>
955 ETL_NODISCARD ETL_CONSTEXPR14
auto tuple_cat(Tuple&& t) -> Tuple
957 return etl::forward<Tuple>(t);
963 template <
typename Tuple1,
typename Tuple2,
typename... Tuples>
964 ETL_NODISCARD ETL_CONSTEXPR14
auto tuple_cat(Tuple1&& t1, Tuple2&& t2, Tuples&&... ts)
965 ->
decltype(tuple_cat(private_tuple::tuple_cat_impl(etl::forward<Tuple1>(t1),
966 etl::make_index_sequence< etl::tuple_size<etl::decay_t<Tuple1>>::value>{},
967 etl::forward<Tuple2>(t2),
968 etl::make_index_sequence< etl::tuple_size<etl::decay_t<Tuple2>>::value>{}),
969 etl::forward<Tuples>(ts)...))
972 private_tuple::tuple_cat_impl(etl::forward<Tuple1>(t1), etl::make_index_sequence< etl::tuple_size<etl::decay_t<Tuple1>>::value>{},
973 etl::forward<Tuple2>(t2), etl::make_index_sequence< etl::tuple_size<etl::decay_t<Tuple2>>::value>{}),
974 etl::forward<Tuples>(ts)...);
982 namespace private_tuple
985 template <
typename TEtl_Tuple,
size_t... Indices>
986 ETL_NODISCARD ETL_CONSTEXPR14
auto to_std_impl(
const TEtl_Tuple& etl_tuple,
987 etl::index_sequence<Indices...>) -> std::tuple<typename etl::tuple_element_t<Indices, TEtl_Tuple>...>
989 return std::tuple<etl::tuple_element_t<Indices, TEtl_Tuple>...>(
etl::get<Indices>(etl_tuple)...);
993 template <
typename TEtl_Tuple,
size_t... Indices>
994 ETL_NODISCARD ETL_CONSTEXPR14
auto to_std_impl(TEtl_Tuple&& etl_tuple, etl::index_sequence<Indices...>) -> std::tuple<etl::tuple_element_t<Indices, TEtl_Tuple>...>
996 return std::tuple<etl::tuple_element_t<Indices, TEtl_Tuple>...>(etl::move(
etl::get<Indices>(etl_tuple))...);
1003 template <
typename... TTypes>
1004 ETL_NODISCARD ETL_CONSTEXPR14
auto to_std(
const etl::tuple<TTypes...>& etl_tuple) -> std::tuple<etl::decay_t<TTypes>...>
1006 return private_tuple::to_std_impl(etl_tuple, etl::make_index_sequence_for<TTypes...>());
1012 template <
typename... TTypes>
1013 ETL_NODISCARD ETL_CONSTEXPR14
auto to_std(etl::tuple<TTypes...>&& etl_tuple) -> std::tuple<etl::decay_t<TTypes>...>
1015 return private_tuple::to_std_impl(etl::move(etl_tuple), etl::make_index_sequence_for<TTypes...>());
1022 namespace private_tuple
1025 template <
typename TStd_Tuple,
size_t... Indices>
1026 ETL_NODISCARD ETL_CONSTEXPR14
auto to_etl_impl(
const TStd_Tuple& std_tuple,
1027 etl::index_sequence<Indices...>) -> etl::tuple<typename std::tuple_element<Indices, TStd_Tuple>::type...>
1029 return etl::tuple< typename std::tuple_element<Indices, TStd_Tuple>::type...>(std::get<Indices>(std_tuple)...);
1033 template <
typename TStd_Tuple,
size_t... Indices>
1034 ETL_NODISCARD ETL_CONSTEXPR14
auto to_etl_impl(TStd_Tuple&& std_tuple,
1035 etl::index_sequence<Indices...>) -> etl::tuple<typename std::tuple_element<Indices, TStd_Tuple>::type...>
1037 return etl::tuple< typename std::tuple_element<Indices, TStd_Tuple>::type...>(std::move(std::get<Indices>(std_tuple))...);
1044 template <
typename... TTypes>
1045 ETL_NODISCARD ETL_CONSTEXPR14
auto to_etl(
const std::tuple<TTypes...>& std_tuple) -> etl::tuple<etl::decay_t<TTypes>...>
1047 return private_tuple::to_etl_impl(std_tuple, etl::make_index_sequence_for<TTypes...>());
1053 template <
typename... TTypes>
1054 ETL_NODISCARD ETL_CONSTEXPR14
auto to_etl(std::tuple<TTypes...>&& std_tuple) -> etl::tuple<etl::decay_t<TTypes>...>
1056 return private_tuple::to_etl_impl(etl::move(std_tuple), etl::make_index_sequence_for<TTypes...>());
1060 namespace private_tuple
1066 template <
typename TTuple1,
typename TTuple2>
1067 ETL_NODISCARD ETL_CONSTEXPR14
bool tuple_equality(
const TTuple1& ,
const TTuple2& , etl::index_sequence<>)
1073 template <
typename TTuple1,
typename TTuple2,
size_t Index,
size_t... Indices>
1074 ETL_NODISCARD ETL_CONSTEXPR14
bool tuple_equality(
const TTuple1& lhs,
const TTuple2& rhs, etl::index_sequence<Index, Indices...>)
1083 template <
typename TTuple1,
typename TTuple2>
1084 ETL_NODISCARD ETL_CONSTEXPR14
bool tuple_less_than(
const TTuple1& ,
const TTuple2& , etl::index_sequence<>)
1090 template <
typename TTuple1,
typename TTuple2,
size_t Index,
size_t... Indices>
1091 ETL_NODISCARD ETL_CONSTEXPR14
bool tuple_less_than(
const TTuple1& lhs,
const TTuple2& rhs, etl::index_sequence<Index, Indices...>)
1093 if (get<Index>(lhs) < get<Index>(rhs))
1098 if (get<Index>(rhs) < get<Index>(lhs))
1103 return tuple_less_than(lhs, rhs, etl::index_sequence<Indices...>{});
1110 template <
typename... TTypes,
typename... UTypes>
1111 ETL_NODISCARD ETL_CONSTEXPR14
bool operator==(
const etl::tuple<TTypes...>& lhs,
const etl::tuple<UTypes...>& rhs)
1113 ETL_STATIC_ASSERT(
sizeof...(TTypes) ==
sizeof...(UTypes),
"Cannot compare tuples of different sizes");
1116 return private_tuple::tuple_equality(lhs, rhs, etl::make_index_sequence<etl::tuple<TTypes...>::size()>{});
1122 template <
typename... TTypes,
typename... UTypes>
1123 ETL_NODISCARD ETL_CONSTEXPR14
bool operator!=(
const etl::tuple<TTypes...>& lhs,
const etl::tuple<UTypes...>& rhs)
1125 return !(lhs == rhs);
1131 template <
typename... TTypes,
typename... UTypes>
1132 ETL_NODISCARD ETL_CONSTEXPR14
bool operator<(
const etl::tuple<TTypes...>& lhs,
const etl::tuple<UTypes...>& rhs)
1134 ETL_STATIC_ASSERT(
sizeof...(TTypes) ==
sizeof...(UTypes),
"Cannot compare tuples of different sizes");
1137 return private_tuple::tuple_less_than(lhs, rhs, etl::make_index_sequence<etl::tuple<TTypes...>::size()>{});
1143 template <
typename... TTypes,
typename... UTypes>
1144 ETL_NODISCARD ETL_CONSTEXPR14
bool operator<=(
const etl::tuple<TTypes...>& lhs,
const etl::tuple<UTypes...>& rhs)
1146 return !(rhs < lhs);
1152 template <
typename... TTypes,
typename... UTypes>
1153 ETL_NODISCARD ETL_CONSTEXPR14
bool operator>(
const etl::tuple<TTypes...>& lhs,
const etl::tuple<UTypes...>& rhs)
1161 template <
typename... TTypes,
typename... UTypes>
1162 ETL_NODISCARD ETL_CONSTEXPR14
bool operator>=(
const etl::tuple<TTypes...>& lhs,
const etl::tuple<UTypes...>& rhs)
1164 return !(lhs < rhs);
1170 template <
typename... TTypes>
1171 ETL_CONSTEXPR14
void swap(etl::tuple<TTypes...>& lhs, etl::tuple<TTypes...>& rhs)
1178 template <
typename TList>
1179 struct tuple_from_type_list;
1181 template <
typename... TTypes>
1182 struct tuple_from_type_list<etl::type_list<TTypes...>>
1184 using type = etl::tuple<TTypes...>;
1187 template <
typename TTypeList>
1188 using tuple_from_type_list_t =
typename tuple_from_type_list<TTypeList>::type;
1197 #if ETL_NOT_USING_STL && !defined(_LIBCPP_VERSION) \
1198 && !((defined(ETL_DEVELOPMENT_OS_APPLE) || (ETL_COMPILER_FULL_VERSION >= 190000) && (ETL_COMPILER_FULL_VERSION < 210000)) \
1199 && defined(ETL_COMPILER_CLANG))
1200 template <
typename T>
1203 template <
size_t Index,
typename TType>
1204 struct tuple_element;
1210 template <
typename... Types>
1211 struct tuple_size<etl::tuple<Types...>> : etl::integral_constant<size_t, sizeof...(Types)>
1219 template <
size_t Index,
typename... Types>
1220 struct tuple_element<Index, etl::tuple<Types...>>
1222 using type = 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:692
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:856
ETL_CONSTEXPR14 bool operator==(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1078
bool operator>(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1130
integral_constant< bool, false > false_type
integral_constant specialisations
Definition type_traits.h:80
bool operator>=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1144
ETL_CONSTEXPR14 bool operator!=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1090
ETL_CONSTEXPR TContainer::size_type size(const TContainer &container)
Definition iterator.h:1434
T & get(array< T, Size > &a)
Definition array.h:1158
bool operator<(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1103
bool operator<=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1117
Definition tuple_size.h:38