Lines Matching refs:tuple
1 // <tuple> -*- C++ -*-
25 /** @file include/tuple
57 class tuple;
64 struct __is_empty_non_tuple<tuple<_El0, _El...>> : false_type { };
185 * Contains the actual implementation of the @c tuple template, stored
196 * Recursive tuple implementation. Here we store the @c Head element
530 /// Primary class template, tuple
532 class tuple : public _Tuple_impl<0, _Elements...>
585 // Constraint for tuple(_UTypes&&...) where sizeof...(_UTypes) == 1.
590 && !is_same<tuple, __remove_cvref_t<_Up>>::value;
593 // Constraint for tuple(_UTypes&&...) where sizeof...(_UTypes) > 1.
598 /* Constraint for constructors with a tuple<UTypes...> parameter ensures
600 * tuple(UTypes&&...) or tuple(const tuple&) or tuple(tuple&&).
607 template<typename _Tuple, typename = tuple,
613 // then TUPLE should match tuple(UTypes&&...) instead.
615 struct _UseOtherCtor<_Tuple, tuple<_Tp>, tuple<_Up>>
621 struct _UseOtherCtor<_Tuple, tuple<_Tp>, tuple<_Tp>>
636 tuple()
643 tuple()
650 tuple(const _Elements&... __elements)
657 tuple(const _Elements&... __elements)
665 tuple(_UElements&&... __elements)
673 tuple(_UElements&&... __elements)
677 constexpr tuple(const tuple&) = default;
679 constexpr tuple(tuple&&) = default;
683 && !__use_other_ctor<const tuple<_UElements...>&>(),
686 tuple(const tuple<_UElements...>& __in)
693 && !__use_other_ctor<const tuple<_UElements...>&>(),
696 tuple(const tuple<_UElements...>& __in)
703 && !__use_other_ctor<tuple<_UElements...>&&>(),
706 tuple(tuple<_UElements...>&& __in)
712 && !__use_other_ctor<tuple<_UElements...>&&>(),
715 tuple(tuple<_UElements...>&& __in)
724 tuple(allocator_arg_t __tag, const _Alloc& __a)
730 tuple(allocator_arg_t __tag, const _Alloc& __a,
738 tuple(allocator_arg_t __tag, const _Alloc& __a,
746 tuple(allocator_arg_t __tag, const _Alloc& __a,
756 tuple(allocator_arg_t __tag, const _Alloc& __a,
763 tuple(allocator_arg_t __tag, const _Alloc& __a, const tuple& __in)
768 tuple(allocator_arg_t __tag, const _Alloc& __a, tuple&& __in)
773 && !__use_other_ctor<const tuple<_UElements...>&>(),
776 tuple(allocator_arg_t __tag, const _Alloc& __a,
777 const tuple<_UElements...>& __in)
784 && !__use_other_ctor<const tuple<_UElements...>&>(),
788 tuple(allocator_arg_t __tag, const _Alloc& __a,
789 const tuple<_UElements...>& __in)
796 && !__use_other_ctor<tuple<_UElements...>&&>(),
799 tuple(allocator_arg_t __tag, const _Alloc& __a,
800 tuple<_UElements...>&& __in)
807 && !__use_other_ctor<tuple<_UElements...>&&>(),
811 tuple(allocator_arg_t __tag, const _Alloc& __a,
812 tuple<_UElements...>&& __in)
817 // tuple assignment
820 tuple&
822 const tuple&,
831 tuple&
833 tuple&&,
843 __enable_if_t<__assignable<const _UElements&...>(), tuple&>
844 operator=(const tuple<_UElements...>& __in)
853 __enable_if_t<__assignable<_UElements...>(), tuple&>
854 operator=(tuple<_UElements...>&& __in)
861 // tuple swap
864 swap(tuple& __in)
871 tuple(_UTypes...) -> tuple<_UTypes...>;
873 tuple(pair<_T1, _T2>) -> tuple<_T1, _T2>;
875 tuple(allocator_arg_t, _Alloc, _UTypes...) -> tuple<_UTypes...>;
877 tuple(allocator_arg_t, _Alloc, pair<_T1, _T2>) -> tuple<_T1, _T2>;
879 tuple(allocator_arg_t, _Alloc, tuple<_UTypes...>) -> tuple<_UTypes...>;
882 // Explicit specialization, zero-element tuple.
884 class tuple<>
888 void swap(tuple&) noexcept { /* no-op */ }
891 tuple() = default;
895 tuple(allocator_arg_t, const _Alloc&) noexcept { }
898 tuple(allocator_arg_t, const _Alloc&, const tuple&) noexcept { }
901 /// Partial specialization, 2-element tuple.
904 class tuple<_T1, _T2> : public _Tuple_impl<0, _T1, _T2>
972 tuple()
979 tuple()
986 tuple(const _T1& __a1, const _T2& __a2)
993 tuple(const _T1& __a1, const _T2& __a2)
1000 tuple(_U1&& __a1, _U2&& __a2)
1007 tuple(_U1&& __a1, _U2&& __a2)
1011 constexpr tuple(const tuple&) = default;
1013 constexpr tuple(tuple&&) = default;
1018 tuple(const tuple<_U1, _U2>& __in)
1025 tuple(const tuple<_U1, _U2>& __in)
1032 tuple(tuple<_U1, _U2>&& __in)
1039 tuple(tuple<_U1, _U2>&& __in)
1046 tuple(const pair<_U1, _U2>& __in)
1053 tuple(const pair<_U1, _U2>& __in)
1060 tuple(pair<_U1, _U2>&& __in)
1068 tuple(pair<_U1, _U2>&& __in)
1078 tuple(allocator_arg_t __tag, const _Alloc& __a)
1084 tuple(allocator_arg_t __tag, const _Alloc& __a,
1092 tuple(allocator_arg_t __tag, const _Alloc& __a,
1099 tuple(allocator_arg_t __tag, const _Alloc& __a, _U1&& __a1, _U2&& __a2)
1107 tuple(allocator_arg_t __tag, const _Alloc& __a,
1114 tuple(allocator_arg_t __tag, const _Alloc& __a, const tuple& __in)
1119 tuple(allocator_arg_t __tag, const _Alloc& __a, tuple&& __in)
1125 tuple(allocator_arg_t __tag, const _Alloc& __a,
1126 const tuple<_U1, _U2>& __in)
1135 tuple(allocator_arg_t __tag, const _Alloc& __a,
1136 const tuple<_U1, _U2>& __in)
1144 tuple(allocator_arg_t __tag, const _Alloc& __a, tuple<_U1, _U2>&& __in)
1152 tuple(allocator_arg_t __tag, const _Alloc& __a, tuple<_U1, _U2>&& __in)
1159 tuple(allocator_arg_t __tag, const _Alloc& __a,
1167 tuple(allocator_arg_t __tag, const _Alloc& __a,
1174 tuple(allocator_arg_t __tag, const _Alloc& __a, pair<_U1, _U2>&& __in)
1182 tuple(allocator_arg_t __tag, const _Alloc& __a, pair<_U1, _U2>&& __in)
1189 tuple&
1191 const tuple&,
1200 tuple&
1202 tuple&&,
1212 __enable_if_t<__assignable<const _U1&, const _U2&>(), tuple&>
1213 operator=(const tuple<_U1, _U2>& __in)
1222 __enable_if_t<__assignable<_U1, _U2>(), tuple&>
1223 operator=(tuple<_U1, _U2>&& __in)
1232 __enable_if_t<__assignable<const _U1&, const _U2&>(), tuple&>
1243 __enable_if_t<__assignable<_U1, _U2>(), tuple&>
1254 swap(tuple& __in)
1263 struct tuple_size<tuple<_Elements...>>
1273 * the tuple and retrieve the (i-1)th element of the remaining tuple.
1276 struct tuple_element<__i, tuple<_Head, _Tail...> >
1277 : tuple_element<__i - 1, tuple<_Tail...> > { };
1283 struct tuple_element<0, tuple<_Head, _Tail...> >
1292 struct tuple_element<__i, tuple<>>
1294 static_assert(__i < tuple_size<tuple<>>::value,
1295 "tuple index is in range");
1308 /// Return a reference to the ith element of a tuple.
1310 constexpr __tuple_element_t<__i, tuple<_Elements...>>&
1311 get(tuple<_Elements...>& __t) noexcept
1314 /// Return a const reference to the ith element of a const tuple.
1316 constexpr const __tuple_element_t<__i, tuple<_Elements...>>&
1317 get(const tuple<_Elements...>& __t) noexcept
1320 /// Return an rvalue reference to the ith element of a tuple rvalue.
1322 constexpr __tuple_element_t<__i, tuple<_Elements...>>&&
1323 get(tuple<_Elements...>&& __t) noexcept
1325 typedef __tuple_element_t<__i, tuple<_Elements...>> __element_type;
1329 /// Return a const rvalue reference to the ith element of a const tuple rvalue.
1331 constexpr const __tuple_element_t<__i, tuple<_Elements...>>&&
1332 get(const tuple<_Elements...>&& __t) noexcept
1334 typedef __tuple_element_t<__i, tuple<_Elements...>> __element_type;
1352 /// Return a reference to the unique element of type _Tp of a tuple.
1355 get(tuple<_Types...>& __t) noexcept
1358 /// Return a reference to the unique element of type _Tp of a tuple rvalue.
1361 get(tuple<_Types...>&& __t) noexcept
1364 /// Return a const reference to the unique element of type _Tp of a tuple.
1367 get(const tuple<_Types...>& __t) noexcept
1371 /// a const tuple rvalue.
1374 get(const tuple<_Types...>&& __t) noexcept
1410 operator==(const tuple<_TElements...>& __t,
1411 const tuple<_UElements...>& __u)
1414 "tuple objects can only be compared if they have equal sizes.");
1415 using __compare = __tuple_compare<tuple<_TElements...>,
1416 tuple<_UElements...>,
1443 operator<=>(const tuple<_Tps...>& __t, const tuple<_Ups...>& __u)
1452 operator<(const tuple<_TElements...>& __t,
1453 const tuple<_UElements...>& __u)
1456 "tuple objects can only be compared if they have equal sizes.");
1457 using __compare = __tuple_compare<tuple<_TElements...>,
1458 tuple<_UElements...>,
1465 operator!=(const tuple<_TElements...>& __t,
1466 const tuple<_UElements...>& __u)
1471 operator>(const tuple<_TElements...>& __t,
1472 const tuple<_UElements...>& __u)
1477 operator<=(const tuple<_TElements...>& __t,
1478 const tuple<_UElements...>& __u)
1483 operator>=(const tuple<_TElements...>& __t,
1484 const tuple<_UElements...>& __u)
1490 constexpr tuple<typename __decay_and_strip<_Elements>::__type...>
1493 typedef tuple<typename __decay_and_strip<_Elements>::__type...>
1502 constexpr tuple<_Elements&&...>
1504 { return tuple<_Elements&&...>(std::forward<_Elements>(__args)...); }
1510 struct __make_tuple_impl<_Idx, tuple<_Tp...>, _Tuple, _Nm>
1512 tuple<_Tp..., __tuple_element_t<_Idx, _Tuple>>,
1517 struct __make_tuple_impl<_Nm, tuple<_Tp...>, _Tuple, _Nm>
1519 typedef tuple<_Tp...> __type;
1524 : __make_tuple_impl<0, tuple<>, _Tuple, std::tuple_size<_Tuple>::value>
1527 // Returns the std::tuple equivalent of a tuple-like type.
1533 // Combines several std::tuple's into a single one.
1540 typedef tuple<> __type;
1544 struct __combine_tuples<tuple<_Ts...>>
1546 typedef tuple<_Ts...> __type;
1550 struct __combine_tuples<tuple<_T1s...>, tuple<_T2s...>, _Rem...>
1552 typedef typename __combine_tuples<tuple<_T1s..., _T2s...>,
1556 // Computes the result type of tuple_cat given a set of tuple-like types.
1564 // Helper to determine the index set for the first tuple-like
1582 // Performs the actual concatenation by step-wise expanding tuple-like
1584 // result tuple.
1631 constexpr tuple<_Elements&...>
1633 { return tuple<_Elements&...>(__args...); }
1646 swap(tuple<_Elements...>& __x, tuple<_Elements...>& __y)
1654 swap(tuple<_Elements...>&, tuple<_Elements...>&) = delete;
1658 // of a tuple is not required.
1675 struct uses_allocator<tuple<_Types...>, _Alloc> : true_type { };
1678 /** "piecewise construction" using a tuple of arguments for each member.
1683 * The elements of each tuple will be used as the constructor arguments
1692 tuple<_Args1...> __first, tuple<_Args2...> __second)
1703 pair(tuple<_Args1...>& __tuple1, tuple<_Args2...>& __tuple2,
1711 // Unpack a std::tuple into a type trait and use its value.
1712 // For cv std::tuple<_Up> the result is _Trait<_Tp, cv _Up...>::value.
1713 // For cv std::tuple<_Up>& the result is _Trait<_Tp, cv _Up&...>::value.
1719 inline constexpr bool __unpack_std_tuple<_Trait, _Tp, tuple<_Up...>>
1723 inline constexpr bool __unpack_std_tuple<_Trait, _Tp, tuple<_Up...>&>
1727 inline constexpr bool __unpack_std_tuple<_Trait, _Tp, const tuple<_Up...>>
1731 inline constexpr bool __unpack_std_tuple<_Trait, _Tp, const tuple<_Up...>&>