1*46035553Spatrick// -*- C++ -*- 2*46035553Spatrick//===--------------------------- tuple ------------------------------------===// 3*46035553Spatrick// 4*46035553Spatrick// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5*46035553Spatrick// See https://llvm.org/LICENSE.txt for license information. 6*46035553Spatrick// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7*46035553Spatrick// 8*46035553Spatrick//===----------------------------------------------------------------------===// 9*46035553Spatrick 10*46035553Spatrick#ifndef _LIBCPP_TUPLE 11*46035553Spatrick#define _LIBCPP_TUPLE 12*46035553Spatrick 13*46035553Spatrick/* 14*46035553Spatrick tuple synopsis 15*46035553Spatrick 16*46035553Spatricknamespace std 17*46035553Spatrick{ 18*46035553Spatrick 19*46035553Spatricktemplate <class... T> 20*46035553Spatrickclass tuple { 21*46035553Spatrickpublic: 22*46035553Spatrick explicit(see-below) constexpr tuple(); 23*46035553Spatrick explicit(see-below) tuple(const T&...); // constexpr in C++14 24*46035553Spatrick template <class... U> 25*46035553Spatrick explicit(see-below) tuple(U&&...); // constexpr in C++14 26*46035553Spatrick tuple(const tuple&) = default; 27*46035553Spatrick tuple(tuple&&) = default; 28*46035553Spatrick template <class... U> 29*46035553Spatrick explicit(see-below) tuple(const tuple<U...>&); // constexpr in C++14 30*46035553Spatrick template <class... U> 31*46035553Spatrick explicit(see-below) tuple(tuple<U...>&&); // constexpr in C++14 32*46035553Spatrick template <class U1, class U2> 33*46035553Spatrick explicit(see-below) tuple(const pair<U1, U2>&); // iff sizeof...(T) == 2 // constexpr in C++14 34*46035553Spatrick template <class U1, class U2> 35*46035553Spatrick explicit(see-below) tuple(pair<U1, U2>&&); // iff sizeof...(T) == 2 // constexpr in C++14 36*46035553Spatrick 37*46035553Spatrick // allocator-extended constructors 38*46035553Spatrick template <class Alloc> 39*46035553Spatrick tuple(allocator_arg_t, const Alloc& a); 40*46035553Spatrick template <class Alloc> 41*46035553Spatrick explicit(see-below) tuple(allocator_arg_t, const Alloc& a, const T&...); 42*46035553Spatrick template <class Alloc, class... U> 43*46035553Spatrick explicit(see-below) tuple(allocator_arg_t, const Alloc& a, U&&...); 44*46035553Spatrick template <class Alloc> 45*46035553Spatrick tuple(allocator_arg_t, const Alloc& a, const tuple&); 46*46035553Spatrick template <class Alloc> 47*46035553Spatrick tuple(allocator_arg_t, const Alloc& a, tuple&&); 48*46035553Spatrick template <class Alloc, class... U> 49*46035553Spatrick explicit(see-below) tuple(allocator_arg_t, const Alloc& a, const tuple<U...>&); 50*46035553Spatrick template <class Alloc, class... U> 51*46035553Spatrick explicit(see-below) tuple(allocator_arg_t, const Alloc& a, tuple<U...>&&); 52*46035553Spatrick template <class Alloc, class U1, class U2> 53*46035553Spatrick explicit(see-below) tuple(allocator_arg_t, const Alloc& a, const pair<U1, U2>&); 54*46035553Spatrick template <class Alloc, class U1, class U2> 55*46035553Spatrick explicit(see-below) tuple(allocator_arg_t, const Alloc& a, pair<U1, U2>&&); 56*46035553Spatrick 57*46035553Spatrick tuple& operator=(const tuple&); 58*46035553Spatrick tuple& 59*46035553Spatrick operator=(tuple&&) noexcept(AND(is_nothrow_move_assignable<T>::value ...)); 60*46035553Spatrick template <class... U> 61*46035553Spatrick tuple& operator=(const tuple<U...>&); 62*46035553Spatrick template <class... U> 63*46035553Spatrick tuple& operator=(tuple<U...>&&); 64*46035553Spatrick template <class U1, class U2> 65*46035553Spatrick tuple& operator=(const pair<U1, U2>&); // iff sizeof...(T) == 2 66*46035553Spatrick template <class U1, class U2> 67*46035553Spatrick tuple& operator=(pair<U1, U2>&&); // iff sizeof...(T) == 2 68*46035553Spatrick 69*46035553Spatrick void swap(tuple&) noexcept(AND(swap(declval<T&>(), declval<T&>())...)); 70*46035553Spatrick}; 71*46035553Spatrick 72*46035553Spatricktemplate <class ...T> 73*46035553Spatricktuple(T...) -> tuple<T...>; // since C++17 74*46035553Spatricktemplate <class T1, class T2> 75*46035553Spatricktuple(pair<T1, T2>) -> tuple<T1, T2>; // since C++17 76*46035553Spatricktemplate <class Alloc, class ...T> 77*46035553Spatricktuple(allocator_arg_t, Alloc, T...) -> tuple<T...>; // since C++17 78*46035553Spatricktemplate <class Alloc, class T1, class T2> 79*46035553Spatricktuple(allocator_arg_t, Alloc, pair<T1, T2>) -> tuple<T1, T2>; // since C++17 80*46035553Spatricktemplate <class Alloc, class ...T> 81*46035553Spatricktuple(allocator_arg_t, Alloc, tuple<T...>) -> tuple<T...>; // since C++17 82*46035553Spatrick 83*46035553Spatrickinline constexpr unspecified ignore; 84*46035553Spatrick 85*46035553Spatricktemplate <class... T> tuple<V...> make_tuple(T&&...); // constexpr in C++14 86*46035553Spatricktemplate <class... T> tuple<ATypes...> forward_as_tuple(T&&...) noexcept; // constexpr in C++14 87*46035553Spatricktemplate <class... T> tuple<T&...> tie(T&...) noexcept; // constexpr in C++14 88*46035553Spatricktemplate <class... Tuples> tuple<CTypes...> tuple_cat(Tuples&&... tpls); // constexpr in C++14 89*46035553Spatrick 90*46035553Spatrick// [tuple.apply], calling a function with a tuple of arguments: 91*46035553Spatricktemplate <class F, class Tuple> 92*46035553Spatrick constexpr decltype(auto) apply(F&& f, Tuple&& t); // C++17 93*46035553Spatricktemplate <class T, class Tuple> 94*46035553Spatrick constexpr T make_from_tuple(Tuple&& t); // C++17 95*46035553Spatrick 96*46035553Spatrick// 20.4.1.4, tuple helper classes: 97*46035553Spatricktemplate <class T> struct tuple_size; // undefined 98*46035553Spatricktemplate <class... T> struct tuple_size<tuple<T...>>; 99*46035553Spatricktemplate <class T> 100*46035553Spatrick inline constexpr size_t tuple_size_v = tuple_size<T>::value; // C++17 101*46035553Spatricktemplate <size_t I, class T> struct tuple_element; // undefined 102*46035553Spatricktemplate <size_t I, class... T> struct tuple_element<I, tuple<T...>>; 103*46035553Spatricktemplate <size_t I, class T> 104*46035553Spatrick using tuple_element_t = typename tuple_element <I, T>::type; // C++14 105*46035553Spatrick 106*46035553Spatrick// 20.4.1.5, element access: 107*46035553Spatricktemplate <size_t I, class... T> 108*46035553Spatrick typename tuple_element<I, tuple<T...>>::type& 109*46035553Spatrick get(tuple<T...>&) noexcept; // constexpr in C++14 110*46035553Spatricktemplate <size_t I, class... T> 111*46035553Spatrick const typename tuple_element<I, tuple<T...>>::type& 112*46035553Spatrick get(const tuple<T...>&) noexcept; // constexpr in C++14 113*46035553Spatricktemplate <size_t I, class... T> 114*46035553Spatrick typename tuple_element<I, tuple<T...>>::type&& 115*46035553Spatrick get(tuple<T...>&&) noexcept; // constexpr in C++14 116*46035553Spatricktemplate <size_t I, class... T> 117*46035553Spatrick const typename tuple_element<I, tuple<T...>>::type&& 118*46035553Spatrick get(const tuple<T...>&&) noexcept; // constexpr in C++14 119*46035553Spatrick 120*46035553Spatricktemplate <class T1, class... T> 121*46035553Spatrick constexpr T1& get(tuple<T...>&) noexcept; // C++14 122*46035553Spatricktemplate <class T1, class... T> 123*46035553Spatrick constexpr const T1& get(const tuple<T...>&) noexcept; // C++14 124*46035553Spatricktemplate <class T1, class... T> 125*46035553Spatrick constexpr T1&& get(tuple<T...>&&) noexcept; // C++14 126*46035553Spatricktemplate <class T1, class... T> 127*46035553Spatrick constexpr const T1&& get(const tuple<T...>&&) noexcept; // C++14 128*46035553Spatrick 129*46035553Spatrick// 20.4.1.6, relational operators: 130*46035553Spatricktemplate<class... T, class... U> bool operator==(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14 131*46035553Spatricktemplate<class... T, class... U> bool operator<(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14 132*46035553Spatricktemplate<class... T, class... U> bool operator!=(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14 133*46035553Spatricktemplate<class... T, class... U> bool operator>(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14 134*46035553Spatricktemplate<class... T, class... U> bool operator<=(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14 135*46035553Spatricktemplate<class... T, class... U> bool operator>=(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14 136*46035553Spatrick 137*46035553Spatricktemplate <class... Types, class Alloc> 138*46035553Spatrick struct uses_allocator<tuple<Types...>, Alloc>; 139*46035553Spatrick 140*46035553Spatricktemplate <class... Types> 141*46035553Spatrick void 142*46035553Spatrick swap(tuple<Types...>& x, tuple<Types...>& y) noexcept(noexcept(x.swap(y))); 143*46035553Spatrick 144*46035553Spatrick} // std 145*46035553Spatrick 146*46035553Spatrick*/ 147*46035553Spatrick 148*46035553Spatrick#include <__config> 149*46035553Spatrick#include <__tuple> 150*46035553Spatrick#include <cstddef> 151*46035553Spatrick#include <type_traits> 152*46035553Spatrick#include <__functional_base> 153*46035553Spatrick#include <utility> 154*46035553Spatrick#include <version> 155*46035553Spatrick 156*46035553Spatrick#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 157*46035553Spatrick#pragma GCC system_header 158*46035553Spatrick#endif 159*46035553Spatrick 160*46035553Spatrick_LIBCPP_BEGIN_NAMESPACE_STD 161*46035553Spatrick 162*46035553Spatrick#ifndef _LIBCPP_CXX03_LANG 163*46035553Spatrick 164*46035553Spatrick 165*46035553Spatrick// __tuple_leaf 166*46035553Spatrick 167*46035553Spatricktemplate <size_t _Ip, class _Hp, 168*46035553Spatrick bool=is_empty<_Hp>::value && !__libcpp_is_final<_Hp>::value 169*46035553Spatrick > 170*46035553Spatrickclass __tuple_leaf; 171*46035553Spatrick 172*46035553Spatricktemplate <size_t _Ip, class _Hp, bool _Ep> 173*46035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 174*46035553Spatrickvoid swap(__tuple_leaf<_Ip, _Hp, _Ep>& __x, __tuple_leaf<_Ip, _Hp, _Ep>& __y) 175*46035553Spatrick _NOEXCEPT_(__is_nothrow_swappable<_Hp>::value) 176*46035553Spatrick{ 177*46035553Spatrick swap(__x.get(), __y.get()); 178*46035553Spatrick} 179*46035553Spatrick 180*46035553Spatricktemplate <size_t _Ip, class _Hp, bool> 181*46035553Spatrickclass __tuple_leaf 182*46035553Spatrick{ 183*46035553Spatrick _Hp __value_; 184*46035553Spatrick 185*46035553Spatrick template <class _Tp> 186*46035553Spatrick static constexpr bool __can_bind_reference() { 187*46035553Spatrick#if __has_keyword(__reference_binds_to_temporary) 188*46035553Spatrick return !__reference_binds_to_temporary(_Hp, _Tp); 189*46035553Spatrick#else 190*46035553Spatrick return true; 191*46035553Spatrick#endif 192*46035553Spatrick } 193*46035553Spatrick 194*46035553Spatrick __tuple_leaf& operator=(const __tuple_leaf&); 195*46035553Spatrickpublic: 196*46035553Spatrick _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR __tuple_leaf() 197*46035553Spatrick _NOEXCEPT_(is_nothrow_default_constructible<_Hp>::value) : __value_() 198*46035553Spatrick {static_assert(!is_reference<_Hp>::value, 199*46035553Spatrick "Attempted to default construct a reference element in a tuple");} 200*46035553Spatrick 201*46035553Spatrick template <class _Alloc> 202*46035553Spatrick _LIBCPP_INLINE_VISIBILITY 203*46035553Spatrick __tuple_leaf(integral_constant<int, 0>, const _Alloc&) 204*46035553Spatrick : __value_() 205*46035553Spatrick {static_assert(!is_reference<_Hp>::value, 206*46035553Spatrick "Attempted to default construct a reference element in a tuple");} 207*46035553Spatrick 208*46035553Spatrick template <class _Alloc> 209*46035553Spatrick _LIBCPP_INLINE_VISIBILITY 210*46035553Spatrick __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a) 211*46035553Spatrick : __value_(allocator_arg_t(), __a) 212*46035553Spatrick {static_assert(!is_reference<_Hp>::value, 213*46035553Spatrick "Attempted to default construct a reference element in a tuple");} 214*46035553Spatrick 215*46035553Spatrick template <class _Alloc> 216*46035553Spatrick _LIBCPP_INLINE_VISIBILITY 217*46035553Spatrick __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a) 218*46035553Spatrick : __value_(__a) 219*46035553Spatrick {static_assert(!is_reference<_Hp>::value, 220*46035553Spatrick "Attempted to default construct a reference element in a tuple");} 221*46035553Spatrick 222*46035553Spatrick template <class _Tp, 223*46035553Spatrick class = _EnableIf< 224*46035553Spatrick _And< 225*46035553Spatrick _IsNotSame<__uncvref_t<_Tp>, __tuple_leaf>, 226*46035553Spatrick is_constructible<_Hp, _Tp> 227*46035553Spatrick >::value 228*46035553Spatrick > 229*46035553Spatrick > 230*46035553Spatrick _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 231*46035553Spatrick explicit __tuple_leaf(_Tp&& __t) _NOEXCEPT_((is_nothrow_constructible<_Hp, _Tp>::value)) 232*46035553Spatrick : __value_(_VSTD::forward<_Tp>(__t)) 233*46035553Spatrick {static_assert(__can_bind_reference<_Tp&&>(), 234*46035553Spatrick "Attempted construction of reference element binds to a temporary whose lifetime has ended");} 235*46035553Spatrick 236*46035553Spatrick template <class _Tp, class _Alloc> 237*46035553Spatrick _LIBCPP_INLINE_VISIBILITY 238*46035553Spatrick explicit __tuple_leaf(integral_constant<int, 0>, const _Alloc&, _Tp&& __t) 239*46035553Spatrick : __value_(_VSTD::forward<_Tp>(__t)) 240*46035553Spatrick {static_assert(__can_bind_reference<_Tp&&>(), 241*46035553Spatrick "Attempted construction of reference element binds to a temporary whose lifetime has ended");} 242*46035553Spatrick 243*46035553Spatrick template <class _Tp, class _Alloc> 244*46035553Spatrick _LIBCPP_INLINE_VISIBILITY 245*46035553Spatrick explicit __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a, _Tp&& __t) 246*46035553Spatrick : __value_(allocator_arg_t(), __a, _VSTD::forward<_Tp>(__t)) 247*46035553Spatrick {static_assert(!is_reference<_Hp>::value, 248*46035553Spatrick "Attempted to uses-allocator construct a reference element in a tuple");} 249*46035553Spatrick 250*46035553Spatrick template <class _Tp, class _Alloc> 251*46035553Spatrick _LIBCPP_INLINE_VISIBILITY 252*46035553Spatrick explicit __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a, _Tp&& __t) 253*46035553Spatrick : __value_(_VSTD::forward<_Tp>(__t), __a) 254*46035553Spatrick {static_assert(!is_reference<_Hp>::value, 255*46035553Spatrick "Attempted to uses-allocator construct a reference element in a tuple");} 256*46035553Spatrick 257*46035553Spatrick __tuple_leaf(const __tuple_leaf& __t) = default; 258*46035553Spatrick __tuple_leaf(__tuple_leaf&& __t) = default; 259*46035553Spatrick 260*46035553Spatrick template <class _Tp> 261*46035553Spatrick _LIBCPP_INLINE_VISIBILITY 262*46035553Spatrick __tuple_leaf& 263*46035553Spatrick operator=(_Tp&& __t) _NOEXCEPT_((is_nothrow_assignable<_Hp&, _Tp>::value)) 264*46035553Spatrick { 265*46035553Spatrick __value_ = _VSTD::forward<_Tp>(__t); 266*46035553Spatrick return *this; 267*46035553Spatrick } 268*46035553Spatrick 269*46035553Spatrick _LIBCPP_INLINE_VISIBILITY 270*46035553Spatrick int swap(__tuple_leaf& __t) _NOEXCEPT_(__is_nothrow_swappable<__tuple_leaf>::value) 271*46035553Spatrick { 272*46035553Spatrick _VSTD::swap(*this, __t); 273*46035553Spatrick return 0; 274*46035553Spatrick } 275*46035553Spatrick 276*46035553Spatrick _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 _Hp& get() _NOEXCEPT {return __value_;} 277*46035553Spatrick _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const _Hp& get() const _NOEXCEPT {return __value_;} 278*46035553Spatrick}; 279*46035553Spatrick 280*46035553Spatricktemplate <size_t _Ip, class _Hp> 281*46035553Spatrickclass __tuple_leaf<_Ip, _Hp, true> 282*46035553Spatrick : private _Hp 283*46035553Spatrick{ 284*46035553Spatrick 285*46035553Spatrick __tuple_leaf& operator=(const __tuple_leaf&); 286*46035553Spatrickpublic: 287*46035553Spatrick _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR __tuple_leaf() 288*46035553Spatrick _NOEXCEPT_(is_nothrow_default_constructible<_Hp>::value) {} 289*46035553Spatrick 290*46035553Spatrick template <class _Alloc> 291*46035553Spatrick _LIBCPP_INLINE_VISIBILITY 292*46035553Spatrick __tuple_leaf(integral_constant<int, 0>, const _Alloc&) {} 293*46035553Spatrick 294*46035553Spatrick template <class _Alloc> 295*46035553Spatrick _LIBCPP_INLINE_VISIBILITY 296*46035553Spatrick __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a) 297*46035553Spatrick : _Hp(allocator_arg_t(), __a) {} 298*46035553Spatrick 299*46035553Spatrick template <class _Alloc> 300*46035553Spatrick _LIBCPP_INLINE_VISIBILITY 301*46035553Spatrick __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a) 302*46035553Spatrick : _Hp(__a) {} 303*46035553Spatrick 304*46035553Spatrick template <class _Tp, 305*46035553Spatrick class = _EnableIf< 306*46035553Spatrick _And< 307*46035553Spatrick _IsNotSame<__uncvref_t<_Tp>, __tuple_leaf>, 308*46035553Spatrick is_constructible<_Hp, _Tp> 309*46035553Spatrick >::value 310*46035553Spatrick > 311*46035553Spatrick > 312*46035553Spatrick _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 313*46035553Spatrick explicit __tuple_leaf(_Tp&& __t) _NOEXCEPT_((is_nothrow_constructible<_Hp, _Tp>::value)) 314*46035553Spatrick : _Hp(_VSTD::forward<_Tp>(__t)) {} 315*46035553Spatrick 316*46035553Spatrick template <class _Tp, class _Alloc> 317*46035553Spatrick _LIBCPP_INLINE_VISIBILITY 318*46035553Spatrick explicit __tuple_leaf(integral_constant<int, 0>, const _Alloc&, _Tp&& __t) 319*46035553Spatrick : _Hp(_VSTD::forward<_Tp>(__t)) {} 320*46035553Spatrick 321*46035553Spatrick template <class _Tp, class _Alloc> 322*46035553Spatrick _LIBCPP_INLINE_VISIBILITY 323*46035553Spatrick explicit __tuple_leaf(integral_constant<int, 1>, const _Alloc& __a, _Tp&& __t) 324*46035553Spatrick : _Hp(allocator_arg_t(), __a, _VSTD::forward<_Tp>(__t)) {} 325*46035553Spatrick 326*46035553Spatrick template <class _Tp, class _Alloc> 327*46035553Spatrick _LIBCPP_INLINE_VISIBILITY 328*46035553Spatrick explicit __tuple_leaf(integral_constant<int, 2>, const _Alloc& __a, _Tp&& __t) 329*46035553Spatrick : _Hp(_VSTD::forward<_Tp>(__t), __a) {} 330*46035553Spatrick 331*46035553Spatrick __tuple_leaf(__tuple_leaf const &) = default; 332*46035553Spatrick __tuple_leaf(__tuple_leaf &&) = default; 333*46035553Spatrick 334*46035553Spatrick template <class _Tp> 335*46035553Spatrick _LIBCPP_INLINE_VISIBILITY 336*46035553Spatrick __tuple_leaf& 337*46035553Spatrick operator=(_Tp&& __t) _NOEXCEPT_((is_nothrow_assignable<_Hp&, _Tp>::value)) 338*46035553Spatrick { 339*46035553Spatrick _Hp::operator=(_VSTD::forward<_Tp>(__t)); 340*46035553Spatrick return *this; 341*46035553Spatrick } 342*46035553Spatrick 343*46035553Spatrick _LIBCPP_INLINE_VISIBILITY 344*46035553Spatrick int 345*46035553Spatrick swap(__tuple_leaf& __t) _NOEXCEPT_(__is_nothrow_swappable<__tuple_leaf>::value) 346*46035553Spatrick { 347*46035553Spatrick _VSTD::swap(*this, __t); 348*46035553Spatrick return 0; 349*46035553Spatrick } 350*46035553Spatrick 351*46035553Spatrick _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 _Hp& get() _NOEXCEPT {return static_cast<_Hp&>(*this);} 352*46035553Spatrick _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 const _Hp& get() const _NOEXCEPT {return static_cast<const _Hp&>(*this);} 353*46035553Spatrick}; 354*46035553Spatrick 355*46035553Spatricktemplate <class ..._Tp> 356*46035553Spatrick_LIBCPP_INLINE_VISIBILITY 357*46035553Spatrickvoid __swallow(_Tp&&...) _NOEXCEPT {} 358*46035553Spatrick 359*46035553Spatricktemplate <class _Tp> 360*46035553Spatrickstruct __all_default_constructible; 361*46035553Spatrick 362*46035553Spatricktemplate <class ..._Tp> 363*46035553Spatrickstruct __all_default_constructible<__tuple_types<_Tp...>> 364*46035553Spatrick : __all<is_default_constructible<_Tp>::value...> 365*46035553Spatrick{ }; 366*46035553Spatrick 367*46035553Spatrick// __tuple_impl 368*46035553Spatrick 369*46035553Spatricktemplate<class _Indx, class ..._Tp> struct __tuple_impl; 370*46035553Spatrick 371*46035553Spatricktemplate<size_t ..._Indx, class ..._Tp> 372*46035553Spatrickstruct _LIBCPP_DECLSPEC_EMPTY_BASES __tuple_impl<__tuple_indices<_Indx...>, _Tp...> 373*46035553Spatrick : public __tuple_leaf<_Indx, _Tp>... 374*46035553Spatrick{ 375*46035553Spatrick _LIBCPP_INLINE_VISIBILITY 376*46035553Spatrick _LIBCPP_CONSTEXPR __tuple_impl() 377*46035553Spatrick _NOEXCEPT_(__all<is_nothrow_default_constructible<_Tp>::value...>::value) {} 378*46035553Spatrick 379*46035553Spatrick template <size_t ..._Uf, class ..._Tf, 380*46035553Spatrick size_t ..._Ul, class ..._Tl, class ..._Up> 381*46035553Spatrick _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 382*46035553Spatrick explicit 383*46035553Spatrick __tuple_impl(__tuple_indices<_Uf...>, __tuple_types<_Tf...>, 384*46035553Spatrick __tuple_indices<_Ul...>, __tuple_types<_Tl...>, 385*46035553Spatrick _Up&&... __u) 386*46035553Spatrick _NOEXCEPT_((__all<is_nothrow_constructible<_Tf, _Up>::value...>::value && 387*46035553Spatrick __all<is_nothrow_default_constructible<_Tl>::value...>::value)) : 388*46035553Spatrick __tuple_leaf<_Uf, _Tf>(_VSTD::forward<_Up>(__u))..., 389*46035553Spatrick __tuple_leaf<_Ul, _Tl>()... 390*46035553Spatrick {} 391*46035553Spatrick 392*46035553Spatrick template <class _Alloc, size_t ..._Uf, class ..._Tf, 393*46035553Spatrick size_t ..._Ul, class ..._Tl, class ..._Up> 394*46035553Spatrick _LIBCPP_INLINE_VISIBILITY 395*46035553Spatrick explicit 396*46035553Spatrick __tuple_impl(allocator_arg_t, const _Alloc& __a, 397*46035553Spatrick __tuple_indices<_Uf...>, __tuple_types<_Tf...>, 398*46035553Spatrick __tuple_indices<_Ul...>, __tuple_types<_Tl...>, 399*46035553Spatrick _Up&&... __u) : 400*46035553Spatrick __tuple_leaf<_Uf, _Tf>(__uses_alloc_ctor<_Tf, _Alloc, _Up>(), __a, 401*46035553Spatrick _VSTD::forward<_Up>(__u))..., 402*46035553Spatrick __tuple_leaf<_Ul, _Tl>(__uses_alloc_ctor<_Tl, _Alloc>(), __a)... 403*46035553Spatrick {} 404*46035553Spatrick 405*46035553Spatrick template <class _Tuple, 406*46035553Spatrick class = typename enable_if 407*46035553Spatrick < 408*46035553Spatrick __tuple_constructible<_Tuple, tuple<_Tp...> >::value 409*46035553Spatrick >::type 410*46035553Spatrick > 411*46035553Spatrick _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 412*46035553Spatrick __tuple_impl(_Tuple&& __t) _NOEXCEPT_((__all<is_nothrow_constructible<_Tp, typename tuple_element<_Indx, 413*46035553Spatrick typename __make_tuple_types<_Tuple>::type>::type>::value...>::value)) 414*46035553Spatrick : __tuple_leaf<_Indx, _Tp>(_VSTD::forward<typename tuple_element<_Indx, 415*46035553Spatrick typename __make_tuple_types<_Tuple>::type>::type>(_VSTD::get<_Indx>(__t)))... 416*46035553Spatrick {} 417*46035553Spatrick 418*46035553Spatrick template <class _Alloc, class _Tuple, 419*46035553Spatrick class = typename enable_if 420*46035553Spatrick < 421*46035553Spatrick __tuple_constructible<_Tuple, tuple<_Tp...> >::value 422*46035553Spatrick >::type 423*46035553Spatrick > 424*46035553Spatrick _LIBCPP_INLINE_VISIBILITY 425*46035553Spatrick __tuple_impl(allocator_arg_t, const _Alloc& __a, _Tuple&& __t) 426*46035553Spatrick : __tuple_leaf<_Indx, _Tp>(__uses_alloc_ctor<_Tp, _Alloc, typename tuple_element<_Indx, 427*46035553Spatrick typename __make_tuple_types<_Tuple>::type>::type>(), __a, 428*46035553Spatrick _VSTD::forward<typename tuple_element<_Indx, 429*46035553Spatrick typename __make_tuple_types<_Tuple>::type>::type>(_VSTD::get<_Indx>(__t)))... 430*46035553Spatrick {} 431*46035553Spatrick 432*46035553Spatrick template <class _Tuple> 433*46035553Spatrick _LIBCPP_INLINE_VISIBILITY 434*46035553Spatrick typename enable_if 435*46035553Spatrick < 436*46035553Spatrick __tuple_assignable<_Tuple, tuple<_Tp...> >::value, 437*46035553Spatrick __tuple_impl& 438*46035553Spatrick >::type 439*46035553Spatrick operator=(_Tuple&& __t) _NOEXCEPT_((__all<is_nothrow_assignable<_Tp&, typename tuple_element<_Indx, 440*46035553Spatrick typename __make_tuple_types<_Tuple>::type>::type>::value...>::value)) 441*46035553Spatrick { 442*46035553Spatrick __swallow(__tuple_leaf<_Indx, _Tp>::operator=(_VSTD::forward<typename tuple_element<_Indx, 443*46035553Spatrick typename __make_tuple_types<_Tuple>::type>::type>(_VSTD::get<_Indx>(__t)))...); 444*46035553Spatrick return *this; 445*46035553Spatrick } 446*46035553Spatrick 447*46035553Spatrick __tuple_impl(const __tuple_impl&) = default; 448*46035553Spatrick __tuple_impl(__tuple_impl&&) = default; 449*46035553Spatrick 450*46035553Spatrick _LIBCPP_INLINE_VISIBILITY 451*46035553Spatrick __tuple_impl& 452*46035553Spatrick operator=(const __tuple_impl& __t) _NOEXCEPT_((__all<is_nothrow_copy_assignable<_Tp>::value...>::value)) 453*46035553Spatrick { 454*46035553Spatrick __swallow(__tuple_leaf<_Indx, _Tp>::operator=(static_cast<const __tuple_leaf<_Indx, _Tp>&>(__t).get())...); 455*46035553Spatrick return *this; 456*46035553Spatrick } 457*46035553Spatrick 458*46035553Spatrick _LIBCPP_INLINE_VISIBILITY 459*46035553Spatrick __tuple_impl& 460*46035553Spatrick operator=(__tuple_impl&& __t) _NOEXCEPT_((__all<is_nothrow_move_assignable<_Tp>::value...>::value)) 461*46035553Spatrick { 462*46035553Spatrick __swallow(__tuple_leaf<_Indx, _Tp>::operator=(_VSTD::forward<_Tp>(static_cast<__tuple_leaf<_Indx, _Tp>&>(__t).get()))...); 463*46035553Spatrick return *this; 464*46035553Spatrick } 465*46035553Spatrick 466*46035553Spatrick _LIBCPP_INLINE_VISIBILITY 467*46035553Spatrick void swap(__tuple_impl& __t) 468*46035553Spatrick _NOEXCEPT_(__all<__is_nothrow_swappable<_Tp>::value...>::value) 469*46035553Spatrick { 470*46035553Spatrick __swallow(__tuple_leaf<_Indx, _Tp>::swap(static_cast<__tuple_leaf<_Indx, _Tp>&>(__t))...); 471*46035553Spatrick } 472*46035553Spatrick}; 473*46035553Spatrick 474*46035553Spatrick 475*46035553Spatrick 476*46035553Spatricktemplate <class ..._Tp> 477*46035553Spatrickclass _LIBCPP_TEMPLATE_VIS tuple 478*46035553Spatrick{ 479*46035553Spatrick typedef __tuple_impl<typename __make_tuple_indices<sizeof...(_Tp)>::type, _Tp...> _BaseT; 480*46035553Spatrick 481*46035553Spatrick _BaseT __base_; 482*46035553Spatrick 483*46035553Spatrick#if defined(_LIBCPP_ENABLE_TUPLE_IMPLICIT_REDUCED_ARITY_EXTENSION) 484*46035553Spatrick static constexpr bool _EnableImplicitReducedArityExtension = true; 485*46035553Spatrick#else 486*46035553Spatrick static constexpr bool _EnableImplicitReducedArityExtension = false; 487*46035553Spatrick#endif 488*46035553Spatrick 489*46035553Spatrick template <class ..._Args> 490*46035553Spatrick struct _PackExpandsToThisTuple : false_type {}; 491*46035553Spatrick 492*46035553Spatrick template <class _Arg> 493*46035553Spatrick struct _PackExpandsToThisTuple<_Arg> 494*46035553Spatrick : is_same<typename __uncvref<_Arg>::type, tuple> {}; 495*46035553Spatrick 496*46035553Spatrick template <bool _MaybeEnable, class _Dummy = void> 497*46035553Spatrick struct _CheckArgsConstructor : __check_tuple_constructor_fail {}; 498*46035553Spatrick 499*46035553Spatrick template <class _Dummy> 500*46035553Spatrick struct _CheckArgsConstructor<true, _Dummy> 501*46035553Spatrick { 502*46035553Spatrick template <int&...> 503*46035553Spatrick static constexpr bool __enable_implicit_default() { 504*46035553Spatrick return __all<__is_implicitly_default_constructible<_Tp>::value... >::value; 505*46035553Spatrick } 506*46035553Spatrick 507*46035553Spatrick template <int&...> 508*46035553Spatrick static constexpr bool __enable_explicit_default() { 509*46035553Spatrick return 510*46035553Spatrick __all<is_default_constructible<_Tp>::value...>::value && 511*46035553Spatrick !__enable_implicit_default< >(); 512*46035553Spatrick } 513*46035553Spatrick 514*46035553Spatrick 515*46035553Spatrick template <class ..._Args> 516*46035553Spatrick static constexpr bool __enable_explicit() { 517*46035553Spatrick return 518*46035553Spatrick __tuple_constructible< 519*46035553Spatrick tuple<_Args...>, 520*46035553Spatrick typename __make_tuple_types<tuple, 521*46035553Spatrick sizeof...(_Args) < sizeof...(_Tp) ? 522*46035553Spatrick sizeof...(_Args) : 523*46035553Spatrick sizeof...(_Tp)>::type 524*46035553Spatrick >::value && 525*46035553Spatrick !__tuple_convertible< 526*46035553Spatrick tuple<_Args...>, 527*46035553Spatrick typename __make_tuple_types<tuple, 528*46035553Spatrick sizeof...(_Args) < sizeof...(_Tp) ? 529*46035553Spatrick sizeof...(_Args) : 530*46035553Spatrick sizeof...(_Tp)>::type 531*46035553Spatrick >::value && 532*46035553Spatrick __all_default_constructible< 533*46035553Spatrick typename __make_tuple_types<tuple, sizeof...(_Tp), 534*46035553Spatrick sizeof...(_Args) < sizeof...(_Tp) ? 535*46035553Spatrick sizeof...(_Args) : 536*46035553Spatrick sizeof...(_Tp)>::type 537*46035553Spatrick >::value; 538*46035553Spatrick } 539*46035553Spatrick 540*46035553Spatrick template <class ..._Args> 541*46035553Spatrick static constexpr bool __enable_implicit() { 542*46035553Spatrick return 543*46035553Spatrick __tuple_constructible< 544*46035553Spatrick tuple<_Args...>, 545*46035553Spatrick typename __make_tuple_types<tuple, 546*46035553Spatrick sizeof...(_Args) < sizeof...(_Tp) ? 547*46035553Spatrick sizeof...(_Args) : 548*46035553Spatrick sizeof...(_Tp)>::type 549*46035553Spatrick >::value && 550*46035553Spatrick __tuple_convertible< 551*46035553Spatrick tuple<_Args...>, 552*46035553Spatrick typename __make_tuple_types<tuple, 553*46035553Spatrick sizeof...(_Args) < sizeof...(_Tp) ? 554*46035553Spatrick sizeof...(_Args) : 555*46035553Spatrick sizeof...(_Tp)>::type 556*46035553Spatrick >::value && 557*46035553Spatrick __all_default_constructible< 558*46035553Spatrick typename __make_tuple_types<tuple, sizeof...(_Tp), 559*46035553Spatrick sizeof...(_Args) < sizeof...(_Tp) ? 560*46035553Spatrick sizeof...(_Args) : 561*46035553Spatrick sizeof...(_Tp)>::type 562*46035553Spatrick >::value; 563*46035553Spatrick } 564*46035553Spatrick }; 565*46035553Spatrick 566*46035553Spatrick template <bool _MaybeEnable, 567*46035553Spatrick bool = sizeof...(_Tp) == 1, 568*46035553Spatrick class _Dummy = void> 569*46035553Spatrick struct _CheckTupleLikeConstructor : __check_tuple_constructor_fail {}; 570*46035553Spatrick 571*46035553Spatrick template <class _Dummy> 572*46035553Spatrick struct _CheckTupleLikeConstructor<true, false, _Dummy> 573*46035553Spatrick { 574*46035553Spatrick template <class _Tuple> 575*46035553Spatrick static constexpr bool __enable_implicit() { 576*46035553Spatrick return __tuple_constructible<_Tuple, tuple>::value 577*46035553Spatrick && __tuple_convertible<_Tuple, tuple>::value; 578*46035553Spatrick } 579*46035553Spatrick 580*46035553Spatrick template <class _Tuple> 581*46035553Spatrick static constexpr bool __enable_explicit() { 582*46035553Spatrick return __tuple_constructible<_Tuple, tuple>::value 583*46035553Spatrick && !__tuple_convertible<_Tuple, tuple>::value; 584*46035553Spatrick } 585*46035553Spatrick }; 586*46035553Spatrick 587*46035553Spatrick template <class _Dummy> 588*46035553Spatrick struct _CheckTupleLikeConstructor<true, true, _Dummy> 589*46035553Spatrick { 590*46035553Spatrick // This trait is used to disable the tuple-like constructor when 591*46035553Spatrick // the UTypes... constructor should be selected instead. 592*46035553Spatrick // See LWG issue #2549. 593*46035553Spatrick template <class _Tuple> 594*46035553Spatrick using _PreferTupleLikeConstructor = _Or< 595*46035553Spatrick // Don't attempt the two checks below if the tuple we are given 596*46035553Spatrick // has the same type as this tuple. 597*46035553Spatrick _IsSame<__uncvref_t<_Tuple>, tuple>, 598*46035553Spatrick _Lazy<_And, 599*46035553Spatrick _Not<is_constructible<_Tp..., _Tuple>>, 600*46035553Spatrick _Not<is_convertible<_Tuple, _Tp...>> 601*46035553Spatrick > 602*46035553Spatrick >; 603*46035553Spatrick 604*46035553Spatrick template <class _Tuple> 605*46035553Spatrick static constexpr bool __enable_implicit() { 606*46035553Spatrick return _And< 607*46035553Spatrick __tuple_constructible<_Tuple, tuple>, 608*46035553Spatrick __tuple_convertible<_Tuple, tuple>, 609*46035553Spatrick _PreferTupleLikeConstructor<_Tuple> 610*46035553Spatrick >::value; 611*46035553Spatrick } 612*46035553Spatrick 613*46035553Spatrick template <class _Tuple> 614*46035553Spatrick static constexpr bool __enable_explicit() { 615*46035553Spatrick return _And< 616*46035553Spatrick __tuple_constructible<_Tuple, tuple>, 617*46035553Spatrick _PreferTupleLikeConstructor<_Tuple>, 618*46035553Spatrick _Not<__tuple_convertible<_Tuple, tuple>> 619*46035553Spatrick >::value; 620*46035553Spatrick } 621*46035553Spatrick }; 622*46035553Spatrick 623*46035553Spatrick template <class _Tuple, bool _DisableIfLValue> 624*46035553Spatrick using _EnableImplicitTupleLikeConstructor = _EnableIf< 625*46035553Spatrick _CheckTupleLikeConstructor< 626*46035553Spatrick __tuple_like_with_size<_Tuple, sizeof...(_Tp)>::value 627*46035553Spatrick && !_PackExpandsToThisTuple<_Tuple>::value 628*46035553Spatrick && (!is_lvalue_reference<_Tuple>::value || !_DisableIfLValue) 629*46035553Spatrick >::template __enable_implicit<_Tuple>(), 630*46035553Spatrick bool 631*46035553Spatrick >; 632*46035553Spatrick 633*46035553Spatrick template <class _Tuple, bool _DisableIfLValue> 634*46035553Spatrick using _EnableExplicitTupleLikeConstructor = _EnableIf< 635*46035553Spatrick _CheckTupleLikeConstructor< 636*46035553Spatrick __tuple_like_with_size<_Tuple, sizeof...(_Tp)>::value 637*46035553Spatrick && !_PackExpandsToThisTuple<_Tuple>::value 638*46035553Spatrick && (!is_lvalue_reference<_Tuple>::value || !_DisableIfLValue) 639*46035553Spatrick >::template __enable_explicit<_Tuple>(), 640*46035553Spatrick bool 641*46035553Spatrick >; 642*46035553Spatrick template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_AFTER_CXX11 643*46035553Spatrick typename tuple_element<_Jp, tuple<_Up...> >::type& get(tuple<_Up...>&) _NOEXCEPT; 644*46035553Spatrick template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_AFTER_CXX11 645*46035553Spatrick const typename tuple_element<_Jp, tuple<_Up...> >::type& get(const tuple<_Up...>&) _NOEXCEPT; 646*46035553Spatrick template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_AFTER_CXX11 647*46035553Spatrick typename tuple_element<_Jp, tuple<_Up...> >::type&& get(tuple<_Up...>&&) _NOEXCEPT; 648*46035553Spatrick template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_AFTER_CXX11 649*46035553Spatrick const typename tuple_element<_Jp, tuple<_Up...> >::type&& get(const tuple<_Up...>&&) _NOEXCEPT; 650*46035553Spatrickpublic: 651*46035553Spatrick 652*46035553Spatrick template <bool _Dummy = true, _EnableIf< 653*46035553Spatrick _CheckArgsConstructor<_Dummy>::__enable_implicit_default() 654*46035553Spatrick , void*> = nullptr> 655*46035553Spatrick _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 656*46035553Spatrick tuple() 657*46035553Spatrick _NOEXCEPT_(__all<is_nothrow_default_constructible<_Tp>::value...>::value) {} 658*46035553Spatrick 659*46035553Spatrick template <bool _Dummy = true, _EnableIf< 660*46035553Spatrick _CheckArgsConstructor<_Dummy>::__enable_explicit_default() 661*46035553Spatrick , void*> = nullptr> 662*46035553Spatrick explicit _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 663*46035553Spatrick tuple() 664*46035553Spatrick _NOEXCEPT_(__all<is_nothrow_default_constructible<_Tp>::value...>::value) {} 665*46035553Spatrick 666*46035553Spatrick tuple(tuple const&) = default; 667*46035553Spatrick tuple(tuple&&) = default; 668*46035553Spatrick 669*46035553Spatrick template <class _AllocArgT, class _Alloc, _EnableIf< 670*46035553Spatrick _CheckArgsConstructor<_IsSame<allocator_arg_t, _AllocArgT>::value >::__enable_implicit_default() 671*46035553Spatrick , void*> = nullptr 672*46035553Spatrick > 673*46035553Spatrick _LIBCPP_INLINE_VISIBILITY 674*46035553Spatrick tuple(_AllocArgT, _Alloc const& __a) 675*46035553Spatrick : __base_(allocator_arg_t(), __a, 676*46035553Spatrick __tuple_indices<>(), __tuple_types<>(), 677*46035553Spatrick typename __make_tuple_indices<sizeof...(_Tp), 0>::type(), 678*46035553Spatrick __tuple_types<_Tp...>()) {} 679*46035553Spatrick 680*46035553Spatrick template <class _AllocArgT, class _Alloc, _EnableIf< 681*46035553Spatrick _CheckArgsConstructor<_IsSame<allocator_arg_t, _AllocArgT>::value>::__enable_explicit_default() 682*46035553Spatrick , void*> = nullptr 683*46035553Spatrick > 684*46035553Spatrick explicit _LIBCPP_INLINE_VISIBILITY 685*46035553Spatrick tuple(_AllocArgT, _Alloc const& __a) 686*46035553Spatrick : __base_(allocator_arg_t(), __a, 687*46035553Spatrick __tuple_indices<>(), __tuple_types<>(), 688*46035553Spatrick typename __make_tuple_indices<sizeof...(_Tp), 0>::type(), 689*46035553Spatrick __tuple_types<_Tp...>()) {} 690*46035553Spatrick 691*46035553Spatrick template <bool _Dummy = true, 692*46035553Spatrick typename enable_if 693*46035553Spatrick < 694*46035553Spatrick _CheckArgsConstructor< 695*46035553Spatrick _Dummy 696*46035553Spatrick >::template __enable_implicit<_Tp const&...>(), 697*46035553Spatrick bool 698*46035553Spatrick >::type = false 699*46035553Spatrick > 700*46035553Spatrick _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 701*46035553Spatrick tuple(const _Tp& ... __t) _NOEXCEPT_((__all<is_nothrow_copy_constructible<_Tp>::value...>::value)) 702*46035553Spatrick : __base_(typename __make_tuple_indices<sizeof...(_Tp)>::type(), 703*46035553Spatrick typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(), 704*46035553Spatrick typename __make_tuple_indices<0>::type(), 705*46035553Spatrick typename __make_tuple_types<tuple, 0>::type(), 706*46035553Spatrick __t... 707*46035553Spatrick ) {} 708*46035553Spatrick 709*46035553Spatrick template <bool _Dummy = true, 710*46035553Spatrick typename enable_if 711*46035553Spatrick < 712*46035553Spatrick _CheckArgsConstructor< 713*46035553Spatrick _Dummy 714*46035553Spatrick >::template __enable_explicit<_Tp const&...>(), 715*46035553Spatrick bool 716*46035553Spatrick >::type = false 717*46035553Spatrick > 718*46035553Spatrick _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 719*46035553Spatrick explicit tuple(const _Tp& ... __t) _NOEXCEPT_((__all<is_nothrow_copy_constructible<_Tp>::value...>::value)) 720*46035553Spatrick : __base_(typename __make_tuple_indices<sizeof...(_Tp)>::type(), 721*46035553Spatrick typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(), 722*46035553Spatrick typename __make_tuple_indices<0>::type(), 723*46035553Spatrick typename __make_tuple_types<tuple, 0>::type(), 724*46035553Spatrick __t... 725*46035553Spatrick ) {} 726*46035553Spatrick 727*46035553Spatrick template <class _Alloc, bool _Dummy = true, 728*46035553Spatrick typename enable_if 729*46035553Spatrick < 730*46035553Spatrick _CheckArgsConstructor< 731*46035553Spatrick _Dummy 732*46035553Spatrick >::template __enable_implicit<_Tp const&...>(), 733*46035553Spatrick bool 734*46035553Spatrick >::type = false 735*46035553Spatrick > 736*46035553Spatrick _LIBCPP_INLINE_VISIBILITY 737*46035553Spatrick tuple(allocator_arg_t, const _Alloc& __a, const _Tp& ... __t) 738*46035553Spatrick : __base_(allocator_arg_t(), __a, 739*46035553Spatrick typename __make_tuple_indices<sizeof...(_Tp)>::type(), 740*46035553Spatrick typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(), 741*46035553Spatrick typename __make_tuple_indices<0>::type(), 742*46035553Spatrick typename __make_tuple_types<tuple, 0>::type(), 743*46035553Spatrick __t... 744*46035553Spatrick ) {} 745*46035553Spatrick 746*46035553Spatrick template <class _Alloc, bool _Dummy = true, 747*46035553Spatrick typename enable_if 748*46035553Spatrick < 749*46035553Spatrick _CheckArgsConstructor< 750*46035553Spatrick _Dummy 751*46035553Spatrick >::template __enable_explicit<_Tp const&...>(), 752*46035553Spatrick bool 753*46035553Spatrick >::type = false 754*46035553Spatrick > 755*46035553Spatrick _LIBCPP_INLINE_VISIBILITY 756*46035553Spatrick explicit 757*46035553Spatrick tuple(allocator_arg_t, const _Alloc& __a, const _Tp& ... __t) 758*46035553Spatrick : __base_(allocator_arg_t(), __a, 759*46035553Spatrick typename __make_tuple_indices<sizeof...(_Tp)>::type(), 760*46035553Spatrick typename __make_tuple_types<tuple, sizeof...(_Tp)>::type(), 761*46035553Spatrick typename __make_tuple_indices<0>::type(), 762*46035553Spatrick typename __make_tuple_types<tuple, 0>::type(), 763*46035553Spatrick __t... 764*46035553Spatrick ) {} 765*46035553Spatrick 766*46035553Spatrick template <class ..._Up, 767*46035553Spatrick bool _PackIsTuple = _PackExpandsToThisTuple<_Up...>::value, 768*46035553Spatrick typename enable_if 769*46035553Spatrick < 770*46035553Spatrick _CheckArgsConstructor< 771*46035553Spatrick sizeof...(_Up) == sizeof...(_Tp) 772*46035553Spatrick && !_PackIsTuple 773*46035553Spatrick >::template __enable_implicit<_Up...>() || 774*46035553Spatrick _CheckArgsConstructor< 775*46035553Spatrick _EnableImplicitReducedArityExtension 776*46035553Spatrick && sizeof...(_Up) < sizeof...(_Tp) 777*46035553Spatrick && !_PackIsTuple 778*46035553Spatrick >::template __enable_implicit<_Up...>(), 779*46035553Spatrick bool 780*46035553Spatrick >::type = false 781*46035553Spatrick > 782*46035553Spatrick _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 783*46035553Spatrick tuple(_Up&&... __u) 784*46035553Spatrick _NOEXCEPT_(( 785*46035553Spatrick is_nothrow_constructible<_BaseT, 786*46035553Spatrick typename __make_tuple_indices<sizeof...(_Up)>::type, 787*46035553Spatrick typename __make_tuple_types<tuple, sizeof...(_Up)>::type, 788*46035553Spatrick typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type, 789*46035553Spatrick typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type, 790*46035553Spatrick _Up... 791*46035553Spatrick >::value 792*46035553Spatrick )) 793*46035553Spatrick : __base_(typename __make_tuple_indices<sizeof...(_Up)>::type(), 794*46035553Spatrick typename __make_tuple_types<tuple, sizeof...(_Up)>::type(), 795*46035553Spatrick typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(), 796*46035553Spatrick typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(), 797*46035553Spatrick _VSTD::forward<_Up>(__u)...) {} 798*46035553Spatrick 799*46035553Spatrick template <class ..._Up, 800*46035553Spatrick typename enable_if 801*46035553Spatrick < 802*46035553Spatrick _CheckArgsConstructor< 803*46035553Spatrick sizeof...(_Up) <= sizeof...(_Tp) 804*46035553Spatrick && !_PackExpandsToThisTuple<_Up...>::value 805*46035553Spatrick >::template __enable_explicit<_Up...>() || 806*46035553Spatrick _CheckArgsConstructor< 807*46035553Spatrick !_EnableImplicitReducedArityExtension 808*46035553Spatrick && sizeof...(_Up) < sizeof...(_Tp) 809*46035553Spatrick && !_PackExpandsToThisTuple<_Up...>::value 810*46035553Spatrick >::template __enable_implicit<_Up...>(), 811*46035553Spatrick bool 812*46035553Spatrick >::type = false 813*46035553Spatrick > 814*46035553Spatrick _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 815*46035553Spatrick explicit 816*46035553Spatrick tuple(_Up&&... __u) 817*46035553Spatrick _NOEXCEPT_(( 818*46035553Spatrick is_nothrow_constructible<_BaseT, 819*46035553Spatrick typename __make_tuple_indices<sizeof...(_Up)>::type, 820*46035553Spatrick typename __make_tuple_types<tuple, sizeof...(_Up)>::type, 821*46035553Spatrick typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type, 822*46035553Spatrick typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type, 823*46035553Spatrick _Up... 824*46035553Spatrick >::value 825*46035553Spatrick )) 826*46035553Spatrick : __base_(typename __make_tuple_indices<sizeof...(_Up)>::type(), 827*46035553Spatrick typename __make_tuple_types<tuple, sizeof...(_Up)>::type(), 828*46035553Spatrick typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(), 829*46035553Spatrick typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(), 830*46035553Spatrick _VSTD::forward<_Up>(__u)...) {} 831*46035553Spatrick 832*46035553Spatrick template <class _Alloc, class ..._Up, 833*46035553Spatrick typename enable_if 834*46035553Spatrick < 835*46035553Spatrick _CheckArgsConstructor< 836*46035553Spatrick sizeof...(_Up) == sizeof...(_Tp) && 837*46035553Spatrick !_PackExpandsToThisTuple<_Up...>::value 838*46035553Spatrick >::template __enable_implicit<_Up...>(), 839*46035553Spatrick bool 840*46035553Spatrick >::type = false 841*46035553Spatrick > 842*46035553Spatrick _LIBCPP_INLINE_VISIBILITY 843*46035553Spatrick tuple(allocator_arg_t, const _Alloc& __a, _Up&&... __u) 844*46035553Spatrick : __base_(allocator_arg_t(), __a, 845*46035553Spatrick typename __make_tuple_indices<sizeof...(_Up)>::type(), 846*46035553Spatrick typename __make_tuple_types<tuple, sizeof...(_Up)>::type(), 847*46035553Spatrick typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(), 848*46035553Spatrick typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(), 849*46035553Spatrick _VSTD::forward<_Up>(__u)...) {} 850*46035553Spatrick 851*46035553Spatrick template <class _Alloc, class ..._Up, 852*46035553Spatrick typename enable_if 853*46035553Spatrick < 854*46035553Spatrick _CheckArgsConstructor< 855*46035553Spatrick sizeof...(_Up) == sizeof...(_Tp) && 856*46035553Spatrick !_PackExpandsToThisTuple<_Up...>::value 857*46035553Spatrick >::template __enable_explicit<_Up...>(), 858*46035553Spatrick bool 859*46035553Spatrick >::type = false 860*46035553Spatrick > 861*46035553Spatrick _LIBCPP_INLINE_VISIBILITY 862*46035553Spatrick explicit 863*46035553Spatrick tuple(allocator_arg_t, const _Alloc& __a, _Up&&... __u) 864*46035553Spatrick : __base_(allocator_arg_t(), __a, 865*46035553Spatrick typename __make_tuple_indices<sizeof...(_Up)>::type(), 866*46035553Spatrick typename __make_tuple_types<tuple, sizeof...(_Up)>::type(), 867*46035553Spatrick typename __make_tuple_indices<sizeof...(_Tp), sizeof...(_Up)>::type(), 868*46035553Spatrick typename __make_tuple_types<tuple, sizeof...(_Tp), sizeof...(_Up)>::type(), 869*46035553Spatrick _VSTD::forward<_Up>(__u)...) {} 870*46035553Spatrick 871*46035553Spatrick template <class _Tuple, _EnableImplicitTupleLikeConstructor<_Tuple, true> = false> 872*46035553Spatrick _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 873*46035553Spatrick tuple(_Tuple&& __t) _NOEXCEPT_((is_nothrow_constructible<_BaseT, _Tuple>::value)) 874*46035553Spatrick : __base_(_VSTD::forward<_Tuple>(__t)) {} 875*46035553Spatrick 876*46035553Spatrick template <class _Tuple, _EnableImplicitTupleLikeConstructor<const _Tuple&, false> = false> 877*46035553Spatrick _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 878*46035553Spatrick tuple(const _Tuple& __t) _NOEXCEPT_((is_nothrow_constructible<_BaseT, const _Tuple&>::value)) 879*46035553Spatrick : __base_(__t) {} 880*46035553Spatrick template <class _Tuple, _EnableExplicitTupleLikeConstructor<_Tuple, true> = false> 881*46035553Spatrick _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 882*46035553Spatrick explicit 883*46035553Spatrick tuple(_Tuple&& __t) _NOEXCEPT_((is_nothrow_constructible<_BaseT, _Tuple>::value)) 884*46035553Spatrick : __base_(_VSTD::forward<_Tuple>(__t)) {} 885*46035553Spatrick 886*46035553Spatrick template <class _Tuple, _EnableExplicitTupleLikeConstructor<const _Tuple&, false> = false> 887*46035553Spatrick _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 888*46035553Spatrick explicit 889*46035553Spatrick tuple(const _Tuple& __t) _NOEXCEPT_((is_nothrow_constructible<_BaseT, const _Tuple&>::value)) 890*46035553Spatrick : __base_(__t) {} 891*46035553Spatrick 892*46035553Spatrick template <class _Alloc, class _Tuple, 893*46035553Spatrick typename enable_if 894*46035553Spatrick < 895*46035553Spatrick _CheckTupleLikeConstructor< 896*46035553Spatrick __tuple_like_with_size<_Tuple, sizeof...(_Tp)>::value 897*46035553Spatrick >::template __enable_implicit<_Tuple>(), 898*46035553Spatrick bool 899*46035553Spatrick >::type = false 900*46035553Spatrick > 901*46035553Spatrick _LIBCPP_INLINE_VISIBILITY 902*46035553Spatrick tuple(allocator_arg_t, const _Alloc& __a, _Tuple&& __t) 903*46035553Spatrick : __base_(allocator_arg_t(), __a, _VSTD::forward<_Tuple>(__t)) {} 904*46035553Spatrick 905*46035553Spatrick template <class _Alloc, class _Tuple, 906*46035553Spatrick typename enable_if 907*46035553Spatrick < 908*46035553Spatrick _CheckTupleLikeConstructor< 909*46035553Spatrick __tuple_like_with_size<_Tuple, sizeof...(_Tp)>::value 910*46035553Spatrick >::template __enable_explicit<_Tuple>(), 911*46035553Spatrick bool 912*46035553Spatrick >::type = false 913*46035553Spatrick > 914*46035553Spatrick _LIBCPP_INLINE_VISIBILITY 915*46035553Spatrick explicit 916*46035553Spatrick tuple(allocator_arg_t, const _Alloc& __a, _Tuple&& __t) 917*46035553Spatrick : __base_(allocator_arg_t(), __a, _VSTD::forward<_Tuple>(__t)) {} 918*46035553Spatrick 919*46035553Spatrick using _CanCopyAssign = __all<is_copy_assignable<_Tp>::value...>; 920*46035553Spatrick using _CanMoveAssign = __all<is_move_assignable<_Tp>::value...>; 921*46035553Spatrick 922*46035553Spatrick _LIBCPP_INLINE_VISIBILITY 923*46035553Spatrick tuple& operator=(typename conditional<_CanCopyAssign::value, tuple, __nat>::type const& __t) 924*46035553Spatrick _NOEXCEPT_((__all<is_nothrow_copy_assignable<_Tp>::value...>::value)) 925*46035553Spatrick { 926*46035553Spatrick __base_.operator=(__t.__base_); 927*46035553Spatrick return *this; 928*46035553Spatrick } 929*46035553Spatrick 930*46035553Spatrick _LIBCPP_INLINE_VISIBILITY 931*46035553Spatrick tuple& operator=(typename conditional<_CanMoveAssign::value, tuple, __nat>::type&& __t) 932*46035553Spatrick _NOEXCEPT_((__all<is_nothrow_move_assignable<_Tp>::value...>::value)) 933*46035553Spatrick { 934*46035553Spatrick __base_.operator=(static_cast<_BaseT&&>(__t.__base_)); 935*46035553Spatrick return *this; 936*46035553Spatrick } 937*46035553Spatrick 938*46035553Spatrick template <class _Tuple, 939*46035553Spatrick class = typename enable_if 940*46035553Spatrick < 941*46035553Spatrick __tuple_assignable<_Tuple, tuple>::value 942*46035553Spatrick >::type 943*46035553Spatrick > 944*46035553Spatrick _LIBCPP_INLINE_VISIBILITY 945*46035553Spatrick tuple& 946*46035553Spatrick operator=(_Tuple&& __t) _NOEXCEPT_((is_nothrow_assignable<_BaseT&, _Tuple>::value)) 947*46035553Spatrick { 948*46035553Spatrick __base_.operator=(_VSTD::forward<_Tuple>(__t)); 949*46035553Spatrick return *this; 950*46035553Spatrick } 951*46035553Spatrick 952*46035553Spatrick _LIBCPP_INLINE_VISIBILITY 953*46035553Spatrick void swap(tuple& __t) _NOEXCEPT_(__all<__is_nothrow_swappable<_Tp>::value...>::value) 954*46035553Spatrick {__base_.swap(__t.__base_);} 955*46035553Spatrick}; 956*46035553Spatrick 957*46035553Spatricktemplate <> 958*46035553Spatrickclass _LIBCPP_TEMPLATE_VIS tuple<> 959*46035553Spatrick{ 960*46035553Spatrickpublic: 961*46035553Spatrick _LIBCPP_INLINE_VISIBILITY 962*46035553Spatrick _LIBCPP_CONSTEXPR tuple() _NOEXCEPT = default; 963*46035553Spatrick template <class _Alloc> 964*46035553Spatrick _LIBCPP_INLINE_VISIBILITY 965*46035553Spatrick tuple(allocator_arg_t, const _Alloc&) _NOEXCEPT {} 966*46035553Spatrick template <class _Alloc> 967*46035553Spatrick _LIBCPP_INLINE_VISIBILITY 968*46035553Spatrick tuple(allocator_arg_t, const _Alloc&, const tuple&) _NOEXCEPT {} 969*46035553Spatrick template <class _Up> 970*46035553Spatrick _LIBCPP_INLINE_VISIBILITY 971*46035553Spatrick tuple(array<_Up, 0>) _NOEXCEPT {} 972*46035553Spatrick template <class _Alloc, class _Up> 973*46035553Spatrick _LIBCPP_INLINE_VISIBILITY 974*46035553Spatrick tuple(allocator_arg_t, const _Alloc&, array<_Up, 0>) _NOEXCEPT {} 975*46035553Spatrick _LIBCPP_INLINE_VISIBILITY 976*46035553Spatrick void swap(tuple&) _NOEXCEPT {} 977*46035553Spatrick}; 978*46035553Spatrick 979*46035553Spatrick#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES 980*46035553Spatricktemplate <class ..._Tp> 981*46035553Spatricktuple(_Tp...) -> tuple<_Tp...>; 982*46035553Spatricktemplate <class _Tp1, class _Tp2> 983*46035553Spatricktuple(pair<_Tp1, _Tp2>) -> tuple<_Tp1, _Tp2>; 984*46035553Spatricktemplate <class _Alloc, class ..._Tp> 985*46035553Spatricktuple(allocator_arg_t, _Alloc, _Tp...) -> tuple<_Tp...>; 986*46035553Spatricktemplate <class _Alloc, class _Tp1, class _Tp2> 987*46035553Spatricktuple(allocator_arg_t, _Alloc, pair<_Tp1, _Tp2>) -> tuple<_Tp1, _Tp2>; 988*46035553Spatricktemplate <class _Alloc, class ..._Tp> 989*46035553Spatricktuple(allocator_arg_t, _Alloc, tuple<_Tp...>) -> tuple<_Tp...>; 990*46035553Spatrick#endif 991*46035553Spatrick 992*46035553Spatricktemplate <class ..._Tp> 993*46035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 994*46035553Spatricktypename enable_if 995*46035553Spatrick< 996*46035553Spatrick __all<__is_swappable<_Tp>::value...>::value, 997*46035553Spatrick void 998*46035553Spatrick>::type 999*46035553Spatrickswap(tuple<_Tp...>& __t, tuple<_Tp...>& __u) 1000*46035553Spatrick _NOEXCEPT_(__all<__is_nothrow_swappable<_Tp>::value...>::value) 1001*46035553Spatrick {__t.swap(__u);} 1002*46035553Spatrick 1003*46035553Spatrick// get 1004*46035553Spatrick 1005*46035553Spatricktemplate <size_t _Ip, class ..._Tp> 1006*46035553Spatrickinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1007*46035553Spatricktypename tuple_element<_Ip, tuple<_Tp...> >::type& 1008*46035553Spatrickget(tuple<_Tp...>& __t) _NOEXCEPT 1009*46035553Spatrick{ 1010*46035553Spatrick typedef _LIBCPP_NODEBUG_TYPE typename tuple_element<_Ip, tuple<_Tp...> >::type type; 1011*46035553Spatrick return static_cast<__tuple_leaf<_Ip, type>&>(__t.__base_).get(); 1012*46035553Spatrick} 1013*46035553Spatrick 1014*46035553Spatricktemplate <size_t _Ip, class ..._Tp> 1015*46035553Spatrickinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1016*46035553Spatrickconst typename tuple_element<_Ip, tuple<_Tp...> >::type& 1017*46035553Spatrickget(const tuple<_Tp...>& __t) _NOEXCEPT 1018*46035553Spatrick{ 1019*46035553Spatrick typedef _LIBCPP_NODEBUG_TYPE typename tuple_element<_Ip, tuple<_Tp...> >::type type; 1020*46035553Spatrick return static_cast<const __tuple_leaf<_Ip, type>&>(__t.__base_).get(); 1021*46035553Spatrick} 1022*46035553Spatrick 1023*46035553Spatricktemplate <size_t _Ip, class ..._Tp> 1024*46035553Spatrickinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1025*46035553Spatricktypename tuple_element<_Ip, tuple<_Tp...> >::type&& 1026*46035553Spatrickget(tuple<_Tp...>&& __t) _NOEXCEPT 1027*46035553Spatrick{ 1028*46035553Spatrick typedef _LIBCPP_NODEBUG_TYPE typename tuple_element<_Ip, tuple<_Tp...> >::type type; 1029*46035553Spatrick return static_cast<type&&>( 1030*46035553Spatrick static_cast<__tuple_leaf<_Ip, type>&&>(__t.__base_).get()); 1031*46035553Spatrick} 1032*46035553Spatrick 1033*46035553Spatricktemplate <size_t _Ip, class ..._Tp> 1034*46035553Spatrickinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1035*46035553Spatrickconst typename tuple_element<_Ip, tuple<_Tp...> >::type&& 1036*46035553Spatrickget(const tuple<_Tp...>&& __t) _NOEXCEPT 1037*46035553Spatrick{ 1038*46035553Spatrick typedef _LIBCPP_NODEBUG_TYPE typename tuple_element<_Ip, tuple<_Tp...> >::type type; 1039*46035553Spatrick return static_cast<const type&&>( 1040*46035553Spatrick static_cast<const __tuple_leaf<_Ip, type>&&>(__t.__base_).get()); 1041*46035553Spatrick} 1042*46035553Spatrick 1043*46035553Spatrick#if _LIBCPP_STD_VER > 11 1044*46035553Spatrick 1045*46035553Spatricknamespace __find_detail { 1046*46035553Spatrick 1047*46035553Spatrickstatic constexpr size_t __not_found = -1; 1048*46035553Spatrickstatic constexpr size_t __ambiguous = __not_found - 1; 1049*46035553Spatrick 1050*46035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 1051*46035553Spatrickconstexpr size_t __find_idx_return(size_t __curr_i, size_t __res, bool __matches) { 1052*46035553Spatrick return !__matches ? __res : 1053*46035553Spatrick (__res == __not_found ? __curr_i : __ambiguous); 1054*46035553Spatrick} 1055*46035553Spatrick 1056*46035553Spatricktemplate <size_t _Nx> 1057*46035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 1058*46035553Spatrickconstexpr size_t __find_idx(size_t __i, const bool (&__matches)[_Nx]) { 1059*46035553Spatrick return __i == _Nx ? __not_found : 1060*46035553Spatrick __find_idx_return(__i, __find_idx(__i + 1, __matches), __matches[__i]); 1061*46035553Spatrick} 1062*46035553Spatrick 1063*46035553Spatricktemplate <class _T1, class ..._Args> 1064*46035553Spatrickstruct __find_exactly_one_checked { 1065*46035553Spatrick static constexpr bool __matches[sizeof...(_Args)] = {is_same<_T1, _Args>::value...}; 1066*46035553Spatrick static constexpr size_t value = __find_detail::__find_idx(0, __matches); 1067*46035553Spatrick static_assert(value != __not_found, "type not found in type list" ); 1068*46035553Spatrick static_assert(value != __ambiguous, "type occurs more than once in type list"); 1069*46035553Spatrick}; 1070*46035553Spatrick 1071*46035553Spatricktemplate <class _T1> 1072*46035553Spatrickstruct __find_exactly_one_checked<_T1> { 1073*46035553Spatrick static_assert(!is_same<_T1, _T1>::value, "type not in empty type list"); 1074*46035553Spatrick}; 1075*46035553Spatrick 1076*46035553Spatrick} // namespace __find_detail; 1077*46035553Spatrick 1078*46035553Spatricktemplate <typename _T1, typename... _Args> 1079*46035553Spatrickstruct __find_exactly_one_t 1080*46035553Spatrick : public __find_detail::__find_exactly_one_checked<_T1, _Args...> { 1081*46035553Spatrick}; 1082*46035553Spatrick 1083*46035553Spatricktemplate <class _T1, class... _Args> 1084*46035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 1085*46035553Spatrickconstexpr _T1& get(tuple<_Args...>& __tup) noexcept 1086*46035553Spatrick{ 1087*46035553Spatrick return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(__tup); 1088*46035553Spatrick} 1089*46035553Spatrick 1090*46035553Spatricktemplate <class _T1, class... _Args> 1091*46035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 1092*46035553Spatrickconstexpr _T1 const& get(tuple<_Args...> const& __tup) noexcept 1093*46035553Spatrick{ 1094*46035553Spatrick return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(__tup); 1095*46035553Spatrick} 1096*46035553Spatrick 1097*46035553Spatricktemplate <class _T1, class... _Args> 1098*46035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 1099*46035553Spatrickconstexpr _T1&& get(tuple<_Args...>&& __tup) noexcept 1100*46035553Spatrick{ 1101*46035553Spatrick return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(_VSTD::move(__tup)); 1102*46035553Spatrick} 1103*46035553Spatrick 1104*46035553Spatricktemplate <class _T1, class... _Args> 1105*46035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 1106*46035553Spatrickconstexpr _T1 const&& get(tuple<_Args...> const&& __tup) noexcept 1107*46035553Spatrick{ 1108*46035553Spatrick return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(_VSTD::move(__tup)); 1109*46035553Spatrick} 1110*46035553Spatrick 1111*46035553Spatrick#endif 1112*46035553Spatrick 1113*46035553Spatrick// tie 1114*46035553Spatrick 1115*46035553Spatricktemplate <class ..._Tp> 1116*46035553Spatrickinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1117*46035553Spatricktuple<_Tp&...> 1118*46035553Spatricktie(_Tp&... __t) _NOEXCEPT 1119*46035553Spatrick{ 1120*46035553Spatrick return tuple<_Tp&...>(__t...); 1121*46035553Spatrick} 1122*46035553Spatrick 1123*46035553Spatricktemplate <class _Up> 1124*46035553Spatrickstruct __ignore_t 1125*46035553Spatrick{ 1126*46035553Spatrick template <class _Tp> 1127*46035553Spatrick _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1128*46035553Spatrick const __ignore_t& operator=(_Tp&&) const {return *this;} 1129*46035553Spatrick}; 1130*46035553Spatrick 1131*46035553Spatricknamespace { 1132*46035553Spatrick _LIBCPP_INLINE_VAR constexpr __ignore_t<unsigned char> ignore = __ignore_t<unsigned char>(); 1133*46035553Spatrick} 1134*46035553Spatrick 1135*46035553Spatricktemplate <class... _Tp> 1136*46035553Spatrickinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1137*46035553Spatricktuple<typename __unwrap_ref_decay<_Tp>::type...> 1138*46035553Spatrickmake_tuple(_Tp&&... __t) 1139*46035553Spatrick{ 1140*46035553Spatrick return tuple<typename __unwrap_ref_decay<_Tp>::type...>(_VSTD::forward<_Tp>(__t)...); 1141*46035553Spatrick} 1142*46035553Spatrick 1143*46035553Spatricktemplate <class... _Tp> 1144*46035553Spatrickinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1145*46035553Spatricktuple<_Tp&&...> 1146*46035553Spatrickforward_as_tuple(_Tp&&... __t) _NOEXCEPT 1147*46035553Spatrick{ 1148*46035553Spatrick return tuple<_Tp&&...>(_VSTD::forward<_Tp>(__t)...); 1149*46035553Spatrick} 1150*46035553Spatrick 1151*46035553Spatricktemplate <size_t _Ip> 1152*46035553Spatrickstruct __tuple_equal 1153*46035553Spatrick{ 1154*46035553Spatrick template <class _Tp, class _Up> 1155*46035553Spatrick _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1156*46035553Spatrick bool operator()(const _Tp& __x, const _Up& __y) 1157*46035553Spatrick { 1158*46035553Spatrick return __tuple_equal<_Ip - 1>()(__x, __y) && _VSTD::get<_Ip-1>(__x) == _VSTD::get<_Ip-1>(__y); 1159*46035553Spatrick } 1160*46035553Spatrick}; 1161*46035553Spatrick 1162*46035553Spatricktemplate <> 1163*46035553Spatrickstruct __tuple_equal<0> 1164*46035553Spatrick{ 1165*46035553Spatrick template <class _Tp, class _Up> 1166*46035553Spatrick _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1167*46035553Spatrick bool operator()(const _Tp&, const _Up&) 1168*46035553Spatrick { 1169*46035553Spatrick return true; 1170*46035553Spatrick } 1171*46035553Spatrick}; 1172*46035553Spatrick 1173*46035553Spatricktemplate <class ..._Tp, class ..._Up> 1174*46035553Spatrickinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1175*46035553Spatrickbool 1176*46035553Spatrickoperator==(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) 1177*46035553Spatrick{ 1178*46035553Spatrick static_assert (sizeof...(_Tp) == sizeof...(_Up), "Can't compare tuples of different sizes"); 1179*46035553Spatrick return __tuple_equal<sizeof...(_Tp)>()(__x, __y); 1180*46035553Spatrick} 1181*46035553Spatrick 1182*46035553Spatricktemplate <class ..._Tp, class ..._Up> 1183*46035553Spatrickinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1184*46035553Spatrickbool 1185*46035553Spatrickoperator!=(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) 1186*46035553Spatrick{ 1187*46035553Spatrick return !(__x == __y); 1188*46035553Spatrick} 1189*46035553Spatrick 1190*46035553Spatricktemplate <size_t _Ip> 1191*46035553Spatrickstruct __tuple_less 1192*46035553Spatrick{ 1193*46035553Spatrick template <class _Tp, class _Up> 1194*46035553Spatrick _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1195*46035553Spatrick bool operator()(const _Tp& __x, const _Up& __y) 1196*46035553Spatrick { 1197*46035553Spatrick const size_t __idx = tuple_size<_Tp>::value - _Ip; 1198*46035553Spatrick if (_VSTD::get<__idx>(__x) < _VSTD::get<__idx>(__y)) 1199*46035553Spatrick return true; 1200*46035553Spatrick if (_VSTD::get<__idx>(__y) < _VSTD::get<__idx>(__x)) 1201*46035553Spatrick return false; 1202*46035553Spatrick return __tuple_less<_Ip-1>()(__x, __y); 1203*46035553Spatrick } 1204*46035553Spatrick}; 1205*46035553Spatrick 1206*46035553Spatricktemplate <> 1207*46035553Spatrickstruct __tuple_less<0> 1208*46035553Spatrick{ 1209*46035553Spatrick template <class _Tp, class _Up> 1210*46035553Spatrick _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1211*46035553Spatrick bool operator()(const _Tp&, const _Up&) 1212*46035553Spatrick { 1213*46035553Spatrick return false; 1214*46035553Spatrick } 1215*46035553Spatrick}; 1216*46035553Spatrick 1217*46035553Spatricktemplate <class ..._Tp, class ..._Up> 1218*46035553Spatrickinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1219*46035553Spatrickbool 1220*46035553Spatrickoperator<(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) 1221*46035553Spatrick{ 1222*46035553Spatrick static_assert (sizeof...(_Tp) == sizeof...(_Up), "Can't compare tuples of different sizes"); 1223*46035553Spatrick return __tuple_less<sizeof...(_Tp)>()(__x, __y); 1224*46035553Spatrick} 1225*46035553Spatrick 1226*46035553Spatricktemplate <class ..._Tp, class ..._Up> 1227*46035553Spatrickinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1228*46035553Spatrickbool 1229*46035553Spatrickoperator>(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) 1230*46035553Spatrick{ 1231*46035553Spatrick return __y < __x; 1232*46035553Spatrick} 1233*46035553Spatrick 1234*46035553Spatricktemplate <class ..._Tp, class ..._Up> 1235*46035553Spatrickinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1236*46035553Spatrickbool 1237*46035553Spatrickoperator>=(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) 1238*46035553Spatrick{ 1239*46035553Spatrick return !(__x < __y); 1240*46035553Spatrick} 1241*46035553Spatrick 1242*46035553Spatricktemplate <class ..._Tp, class ..._Up> 1243*46035553Spatrickinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1244*46035553Spatrickbool 1245*46035553Spatrickoperator<=(const tuple<_Tp...>& __x, const tuple<_Up...>& __y) 1246*46035553Spatrick{ 1247*46035553Spatrick return !(__y < __x); 1248*46035553Spatrick} 1249*46035553Spatrick 1250*46035553Spatrick// tuple_cat 1251*46035553Spatrick 1252*46035553Spatricktemplate <class _Tp, class _Up> struct __tuple_cat_type; 1253*46035553Spatrick 1254*46035553Spatricktemplate <class ..._Ttypes, class ..._Utypes> 1255*46035553Spatrickstruct __tuple_cat_type<tuple<_Ttypes...>, __tuple_types<_Utypes...> > 1256*46035553Spatrick{ 1257*46035553Spatrick typedef _LIBCPP_NODEBUG_TYPE tuple<_Ttypes..., _Utypes...> type; 1258*46035553Spatrick}; 1259*46035553Spatrick 1260*46035553Spatricktemplate <class _ResultTuple, bool _Is_Tuple0TupleLike, class ..._Tuples> 1261*46035553Spatrickstruct __tuple_cat_return_1 1262*46035553Spatrick{ 1263*46035553Spatrick}; 1264*46035553Spatrick 1265*46035553Spatricktemplate <class ..._Types, class _Tuple0> 1266*46035553Spatrickstruct __tuple_cat_return_1<tuple<_Types...>, true, _Tuple0> 1267*46035553Spatrick{ 1268*46035553Spatrick typedef _LIBCPP_NODEBUG_TYPE typename __tuple_cat_type<tuple<_Types...>, 1269*46035553Spatrick typename __make_tuple_types<typename __uncvref<_Tuple0>::type>::type>::type 1270*46035553Spatrick type; 1271*46035553Spatrick}; 1272*46035553Spatrick 1273*46035553Spatricktemplate <class ..._Types, class _Tuple0, class _Tuple1, class ..._Tuples> 1274*46035553Spatrickstruct __tuple_cat_return_1<tuple<_Types...>, true, _Tuple0, _Tuple1, _Tuples...> 1275*46035553Spatrick : public __tuple_cat_return_1< 1276*46035553Spatrick typename __tuple_cat_type< 1277*46035553Spatrick tuple<_Types...>, 1278*46035553Spatrick typename __make_tuple_types<typename __uncvref<_Tuple0>::type>::type 1279*46035553Spatrick >::type, 1280*46035553Spatrick __tuple_like<typename remove_reference<_Tuple1>::type>::value, 1281*46035553Spatrick _Tuple1, _Tuples...> 1282*46035553Spatrick{ 1283*46035553Spatrick}; 1284*46035553Spatrick 1285*46035553Spatricktemplate <class ..._Tuples> struct __tuple_cat_return; 1286*46035553Spatrick 1287*46035553Spatricktemplate <class _Tuple0, class ..._Tuples> 1288*46035553Spatrickstruct __tuple_cat_return<_Tuple0, _Tuples...> 1289*46035553Spatrick : public __tuple_cat_return_1<tuple<>, 1290*46035553Spatrick __tuple_like<typename remove_reference<_Tuple0>::type>::value, _Tuple0, 1291*46035553Spatrick _Tuples...> 1292*46035553Spatrick{ 1293*46035553Spatrick}; 1294*46035553Spatrick 1295*46035553Spatricktemplate <> 1296*46035553Spatrickstruct __tuple_cat_return<> 1297*46035553Spatrick{ 1298*46035553Spatrick typedef _LIBCPP_NODEBUG_TYPE tuple<> type; 1299*46035553Spatrick}; 1300*46035553Spatrick 1301*46035553Spatrickinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1302*46035553Spatricktuple<> 1303*46035553Spatricktuple_cat() 1304*46035553Spatrick{ 1305*46035553Spatrick return tuple<>(); 1306*46035553Spatrick} 1307*46035553Spatrick 1308*46035553Spatricktemplate <class _Rp, class _Indices, class _Tuple0, class ..._Tuples> 1309*46035553Spatrickstruct __tuple_cat_return_ref_imp; 1310*46035553Spatrick 1311*46035553Spatricktemplate <class ..._Types, size_t ..._I0, class _Tuple0> 1312*46035553Spatrickstruct __tuple_cat_return_ref_imp<tuple<_Types...>, __tuple_indices<_I0...>, _Tuple0> 1313*46035553Spatrick{ 1314*46035553Spatrick typedef _LIBCPP_NODEBUG_TYPE typename remove_reference<_Tuple0>::type _T0; 1315*46035553Spatrick typedef tuple<_Types..., typename __apply_cv<_Tuple0, 1316*46035553Spatrick typename tuple_element<_I0, _T0>::type>::type&&...> type; 1317*46035553Spatrick}; 1318*46035553Spatrick 1319*46035553Spatricktemplate <class ..._Types, size_t ..._I0, class _Tuple0, class _Tuple1, class ..._Tuples> 1320*46035553Spatrickstruct __tuple_cat_return_ref_imp<tuple<_Types...>, __tuple_indices<_I0...>, 1321*46035553Spatrick _Tuple0, _Tuple1, _Tuples...> 1322*46035553Spatrick : public __tuple_cat_return_ref_imp< 1323*46035553Spatrick tuple<_Types..., typename __apply_cv<_Tuple0, 1324*46035553Spatrick typename tuple_element<_I0, 1325*46035553Spatrick typename remove_reference<_Tuple0>::type>::type>::type&&...>, 1326*46035553Spatrick typename __make_tuple_indices<tuple_size<typename 1327*46035553Spatrick remove_reference<_Tuple1>::type>::value>::type, 1328*46035553Spatrick _Tuple1, _Tuples...> 1329*46035553Spatrick{ 1330*46035553Spatrick}; 1331*46035553Spatrick 1332*46035553Spatricktemplate <class _Tuple0, class ..._Tuples> 1333*46035553Spatrickstruct __tuple_cat_return_ref 1334*46035553Spatrick : public __tuple_cat_return_ref_imp<tuple<>, 1335*46035553Spatrick typename __make_tuple_indices< 1336*46035553Spatrick tuple_size<typename remove_reference<_Tuple0>::type>::value 1337*46035553Spatrick >::type, _Tuple0, _Tuples...> 1338*46035553Spatrick{ 1339*46035553Spatrick}; 1340*46035553Spatrick 1341*46035553Spatricktemplate <class _Types, class _I0, class _J0> 1342*46035553Spatrickstruct __tuple_cat; 1343*46035553Spatrick 1344*46035553Spatricktemplate <class ..._Types, size_t ..._I0, size_t ..._J0> 1345*46035553Spatrickstruct __tuple_cat<tuple<_Types...>, __tuple_indices<_I0...>, __tuple_indices<_J0...> > 1346*46035553Spatrick{ 1347*46035553Spatrick template <class _Tuple0> 1348*46035553Spatrick _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1349*46035553Spatrick typename __tuple_cat_return_ref<tuple<_Types...>&&, _Tuple0&&>::type 1350*46035553Spatrick operator()(tuple<_Types...> __t, _Tuple0&& __t0) 1351*46035553Spatrick { 1352*46035553Spatrick return _VSTD::forward_as_tuple( 1353*46035553Spatrick _VSTD::forward<_Types>(_VSTD::get<_I0>(__t))..., 1354*46035553Spatrick _VSTD::get<_J0>(_VSTD::forward<_Tuple0>(__t0))...); 1355*46035553Spatrick } 1356*46035553Spatrick 1357*46035553Spatrick template <class _Tuple0, class _Tuple1, class ..._Tuples> 1358*46035553Spatrick _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1359*46035553Spatrick typename __tuple_cat_return_ref<tuple<_Types...>&&, _Tuple0&&, _Tuple1&&, _Tuples&&...>::type 1360*46035553Spatrick operator()(tuple<_Types...> __t, _Tuple0&& __t0, _Tuple1&& __t1, _Tuples&& ...__tpls) 1361*46035553Spatrick { 1362*46035553Spatrick typedef _LIBCPP_NODEBUG_TYPE typename remove_reference<_Tuple0>::type _T0; 1363*46035553Spatrick typedef _LIBCPP_NODEBUG_TYPE typename remove_reference<_Tuple1>::type _T1; 1364*46035553Spatrick return __tuple_cat< 1365*46035553Spatrick tuple<_Types..., 1366*46035553Spatrick typename __apply_cv<_Tuple0, typename tuple_element< 1367*46035553Spatrick _J0, _T0>::type>::type&&...>, 1368*46035553Spatrick typename __make_tuple_indices<sizeof...(_Types) + 1369*46035553Spatrick tuple_size<_T0>::value>::type, 1370*46035553Spatrick typename __make_tuple_indices<tuple_size<_T1>::value>::type>()( 1371*46035553Spatrick _VSTD::forward_as_tuple( 1372*46035553Spatrick _VSTD::forward<_Types>(_VSTD::get<_I0>(__t))..., 1373*46035553Spatrick _VSTD::get<_J0>(_VSTD::forward<_Tuple0>(__t0))...), 1374*46035553Spatrick _VSTD::forward<_Tuple1>(__t1), _VSTD::forward<_Tuples>(__tpls)...); 1375*46035553Spatrick } 1376*46035553Spatrick}; 1377*46035553Spatrick 1378*46035553Spatricktemplate <class _Tuple0, class... _Tuples> 1379*46035553Spatrickinline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1380*46035553Spatricktypename __tuple_cat_return<_Tuple0, _Tuples...>::type 1381*46035553Spatricktuple_cat(_Tuple0&& __t0, _Tuples&&... __tpls) 1382*46035553Spatrick{ 1383*46035553Spatrick typedef _LIBCPP_NODEBUG_TYPE typename remove_reference<_Tuple0>::type _T0; 1384*46035553Spatrick return __tuple_cat<tuple<>, __tuple_indices<>, 1385*46035553Spatrick typename __make_tuple_indices<tuple_size<_T0>::value>::type>() 1386*46035553Spatrick (tuple<>(), _VSTD::forward<_Tuple0>(__t0), 1387*46035553Spatrick _VSTD::forward<_Tuples>(__tpls)...); 1388*46035553Spatrick} 1389*46035553Spatrick 1390*46035553Spatricktemplate <class ..._Tp, class _Alloc> 1391*46035553Spatrickstruct _LIBCPP_TEMPLATE_VIS uses_allocator<tuple<_Tp...>, _Alloc> 1392*46035553Spatrick : true_type {}; 1393*46035553Spatrick 1394*46035553Spatricktemplate <class _T1, class _T2> 1395*46035553Spatricktemplate <class... _Args1, class... _Args2, size_t ..._I1, size_t ..._I2> 1396*46035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 1397*46035553Spatrickpair<_T1, _T2>::pair(piecewise_construct_t, 1398*46035553Spatrick tuple<_Args1...>& __first_args, tuple<_Args2...>& __second_args, 1399*46035553Spatrick __tuple_indices<_I1...>, __tuple_indices<_I2...>) 1400*46035553Spatrick : first(_VSTD::forward<_Args1>(_VSTD::get<_I1>( __first_args))...), 1401*46035553Spatrick second(_VSTD::forward<_Args2>(_VSTD::get<_I2>(__second_args))...) 1402*46035553Spatrick{ 1403*46035553Spatrick} 1404*46035553Spatrick 1405*46035553Spatrick#if _LIBCPP_STD_VER > 14 1406*46035553Spatricktemplate <class _Tp> 1407*46035553Spatrick_LIBCPP_INLINE_VAR constexpr size_t tuple_size_v = tuple_size<_Tp>::value; 1408*46035553Spatrick 1409*46035553Spatrick#define _LIBCPP_NOEXCEPT_RETURN(...) noexcept(noexcept(__VA_ARGS__)) { return __VA_ARGS__; } 1410*46035553Spatrick 1411*46035553Spatricktemplate <class _Fn, class _Tuple, size_t ..._Id> 1412*46035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 1413*46035553Spatrickconstexpr decltype(auto) __apply_tuple_impl(_Fn && __f, _Tuple && __t, 1414*46035553Spatrick __tuple_indices<_Id...>) 1415*46035553Spatrick_LIBCPP_NOEXCEPT_RETURN( 1416*46035553Spatrick _VSTD::__invoke_constexpr( 1417*46035553Spatrick _VSTD::forward<_Fn>(__f), 1418*46035553Spatrick _VSTD::get<_Id>(_VSTD::forward<_Tuple>(__t))...) 1419*46035553Spatrick) 1420*46035553Spatrick 1421*46035553Spatricktemplate <class _Fn, class _Tuple> 1422*46035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 1423*46035553Spatrickconstexpr decltype(auto) apply(_Fn && __f, _Tuple && __t) 1424*46035553Spatrick_LIBCPP_NOEXCEPT_RETURN( 1425*46035553Spatrick _VSTD::__apply_tuple_impl( 1426*46035553Spatrick _VSTD::forward<_Fn>(__f), _VSTD::forward<_Tuple>(__t), 1427*46035553Spatrick typename __make_tuple_indices<tuple_size_v<remove_reference_t<_Tuple>>>::type{}) 1428*46035553Spatrick) 1429*46035553Spatrick 1430*46035553Spatricktemplate <class _Tp, class _Tuple, size_t... _Idx> 1431*46035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 1432*46035553Spatrickconstexpr _Tp __make_from_tuple_impl(_Tuple&& __t, __tuple_indices<_Idx...>) 1433*46035553Spatrick_LIBCPP_NOEXCEPT_RETURN( 1434*46035553Spatrick _Tp(_VSTD::get<_Idx>(_VSTD::forward<_Tuple>(__t))...) 1435*46035553Spatrick) 1436*46035553Spatrick 1437*46035553Spatricktemplate <class _Tp, class _Tuple> 1438*46035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 1439*46035553Spatrickconstexpr _Tp make_from_tuple(_Tuple&& __t) 1440*46035553Spatrick_LIBCPP_NOEXCEPT_RETURN( 1441*46035553Spatrick _VSTD::__make_from_tuple_impl<_Tp>(_VSTD::forward<_Tuple>(__t), 1442*46035553Spatrick typename __make_tuple_indices<tuple_size_v<remove_reference_t<_Tuple>>>::type{}) 1443*46035553Spatrick) 1444*46035553Spatrick 1445*46035553Spatrick#undef _LIBCPP_NOEXCEPT_RETURN 1446*46035553Spatrick 1447*46035553Spatrick#endif // _LIBCPP_STD_VER > 14 1448*46035553Spatrick 1449*46035553Spatrick#endif // !defined(_LIBCPP_CXX03_LANG) 1450*46035553Spatrick 1451*46035553Spatrick_LIBCPP_END_NAMESPACE_STD 1452*46035553Spatrick 1453*46035553Spatrick#endif // _LIBCPP_TUPLE 1454