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
46 #include "type_list.h"
59 template <
typename... TTypes>
75 template <
typename... TTypes>
76 struct is_tuple<etl::tuple<TTypes...>> : etl::true_type
80 namespace private_tuple
85 template <
typename T,
typename TTuple>
86 struct tuple_type_base;
90 struct tuple_type_base<T, tuple<>>
96 template <
typename T,
typename THead,
typename... TTail>
97 struct tuple_type_base<T, tuple<THead, TTail...>>
99 using type = etl::conditional_t<etl::is_same<T, THead>::value, tuple<THead, TTail...>,
typename tuple_type_base<T, tuple<TTail...>>::type>;
103 template <
typename T,
typename TTuple>
104 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 type_list = etl::type_list<>;
135 using index_sequence_type = etl::make_index_sequence<0>;
140 ETL_CONSTEXPR14
void copy_assignment(
const this_type& )
147 ETL_CONSTEXPR14
void forward_assignment(this_type&& )
154 ETL_CONSTEXPR14
void swap(this_type& )
162 ETL_NODISCARD ETL_CONSTEXPR
static size_t size()
171 template <
typename THead,
typename... TTail>
172 class tuple<THead, TTail...> :
public tuple<TTail...>
180 template <
typename... UTypes>
181 static constexpr size_t number_of_types()
183 return sizeof...(UTypes);
191 template <
typename... UTypes>
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 etl::tuple_element_t<Index, etl::tuple<TTypes...>>&&
get(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 <
size_t Index,
typename... TTypes>
204 ETL_CONSTEXPR14
friend const etl::tuple_element_t<Index, etl::tuple<TTypes...>>&&
get(
const 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 T&&
get(tuple<TTypes...>&&);
212 template <
typename T,
typename... TTypes>
213 ETL_CONSTEXPR14
friend const T&
get(
const tuple<TTypes...>&);
215 template <
typename T,
typename... TTypes>
216 ETL_CONSTEXPR14
friend const T&&
get(
const tuple<TTypes...>&&);
221 using value_type = THead;
222 using this_type = tuple<THead, TTail...>;
223 using base_type = tuple<TTail...>;
224 using type_list = etl::type_list<THead, TTail...>;
225 using index_sequence_type = etl::make_index_sequence< number_of_types< THead, TTail...>()>;
231 ETL_CONSTEXPR14 tuple()
239 ETL_CONSTEXPR14 tuple(
const tuple<THead, TTail...>& other) =
default;
244 ETL_CONSTEXPR14 tuple(tuple<THead, TTail...>&& other) =
default;
249 ETL_CONSTEXPR14 tuple& operator=(
const tuple<THead, TTail...>& other) =
default;
254 ETL_CONSTEXPR14 tuple& operator=(tuple<THead, TTail...>&& other) =
default;
260 template <
typename UHead,
typename... UTail,
261 etl::enable_if_t<(number_of_types<THead, TTail...>() == number_of_types<UHead, UTail...>())
262 && (number_of_types<THead, TTail...>() >= 1U) && etl::is_convertible<UHead, THead>::value,
264 ETL_CONSTEXPR14 tuple(tuple<UHead, UTail...>& other)
265 : base_type(other.get_base())
266 , value(other.get_value())
274 template <
typename UHead,
typename... UTail,
275 etl::enable_if_t<(number_of_types<THead, TTail...>() == number_of_types<UHead, UTail...>())
276 && (number_of_types<THead, TTail...>() >= 1U) && !etl::is_convertible<UHead, THead>::value,
278 ETL_CONSTEXPR14
explicit tuple(tuple<UHead, UTail...>& other)
279 : base_type(other.get_base())
280 , value(other.get_value())
288 template <
typename UHead,
typename... UTail,
289 etl::enable_if_t<(number_of_types<THead, TTail...>() == number_of_types<UHead, UTail...>())
290 && (number_of_types<THead, TTail...>() >= 1U) && etl::is_convertible<UHead, THead>::value,
292 ETL_CONSTEXPR14 tuple(
const tuple<UHead, UTail...>& other)
293 : base_type(other.get_base())
294 , value(other.get_value())
302 template <
typename UHead,
typename... UTail,
303 etl::enable_if_t<(number_of_types<THead, TTail...>() == number_of_types<UHead, UTail...>())
304 && (number_of_types<THead, TTail...>() >= 1U) && !etl::is_convertible<UHead, THead>::value,
306 ETL_CONSTEXPR14
explicit tuple(
const tuple<UHead, UTail...>& other)
307 : base_type(other.get_base())
308 , value(other.get_value())
316 template <
typename UHead,
typename... UTail,
317 etl::enable_if_t<(number_of_types<THead, TTail...>() == number_of_types<UHead, UTail...>())
318 && (number_of_types<THead, TTail...>() >= 1U) && etl::is_convertible<UHead, THead>::value,
320 ETL_CONSTEXPR14 tuple(tuple<UHead, UTail...>&& other)
321 : base_type(etl::forward<tuple<UTail...>>(other.get_base()))
322 , value(etl::forward<UHead>(other.get_value()))
330 template <
typename UHead,
typename... UTail,
331 etl::enable_if_t<(number_of_types<THead, TTail...>() == number_of_types<UHead, UTail...>())
332 && (number_of_types<THead, TTail...>() >= 1U) && !etl::is_convertible<UHead, THead>::value,
334 ETL_CONSTEXPR14
explicit tuple(tuple<UHead, UTail...>&& other)
335 : base_type(etl::forward<tuple<UTail...>>(other.get_base()))
336 , value(etl::forward<UHead>(other.get_value()))
344 template <
typename UHead,
typename... UTail,
345 etl::enable_if_t<(number_of_types<THead, TTail...>() == number_of_types<UHead, UTail...>())
346 && (number_of_types<THead, TTail...>() >= 1U) && etl::is_convertible<UHead, THead>::value,
348 ETL_CONSTEXPR14 tuple(
const tuple<UHead, UTail...>&& other)
349 : base_type(other.get_base())
350 , value(other.get_value())
358 template <
typename UHead,
typename... UTail,
359 etl::enable_if_t<(number_of_types<THead, TTail...>() == number_of_types<UHead, UTail...>())
360 && (number_of_types<THead, TTail...>() >= 1U) && !etl::is_convertible<UHead, THead>::value,
362 ETL_CONSTEXPR14
explicit tuple(
const tuple<UHead, UTail...>&& other)
363 : base_type(other.get_base())
364 , value(other.get_value())
371 ETL_CONSTEXPR14 tuple(
const THead& head,
const TTail&... tail)
382 typename UHead,
typename... UTail,
383 etl::enable_if_t< !is_tuple<etl::remove_reference_t<UHead>>::value && (number_of_types<THead, TTail...>() == number_of_types<UHead, UTail...>())
384 && (number_of_types<THead, TTail...>() >= 1U) && etl::is_convertible<UHead, THead>::value,
386 ETL_CONSTEXPR14 tuple(UHead&& head, UTail&&... tail) ETL_NOEXCEPT
387 : base_type(etl::forward<UTail>(tail)...)
388 , value(etl::forward<UHead>(head))
397 typename UHead,
typename... UTail,
398 etl::enable_if_t<!is_tuple<etl::remove_reference_t<UHead>>::value && (number_of_types<THead, TTail...>() == number_of_types<UHead, UTail...>())
399 && (number_of_types<THead, TTail...>() >= 1U) && !etl::is_convertible<UHead, THead>::value,
401 ETL_CONSTEXPR14
explicit tuple(UHead&& head, UTail&&... tail) ETL_NOEXCEPT
402 : base_type(etl::forward<UTail>(tail)...)
403 , value(etl::forward<UHead>(head))
411 template <
typename U1,
typename U2,
412 etl::enable_if_t<number_of_types<THead, TTail...>() == 2U && etl::is_convertible<U1, THead>::value
413 && etl::is_convertible< U2, typename base_type::value_type>::value,
415 ETL_CONSTEXPR14 tuple(ETL_OR_STD::pair<U1, U2>& p) ETL_NOEXCEPT
416 : base_type(p.second)
425 template <
typename U1,
typename U2,
426 etl::enable_if_t<number_of_types<THead, TTail...>() == 2U
427 && (!etl::is_convertible<U1, THead>::value || !etl::is_convertible< U2, typename base_type::value_type>::value),
429 ETL_CONSTEXPR14
explicit tuple(ETL_OR_STD::pair<U1, U2>& p) ETL_NOEXCEPT
430 : base_type(p.second)
439 template <
typename U1,
typename U2,
440 etl::enable_if_t<number_of_types<THead, TTail...>() == 2U && etl::is_convertible<U1, THead>::value
441 && etl::is_convertible< U2, typename base_type::value_type>::value,
443 ETL_CONSTEXPR14 tuple(
const ETL_OR_STD::pair<U1, U2>& p) ETL_NOEXCEPT
444 : base_type(p.second)
453 template <
typename U1,
typename U2,
454 etl::enable_if_t<number_of_types<THead, TTail...>() == 2U
455 && (!etl::is_convertible<U1, THead>::value || !etl::is_convertible< U2, typename base_type::value_type>::value),
457 ETL_CONSTEXPR14
explicit tuple(
const ETL_OR_STD::pair<U1, U2>& p) ETL_NOEXCEPT
458 : base_type(p.second)
467 template <
typename U1,
typename U2,
468 etl::enable_if_t<number_of_types<THead, TTail...>() == 2U && etl::is_convertible<U1, THead>::value
469 && etl::is_convertible< U2, typename base_type::value_type>::value,
471 ETL_CONSTEXPR14 tuple(ETL_OR_STD::pair<U1, U2>&& p) ETL_NOEXCEPT
472 : base_type(etl::forward<U2>(p.second))
473 , value(etl::forward<U1>(p.first))
481 template <
typename U1,
typename U2,
482 etl::enable_if_t<number_of_types<THead, TTail...>() == 2U
483 && (!etl::is_convertible<U1, THead>::value || !etl::is_convertible< U2, typename base_type::value_type>::value),
485 ETL_CONSTEXPR14
explicit tuple(ETL_OR_STD::pair<U1, U2>&& p) ETL_NOEXCEPT
486 : base_type(etl::forward<U2>(p.second))
487 , value(etl::forward<U1>(p.first))
495 template <
typename U1,
typename U2,
496 etl::enable_if_t<number_of_types<THead, TTail...>() == 2U && etl::is_convertible<U1, THead>::value
497 && etl::is_convertible< U2, typename base_type::value_type>::value,
499 ETL_CONSTEXPR14 tuple(
const ETL_OR_STD::pair<U1, U2>&& p) ETL_NOEXCEPT
500 : base_type(etl::forward<const U2>(p.second))
501 , value(etl::forward<const U1>(p.first))
509 template <
typename U1,
typename U2,
510 etl::enable_if_t<number_of_types<THead, TTail...>() == 2U
511 && (!etl::is_convertible<U1, THead>::value || !etl::is_convertible< U2, typename base_type::value_type>::value),
513 ETL_CONSTEXPR14
explicit tuple(
const ETL_OR_STD::pair<U1, U2>&& p) ETL_NOEXCEPT
514 : base_type(etl::forward<const U2>(p.second))
515 , value(etl::forward<const U1>(p.first))
522 template <
typename UHead,
typename... UTail,
523 etl::enable_if_t<(number_of_types<THead, TTail...>() == number_of_types<UHead, UTail...>()),
int> = 0>
524 ETL_CONSTEXPR14 tuple&
operator=(
const tuple<UHead, UTail...>& other)
526 copy_assignment(other);
534 template <
typename UHead,
typename... UTail,
535 etl::enable_if_t<(number_of_types<THead, TTail...>() == number_of_types<UHead, UTail...>()),
int> = 0>
536 ETL_CONSTEXPR14 tuple&
operator=(tuple<UHead, UTail...>&& other)
538 forward_assignment(etl::forward<tuple<UHead, UTail...>>(other));
546 template <
typename U1,
typename U2,
size_t NTypes = number_of_types<THead, TTail...>(), etl::enable_if_t<NTypes == 2U, int> = 0>
547 ETL_CONSTEXPR14 tuple&
operator=(ETL_OR_STD::pair<U1, U2>& p)
549 get_value() = p.first;
550 get_base().get_value() = p.second;
558 template <
typename U1,
typename U2,
size_t NTypes = number_of_types<THead, TTail...>(), etl::enable_if_t<NTypes == 2U, int> = 0>
559 ETL_CONSTEXPR14 tuple&
operator=(
const ETL_OR_STD::pair<U1, U2>& p)
561 get_value() = p.first;
562 get_base().get_value() = p.second;
570 template <
typename U1,
typename U2,
size_t NTypes = number_of_types<THead, TTail...>(), etl::enable_if_t<NTypes == 2U, int> = 0>
571 ETL_CONSTEXPR14 tuple&
operator=(ETL_OR_STD::pair<U1, U2>&& p)
573 get_value() = etl::forward<U1>(p.first);
574 get_base().get_value() = etl::forward<U2>(p.second);
582 template <
typename U1,
typename U2,
size_t NTypes = number_of_types<THead, TTail...>(), etl::enable_if_t<NTypes == 2U, int> = 0>
583 ETL_CONSTEXPR14 tuple&
operator=(
const ETL_OR_STD::pair<U1, U2>&& p)
585 get_value() = etl::forward<const U1>(p.first);
586 get_base().get_value() = etl::forward<const U2>(p.second);
594 ETL_CONSTEXPR14
void swap(this_type& other)
596 using ETL_OR_STD::swap;
599 swap(get_value(), other.get_value());
601 auto& this_base = get_base();
602 auto& other_base = other.get_base();
606 this_base.swap(other_base);
613 constexpr static size_t size()
615 return number_of_types<THead, TTail...>();
623 ETL_NODISCARD ETL_CONSTEXPR14 THead& get_value()
631 ETL_CONSTEXPR
const THead& get_value()
const
639 ETL_NODISCARD ETL_CONSTEXPR14 base_type& get_base()
641 return static_cast<base_type&
>(*this);
647 ETL_NODISCARD ETL_CONSTEXPR14
const base_type& get_base()
const
649 return static_cast<const base_type&
>(*this);
655 template <
typename UHead,
typename... UTail>
656 ETL_CONSTEXPR14
void copy_assignment(
const tuple<UHead, UTail...>& other)
659 this->value = other.get_value();
662 auto& this_base = get_base();
663 const auto& other_base = other.get_base();
667 this_base.copy_assignment(other_base);
673 template <
typename UHead,
typename... UTail>
674 ETL_CONSTEXPR14
void forward_assignment(tuple<UHead, UTail...>&& other)
677 this->value = etl::forward<UHead>(other.get_value());
679 auto& this_base = get_base();
680 auto&& other_base = other.get_base();
684 this_base.forward_assignment(etl::forward<tuple<UTail...>>(other_base));
696 template <
typename... TArgs>
697 tuple(TArgs... args) -> tuple<TArgs...>;
702 template <
typename T1,
typename T2>
703 tuple(ETL_OR_STD::pair<T1, T2>) -> tuple<T1, T2>;
709 template <
size_t Index,
typename... TTypes>
710 struct tuple_element<Index, etl::tuple<TTypes...>>
712 using type = etl::nth_type_t<Index, TTypes...>;
718 template <
typename... TTypes>
719 struct tuple_size<etl::tuple<TTypes...>> : etl::integral_constant<size_t, sizeof...(TTypes)>
726 template <
typename... Types>
727 struct common_type<etl::tuple<Types...>>
729 using type = etl::common_type_t<Types...>;
737 template <
size_t Index,
typename... TTypes>
738 ETL_NODISCARD ETL_CONSTEXPR14 etl::tuple_element_t<Index, etl::tuple<TTypes...>>&
get(tuple<TTypes...>& t)
740 ETL_STATIC_ASSERT(Index <
sizeof...(TTypes),
"etl::get<Index> - Index out of range");
743 using tuple_type = etl::nth_base_t<Index, tuple<TTypes...>>&;
746 return static_cast<tuple_type
>(t).get_value();
754 template <
size_t Index,
typename... TTypes>
755 ETL_NODISCARD ETL_CONSTEXPR14
const etl::tuple_element_t<Index, etl::tuple<TTypes...>>&
get(
const tuple<TTypes...>& t)
757 ETL_STATIC_ASSERT(Index <
sizeof...(TTypes),
"etl::get<Index> - Index out of range");
760 using tuple_type =
const etl::nth_base_t<Index, tuple<TTypes...>>&;
763 return static_cast<tuple_type
>(t).get_value();
771 template <
size_t Index,
typename... TTypes>
772 ETL_NODISCARD ETL_CONSTEXPR14 etl::tuple_element_t<Index, etl::tuple<TTypes...>>&&
get(tuple<TTypes...>&& t)
774 ETL_STATIC_ASSERT(Index <
sizeof...(TTypes),
"etl::get<Index> - Index out of range");
777 using tuple_type = etl::nth_base_t<Index, tuple<TTypes...>>&&;
780 return etl::move(
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...>>&&;
797 return etl::move(
static_cast<tuple_type
>(t).get_value());
805 template <
typename T,
typename... TTypes>
806 ETL_NODISCARD ETL_CONSTEXPR14 T&
get(tuple<TTypes...>& t)
808 ETL_STATIC_ASSERT(!(etl::has_duplicates_of<T, TTypes...>::value),
"etl::get<Type> - Tuple contains duplicate instances of T");
809 ETL_STATIC_ASSERT((etl::is_one_of<T, TTypes...>::value),
"etl::get<Type> - Tuple does not contain the specified type");
812 using tuple_type = etl::private_tuple::tuple_type_base_t<T, tuple<TTypes...>>&;
815 return static_cast<tuple_type
>(t).get_value();
823 template <
typename T,
typename... TTypes>
824 ETL_NODISCARD ETL_CONSTEXPR14
const T&
get(
const tuple<TTypes...>& t)
826 ETL_STATIC_ASSERT(!(etl::has_duplicates_of<T, TTypes...>::value),
"etl::get<Type> - Tuple contains duplicate instances of T");
827 ETL_STATIC_ASSERT((etl::is_one_of<T, TTypes...>::value),
"etl::get<Type> - Tuple does not contain the specified type");
830 using tuple_type =
const etl::private_tuple::tuple_type_base_t<T, tuple<TTypes...>>&;
833 return static_cast<tuple_type
>(t).get_value();
841 template <
typename T,
typename... TTypes>
842 ETL_NODISCARD ETL_CONSTEXPR14 T&&
get(tuple<TTypes...>&& t)
844 ETL_STATIC_ASSERT(!(etl::has_duplicates_of<T, TTypes...>::value),
"etl::get<Type> - Tuple contains duplicate instances of T");
845 ETL_STATIC_ASSERT((etl::is_one_of<T, TTypes...>::value),
"etl::get<Type> - Tuple does not contain the specified type");
848 using tuple_type = etl::private_tuple::tuple_type_base_t<T, tuple<TTypes...>>&&;
851 return etl::move(
static_cast<tuple_type
>(t).get_value());
859 template <
typename T,
typename... TTypes>
860 ETL_NODISCARD ETL_CONSTEXPR14
const T&&
get(
const tuple<TTypes...>&& t)
862 ETL_STATIC_ASSERT(!(etl::has_duplicates_of<T, TTypes...>::value),
"etl::get<Type> - Tuple contains duplicate instances of T");
863 ETL_STATIC_ASSERT((etl::is_one_of<T, TTypes...>::value),
"etl::get<Type> - Tuple does not contain the specified type");
866 using tuple_type =
const etl::private_tuple::tuple_type_base_t<T, tuple<TTypes...>>&&;
869 return etl::move(
static_cast<tuple_type
>(t).get_value());
873 inline constexpr private_tuple::ignore_t ignore;
875 static constexpr private_tuple::ignore_t ignore;
881 template <
typename... TTypes>
882 ETL_CONSTEXPR etl::tuple<TTypes&...> tie(TTypes&... args)
890 template <
typename... TTypes>
891 ETL_NODISCARD ETL_CONSTEXPR14 etl::tuple<etl::unwrap_ref_decay_t<TTypes>...> make_tuple(TTypes&&... args)
893 return etl::tuple<unwrap_ref_decay_t<TTypes>...>(etl::forward<TTypes>(args)...);
901 template <
typename TTuple,
size_t... Indices>
902 ETL_NODISCARD ETL_CONSTEXPR14
auto select_from_tuple(TTuple&& tuple,
903 etl::index_sequence<Indices...>) -> etl::tuple<etl::tuple_element_t<Indices, etl::decay_t<TTuple>>...>
905 ETL_STATIC_ASSERT(
sizeof...(Indices) <= etl::tuple_size<etl::decay_t<TTuple>>::value,
"Number of indices is greater than the tuple size");
907 return etl::make_tuple(etl::forward<etl::tuple_element_t<Indices, etl::decay_t<TTuple>>>(
etl::get<Indices>(etl::forward<TTuple>(tuple)))...);
915 template <
size_t... Indices,
typename TTuple>
916 ETL_NODISCARD ETL_CONSTEXPR14
auto select_from_tuple(TTuple&& tuple) -> etl::tuple<etl::tuple_element_t<Indices, etl::decay_t<TTuple>>...>
918 return select_from_tuple(etl::forward<TTuple>(tuple), etl::index_sequence<Indices...>{});
924 template <
typename... TTypes>
925 ETL_NODISCARD ETL_CONSTEXPR14 etl::tuple<TTypes&&...> forward_as_tuple(TTypes&&... args)
927 return tuple<TTypes&&...>(etl::forward<TTypes>(args)...);
930 namespace private_tuple
935 template <
typename Tuple1,
typename Tuple2,
size_t... Index1,
size_t... Index2>
936 ETL_CONSTEXPR14
auto tuple_cat_impl(Tuple1&& t1, etl::index_sequence<Index1...>, Tuple2&& t2, etl::index_sequence<Index2...>)
937 -> etl::tuple<etl::tuple_element_t<Index1, etl::decay_t<Tuple1>>..., etl::tuple_element_t<Index2, etl::decay_t<Tuple2>>...>
939 return etl::tuple<etl::tuple_element_t<Index1, etl::decay_t<Tuple1>>..., etl::tuple_element_t<Index2, etl::decay_t<Tuple2>>...>(
947 template <
typename Tuple>
948 ETL_NODISCARD ETL_CONSTEXPR14
auto tuple_cat(Tuple&& t) -> Tuple
950 return etl::forward<Tuple>(t);
956 template <
typename Tuple1,
typename Tuple2,
typename... Tuples>
957 ETL_NODISCARD ETL_CONSTEXPR14
auto tuple_cat(Tuple1&& t1, Tuple2&& t2, Tuples&&... ts)
958 ->
decltype(tuple_cat(private_tuple::tuple_cat_impl(etl::forward<Tuple1>(t1),
959 etl::make_index_sequence< etl::tuple_size<etl::decay_t<Tuple1>>::value>{},
960 etl::forward<Tuple2>(t2),
961 etl::make_index_sequence< etl::tuple_size<etl::decay_t<Tuple2>>::value>{}),
962 etl::forward<Tuples>(ts)...))
965 private_tuple::tuple_cat_impl(etl::forward<Tuple1>(t1), etl::make_index_sequence< etl::tuple_size<etl::decay_t<Tuple1>>::value>{},
966 etl::forward<Tuple2>(t2), etl::make_index_sequence< etl::tuple_size<etl::decay_t<Tuple2>>::value>{}),
967 etl::forward<Tuples>(ts)...);
975 namespace private_tuple
978 template <
typename TEtl_Tuple,
size_t... Indices>
979 ETL_NODISCARD ETL_CONSTEXPR14
auto to_std_impl(
const TEtl_Tuple& etl_tuple,
980 etl::index_sequence<Indices...>) -> std::tuple<typename etl::tuple_element_t<Indices, TEtl_Tuple>...>
982 return std::tuple<etl::tuple_element_t<Indices, TEtl_Tuple>...>(
etl::get<Indices>(etl_tuple)...);
986 template <
typename TEtl_Tuple,
size_t... Indices>
987 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>...>
989 return std::tuple<etl::tuple_element_t<Indices, TEtl_Tuple>...>(etl::move(
etl::get<Indices>(etl_tuple))...);
996 template <
typename... TTypes>
997 ETL_NODISCARD ETL_CONSTEXPR14
auto to_std(
const etl::tuple<TTypes...>& etl_tuple) -> std::tuple<etl::decay_t<TTypes>...>
999 return private_tuple::to_std_impl(etl_tuple, etl::make_index_sequence_for<TTypes...>());
1005 template <
typename... TTypes>
1006 ETL_NODISCARD ETL_CONSTEXPR14
auto to_std(etl::tuple<TTypes...>&& etl_tuple) -> std::tuple<etl::decay_t<TTypes>...>
1008 return private_tuple::to_std_impl(etl::move(etl_tuple), etl::make_index_sequence_for<TTypes...>());
1015 namespace private_tuple
1018 template <
typename TStd_Tuple,
size_t... Indices>
1019 ETL_NODISCARD ETL_CONSTEXPR14
auto to_etl_impl(
const TStd_Tuple& std_tuple,
1020 etl::index_sequence<Indices...>) -> etl::tuple<typename std::tuple_element<Indices, TStd_Tuple>::type...>
1022 return etl::tuple< typename std::tuple_element<Indices, TStd_Tuple>::type...>(std::get<Indices>(std_tuple)...);
1026 template <
typename TStd_Tuple,
size_t... Indices>
1027 ETL_NODISCARD ETL_CONSTEXPR14
auto to_etl_impl(TStd_Tuple&& std_tuple,
1028 etl::index_sequence<Indices...>) -> etl::tuple<typename std::tuple_element<Indices, TStd_Tuple>::type...>
1030 return etl::tuple< typename std::tuple_element<Indices, TStd_Tuple>::type...>(std::move(std::get<Indices>(std_tuple))...);
1037 template <
typename... TTypes>
1038 ETL_NODISCARD ETL_CONSTEXPR14
auto to_etl(
const std::tuple<TTypes...>& std_tuple) -> etl::tuple<etl::decay_t<TTypes>...>
1040 return private_tuple::to_etl_impl(std_tuple, etl::make_index_sequence_for<TTypes...>());
1046 template <
typename... TTypes>
1047 ETL_NODISCARD ETL_CONSTEXPR14
auto to_etl(std::tuple<TTypes...>&& std_tuple) -> etl::tuple<etl::decay_t<TTypes>...>
1049 return private_tuple::to_etl_impl(etl::move(std_tuple), etl::make_index_sequence_for<TTypes...>());
1053 namespace private_tuple
1059 template <
typename TTuple1,
typename TTuple2>
1060 ETL_NODISCARD ETL_CONSTEXPR14
bool tuple_equality(
const TTuple1& ,
const TTuple2& , etl::index_sequence<>)
1066 template <
typename TTuple1,
typename TTuple2,
size_t Index,
size_t... Indices>
1067 ETL_NODISCARD ETL_CONSTEXPR14
bool tuple_equality(
const TTuple1& lhs,
const TTuple2& rhs, etl::index_sequence<Index, Indices...>)
1076 template <
typename TTuple1,
typename TTuple2>
1077 ETL_NODISCARD ETL_CONSTEXPR14
bool tuple_less_than(
const TTuple1& ,
const TTuple2& , etl::index_sequence<>)
1083 template <
typename TTuple1,
typename TTuple2,
size_t Index,
size_t... Indices>
1084 ETL_NODISCARD ETL_CONSTEXPR14
bool tuple_less_than(
const TTuple1& lhs,
const TTuple2& rhs, etl::index_sequence<Index, Indices...>)
1086 if (get<Index>(lhs) < get<Index>(rhs))
1091 if (get<Index>(rhs) < get<Index>(lhs))
1096 return tuple_less_than(lhs, rhs, etl::index_sequence<Indices...>{});
1103 template <
typename... TTypes,
typename... UTypes>
1104 ETL_NODISCARD ETL_CONSTEXPR14
bool operator==(
const etl::tuple<TTypes...>& lhs,
const etl::tuple<UTypes...>& rhs)
1106 ETL_STATIC_ASSERT(
sizeof...(TTypes) ==
sizeof...(UTypes),
"Cannot compare tuples of different sizes");
1109 return private_tuple::tuple_equality(lhs, rhs, etl::make_index_sequence<etl::tuple<TTypes...>::size()>{});
1115 template <
typename... TTypes,
typename... UTypes>
1116 ETL_NODISCARD ETL_CONSTEXPR14
bool operator!=(
const etl::tuple<TTypes...>& lhs,
const etl::tuple<UTypes...>& rhs)
1118 return !(lhs == rhs);
1124 template <
typename... TTypes,
typename... UTypes>
1125 ETL_NODISCARD ETL_CONSTEXPR14
bool operator<(
const etl::tuple<TTypes...>& lhs,
const etl::tuple<UTypes...>& rhs)
1127 ETL_STATIC_ASSERT(
sizeof...(TTypes) ==
sizeof...(UTypes),
"Cannot compare tuples of different sizes");
1130 return private_tuple::tuple_less_than(lhs, rhs, etl::make_index_sequence<etl::tuple<TTypes...>::size()>{});
1136 template <
typename... TTypes,
typename... UTypes>
1137 ETL_NODISCARD ETL_CONSTEXPR14
bool operator<=(
const etl::tuple<TTypes...>& lhs,
const etl::tuple<UTypes...>& rhs)
1139 return !(rhs < lhs);
1145 template <
typename... TTypes,
typename... UTypes>
1146 ETL_NODISCARD ETL_CONSTEXPR14
bool operator>(
const etl::tuple<TTypes...>& lhs,
const etl::tuple<UTypes...>& rhs)
1154 template <
typename... TTypes,
typename... UTypes>
1155 ETL_NODISCARD ETL_CONSTEXPR14
bool operator>=(
const etl::tuple<TTypes...>& lhs,
const etl::tuple<UTypes...>& rhs)
1157 return !(lhs < rhs);
1163 template <
typename... TTypes>
1164 ETL_CONSTEXPR14
void swap(etl::tuple<TTypes...>& lhs, etl::tuple<TTypes...>& rhs)
1171 template <
typename TList>
1172 struct tuple_from_type_list;
1174 template <
typename... TTypes>
1175 struct tuple_from_type_list<etl::type_list<TTypes...>>
1177 using type = etl::tuple<TTypes...>;
1180 template <
typename TTypeList>
1181 using tuple_from_type_list_t =
typename tuple_from_type_list<TTypeList>::type;
1186 #if ETL_NOT_USING_STL && !((defined(ETL_DEVELOPMENT_OS_APPLE) || (ETL_COMPILER_FULL_VERSION >= 190000)) && defined(ETL_COMPILER_CLANG))
1187 template <
typename T>
1190 template <
size_t Index,
typename TType>
1191 struct tuple_element;
1197 template <
typename... Types>
1198 struct tuple_size<etl::tuple<Types...>> : etl::integral_constant<size_t, sizeof...(Types)>
1206 template <
size_t Index,
typename... Types>
1207 struct tuple_element<Index, etl::tuple<Types...>>
1209 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
bitset_ext
Definition absolute.h:40
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:1081
bool operator>(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1133
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:1147
ETL_CONSTEXPR14 bool operator!=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1093
ETL_CONSTEXPR TContainer::size_type size(const TContainer &container)
Definition iterator.h:1192
T & get(array< T, Size > &a)
Definition array.h:1161
bool operator<(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1106
bool operator<=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1120
Definition tuple_size.h:38