⚝
One Hat Cyber Team
⚝
Your IP:
216.73.216.96
Server IP:
147.93.97.220
Server:
Linux srv843233 6.8.0-71-generic #71-Ubuntu SMP PREEMPT_DYNAMIC Tue Jul 22 16:52:38 UTC 2025 x86_64
Server Software:
nginx/1.28.0
PHP Version:
8.2.29
Buat File
|
Buat Folder
Eksekusi
Dir :
~
/
usr
/
include
/
c++
/
13
/
Edit File: tuple
//
-*- C++ -*- // Copyright (C) 2007-2023 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the // terms of the GNU General Public License as published by the // Free Software Foundation; either version 3, or (at your option) // any later version. // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // Under Section 7 of GPL version 3, you are granted additional // permissions described in the GCC Runtime Library Exception, version // 3.1, as published by the Free Software Foundation. // You should have received a copy of the GNU General Public License and // a copy of the GCC Runtime Library Exception along with this program; // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see //
. /** @file include/tuple * This is a Standard C++ Library header. */ #ifndef _GLIBCXX_TUPLE #define _GLIBCXX_TUPLE 1 #pragma GCC system_header #if __cplusplus < 201103L # include
#else #include
// for std::pair #include
// for std::allocator_arg_t #include
// for std::tuple_size etc. #include
// for std::__invoke #if __cplusplus > 201703L # include
# include
// for std::ranges::subrange # define __cpp_lib_constexpr_tuple 201811L #endif namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION /** * @addtogroup utilities * @{ */ template
class tuple; template
struct __is_empty_non_tuple : is_empty<_Tp> { }; // Using EBO for elements that are tuples causes ambiguous base errors. template
struct __is_empty_non_tuple
> : false_type { }; // Use the Empty Base-class Optimization for empty, non-final types. template
using __empty_not_final = __conditional_t<__is_final(_Tp), false_type, __is_empty_non_tuple<_Tp>>; template
::value> struct _Head_base; #if __has_cpp_attribute(__no_unique_address__) template
struct _Head_base<_Idx, _Head, true> { constexpr _Head_base() : _M_head_impl() { } constexpr _Head_base(const _Head& __h) : _M_head_impl(__h) { } constexpr _Head_base(const _Head_base&) = default; constexpr _Head_base(_Head_base&&) = default; template
constexpr _Head_base(_UHead&& __h) : _M_head_impl(std::forward<_UHead>(__h)) { } _GLIBCXX20_CONSTEXPR _Head_base(allocator_arg_t, __uses_alloc0) : _M_head_impl() { } template
_GLIBCXX20_CONSTEXPR _Head_base(allocator_arg_t, __uses_alloc1<_Alloc> __a) : _M_head_impl(allocator_arg, *__a._M_a) { } template
_GLIBCXX20_CONSTEXPR _Head_base(allocator_arg_t, __uses_alloc2<_Alloc> __a) : _M_head_impl(*__a._M_a) { } template
_GLIBCXX20_CONSTEXPR _Head_base(__uses_alloc0, _UHead&& __uhead) : _M_head_impl(std::forward<_UHead>(__uhead)) { } template
_GLIBCXX20_CONSTEXPR _Head_base(__uses_alloc1<_Alloc> __a, _UHead&& __uhead) : _M_head_impl(allocator_arg, *__a._M_a, std::forward<_UHead>(__uhead)) { } template
_GLIBCXX20_CONSTEXPR _Head_base(__uses_alloc2<_Alloc> __a, _UHead&& __uhead) : _M_head_impl(std::forward<_UHead>(__uhead), *__a._M_a) { } static constexpr _Head& _M_head(_Head_base& __b) noexcept { return __b._M_head_impl; } static constexpr const _Head& _M_head(const _Head_base& __b) noexcept { return __b._M_head_impl; } [[__no_unique_address__]] _Head _M_head_impl; }; #else template
struct _Head_base<_Idx, _Head, true> : public _Head { constexpr _Head_base() : _Head() { } constexpr _Head_base(const _Head& __h) : _Head(__h) { } constexpr _Head_base(const _Head_base&) = default; constexpr _Head_base(_Head_base&&) = default; template
constexpr _Head_base(_UHead&& __h) : _Head(std::forward<_UHead>(__h)) { } _GLIBCXX20_CONSTEXPR _Head_base(allocator_arg_t, __uses_alloc0) : _Head() { } template
_GLIBCXX20_CONSTEXPR _Head_base(allocator_arg_t, __uses_alloc1<_Alloc> __a) : _Head(allocator_arg, *__a._M_a) { } template
_GLIBCXX20_CONSTEXPR _Head_base(allocator_arg_t, __uses_alloc2<_Alloc> __a) : _Head(*__a._M_a) { } template
_GLIBCXX20_CONSTEXPR _Head_base(__uses_alloc0, _UHead&& __uhead) : _Head(std::forward<_UHead>(__uhead)) { } template
_GLIBCXX20_CONSTEXPR _Head_base(__uses_alloc1<_Alloc> __a, _UHead&& __uhead) : _Head(allocator_arg, *__a._M_a, std::forward<_UHead>(__uhead)) { } template
_GLIBCXX20_CONSTEXPR _Head_base(__uses_alloc2<_Alloc> __a, _UHead&& __uhead) : _Head(std::forward<_UHead>(__uhead), *__a._M_a) { } static constexpr _Head& _M_head(_Head_base& __b) noexcept { return __b; } static constexpr const _Head& _M_head(const _Head_base& __b) noexcept { return __b; } }; #endif template
struct _Head_base<_Idx, _Head, false> { constexpr _Head_base() : _M_head_impl() { } constexpr _Head_base(const _Head& __h) : _M_head_impl(__h) { } constexpr _Head_base(const _Head_base&) = default; constexpr _Head_base(_Head_base&&) = default; template
constexpr _Head_base(_UHead&& __h) : _M_head_impl(std::forward<_UHead>(__h)) { } _GLIBCXX20_CONSTEXPR _Head_base(allocator_arg_t, __uses_alloc0) : _M_head_impl() { } template
_GLIBCXX20_CONSTEXPR _Head_base(allocator_arg_t, __uses_alloc1<_Alloc> __a) : _M_head_impl(allocator_arg, *__a._M_a) { } template
_GLIBCXX20_CONSTEXPR _Head_base(allocator_arg_t, __uses_alloc2<_Alloc> __a) : _M_head_impl(*__a._M_a) { } template
_GLIBCXX20_CONSTEXPR _Head_base(__uses_alloc0, _UHead&& __uhead) : _M_head_impl(std::forward<_UHead>(__uhead)) { } template
_GLIBCXX20_CONSTEXPR _Head_base(__uses_alloc1<_Alloc> __a, _UHead&& __uhead) : _M_head_impl(allocator_arg, *__a._M_a, std::forward<_UHead>(__uhead)) { } template
_GLIBCXX20_CONSTEXPR _Head_base(__uses_alloc2<_Alloc> __a, _UHead&& __uhead) : _M_head_impl(std::forward<_UHead>(__uhead), *__a._M_a) { } static constexpr _Head& _M_head(_Head_base& __b) noexcept { return __b._M_head_impl; } static constexpr const _Head& _M_head(const _Head_base& __b) noexcept { return __b._M_head_impl; } _Head _M_head_impl; }; /** * Contains the actual implementation of the @c tuple template, stored * as a recursive inheritance hierarchy from the first element (most * derived class) to the last (least derived class). The @c Idx * parameter gives the 0-based index of the element stored at this * point in the hierarchy; we use it to implement a constant-time * get() operation. */ template
struct _Tuple_impl; /** * Recursive tuple implementation. Here we store the @c Head element * and derive from a @c Tuple_impl containing the remaining elements * (which contains the @c Tail). */ template
struct _Tuple_impl<_Idx, _Head, _Tail...> : public _Tuple_impl<_Idx + 1, _Tail...>, private _Head_base<_Idx, _Head> { template
friend struct _Tuple_impl; typedef _Tuple_impl<_Idx + 1, _Tail...> _Inherited; typedef _Head_base<_Idx, _Head> _Base; static constexpr _Head& _M_head(_Tuple_impl& __t) noexcept { return _Base::_M_head(__t); } static constexpr const _Head& _M_head(const _Tuple_impl& __t) noexcept { return _Base::_M_head(__t); } static constexpr _Inherited& _M_tail(_Tuple_impl& __t) noexcept { return __t; } static constexpr const _Inherited& _M_tail(const _Tuple_impl& __t) noexcept { return __t; } constexpr _Tuple_impl() : _Inherited(), _Base() { } explicit constexpr _Tuple_impl(const _Head& __head, const _Tail&... __tail) : _Inherited(__tail...), _Base(__head) { } template
> explicit constexpr _Tuple_impl(_UHead&& __head, _UTail&&... __tail) : _Inherited(std::forward<_UTail>(__tail)...), _Base(std::forward<_UHead>(__head)) { } constexpr _Tuple_impl(const _Tuple_impl&) = default; // _GLIBCXX_RESOLVE_LIB_DEFECTS // 2729. Missing SFINAE on std::pair::operator= _Tuple_impl& operator=(const _Tuple_impl&) = delete; _Tuple_impl(_Tuple_impl&&) = default; template
constexpr _Tuple_impl(const _Tuple_impl<_Idx, _UElements...>& __in) : _Inherited(_Tuple_impl<_Idx, _UElements...>::_M_tail(__in)), _Base(_Tuple_impl<_Idx, _UElements...>::_M_head(__in)) { } template
constexpr _Tuple_impl(_Tuple_impl<_Idx, _UHead, _UTails...>&& __in) : _Inherited(std::move (_Tuple_impl<_Idx, _UHead, _UTails...>::_M_tail(__in))), _Base(std::forward<_UHead> (_Tuple_impl<_Idx, _UHead, _UTails...>::_M_head(__in))) { } #if __cplusplus > 202002L template
constexpr _Tuple_impl(_Tuple_impl<_Idx, _UElements...>& __in) : _Inherited(_Tuple_impl<_Idx, _UElements...>::_M_tail(__in)), _Base(_Tuple_impl<_Idx, _UElements...>::_M_head(__in)) { } template
constexpr _Tuple_impl(const _Tuple_impl<_Idx, _UHead, _UTails...>&& __in) : _Inherited(std::move (_Tuple_impl<_Idx, _UHead, _UTails...>::_M_tail(__in))), _Base(std::forward
(_Tuple_impl<_Idx, _UHead, _UTails...>::_M_head(__in))) { } #endif // C++23 template
_GLIBCXX20_CONSTEXPR _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a) : _Inherited(__tag, __a), _Base(__tag, __use_alloc<_Head>(__a)) { } template
_GLIBCXX20_CONSTEXPR _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a, const _Head& __head, const _Tail&... __tail) : _Inherited(__tag, __a, __tail...), _Base(__use_alloc<_Head, _Alloc, _Head>(__a), __head) { } template
> _GLIBCXX20_CONSTEXPR _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a, _UHead&& __head, _UTail&&... __tail) : _Inherited(__tag, __a, std::forward<_UTail>(__tail)...), _Base(__use_alloc<_Head, _Alloc, _UHead>(__a), std::forward<_UHead>(__head)) { } template
_GLIBCXX20_CONSTEXPR _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a, const _Tuple_impl& __in) : _Inherited(__tag, __a, _M_tail(__in)), _Base(__use_alloc<_Head, _Alloc, _Head>(__a), _M_head(__in)) { } template
_GLIBCXX20_CONSTEXPR _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a, _Tuple_impl&& __in) : _Inherited(__tag, __a, std::move(_M_tail(__in))), _Base(__use_alloc<_Head, _Alloc, _Head>(__a), std::forward<_Head>(_M_head(__in))) { } template
_GLIBCXX20_CONSTEXPR _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a, const _Tuple_impl<_Idx, _UHead, _UTails...>& __in) : _Inherited(__tag, __a, _Tuple_impl<_Idx, _UHead, _UTails...>::_M_tail(__in)), _Base(__use_alloc<_Head, _Alloc, const _UHead&>(__a), _Tuple_impl<_Idx, _UHead, _UTails...>::_M_head(__in)) { } template
_GLIBCXX20_CONSTEXPR _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a, _Tuple_impl<_Idx, _UHead, _UTails...>&& __in) : _Inherited(__tag, __a, std::move (_Tuple_impl<_Idx, _UHead, _UTails...>::_M_tail(__in))), _Base(__use_alloc<_Head, _Alloc, _UHead>(__a), std::forward<_UHead> (_Tuple_impl<_Idx, _UHead, _UTails...>::_M_head(__in))) { } #if __cplusplus > 202002L template
constexpr _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a, _Tuple_impl<_Idx, _UHead, _UTails...>& __in) : _Inherited(__tag, __a, _Tuple_impl<_Idx, _UHead, _UTails...>::_M_tail(__in)), _Base(__use_alloc<_Head, _Alloc, _UHead&>(__a), _Tuple_impl<_Idx, _UHead, _UTails...>::_M_head(__in)) { } template
constexpr _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a, const _Tuple_impl<_Idx, _UHead, _UTails...>&& __in) : _Inherited(__tag, __a, std::move (_Tuple_impl<_Idx, _UHead, _UTails...>::_M_tail(__in))), _Base(__use_alloc<_Head, _Alloc, const _UHead>(__a), std::forward
(_Tuple_impl<_Idx, _UHead, _UTails...>::_M_head(__in))) { } #endif // C++23 template
_GLIBCXX20_CONSTEXPR void _M_assign(const _Tuple_impl<_Idx, _UElements...>& __in) { _M_head(*this) = _Tuple_impl<_Idx, _UElements...>::_M_head(__in); _M_tail(*this)._M_assign( _Tuple_impl<_Idx, _UElements...>::_M_tail(__in)); } template
_GLIBCXX20_CONSTEXPR void _M_assign(_Tuple_impl<_Idx, _UHead, _UTails...>&& __in) { _M_head(*this) = std::forward<_UHead> (_Tuple_impl<_Idx, _UHead, _UTails...>::_M_head(__in)); _M_tail(*this)._M_assign( std::move(_Tuple_impl<_Idx, _UHead, _UTails...>::_M_tail(__in))); } #if __cplusplus > 202002L template
constexpr void _M_assign(const _Tuple_impl<_Idx, _UElements...>& __in) const { _M_head(*this) = _Tuple_impl<_Idx, _UElements...>::_M_head(__in); _M_tail(*this)._M_assign( _Tuple_impl<_Idx, _UElements...>::_M_tail(__in)); } template
constexpr void _M_assign(_Tuple_impl<_Idx, _UHead, _UTails...>&& __in) const { _M_head(*this) = std::forward<_UHead> (_Tuple_impl<_Idx, _UHead, _UTails...>::_M_head(__in)); _M_tail(*this)._M_assign( std::move(_Tuple_impl<_Idx, _UHead, _UTails...>::_M_tail(__in))); } #endif // C++23 protected: _GLIBCXX20_CONSTEXPR void _M_swap(_Tuple_impl& __in) { using std::swap; swap(_M_head(*this), _M_head(__in)); _Inherited::_M_swap(_M_tail(__in)); } #if __cplusplus > 202002L constexpr void _M_swap(const _Tuple_impl& __in) const { using std::swap; swap(_M_head(*this), _M_head(__in)); _Inherited::_M_swap(_M_tail(__in)); } #endif // C++23 }; // Basis case of inheritance recursion. template
struct _Tuple_impl<_Idx, _Head> : private _Head_base<_Idx, _Head> { template
friend struct _Tuple_impl; typedef _Head_base<_Idx, _Head> _Base; static constexpr _Head& _M_head(_Tuple_impl& __t) noexcept { return _Base::_M_head(__t); } static constexpr const _Head& _M_head(const _Tuple_impl& __t) noexcept { return _Base::_M_head(__t); } constexpr _Tuple_impl() : _Base() { } explicit constexpr _Tuple_impl(const _Head& __head) : _Base(__head) { } template
explicit constexpr _Tuple_impl(_UHead&& __head) : _Base(std::forward<_UHead>(__head)) { } constexpr _Tuple_impl(const _Tuple_impl&) = default; // _GLIBCXX_RESOLVE_LIB_DEFECTS // 2729. Missing SFINAE on std::pair::operator= _Tuple_impl& operator=(const _Tuple_impl&) = delete; #if _GLIBCXX_INLINE_VERSION _Tuple_impl(_Tuple_impl&&) = default; #else constexpr _Tuple_impl(_Tuple_impl&& __in) noexcept(is_nothrow_move_constructible<_Head>::value) : _Base(static_cast<_Base&&>(__in)) { } #endif template
constexpr _Tuple_impl(const _Tuple_impl<_Idx, _UHead>& __in) : _Base(_Tuple_impl<_Idx, _UHead>::_M_head(__in)) { } template
constexpr _Tuple_impl(_Tuple_impl<_Idx, _UHead>&& __in) : _Base(std::forward<_UHead>(_Tuple_impl<_Idx, _UHead>::_M_head(__in))) { } #if __cplusplus > 202002L template
constexpr _Tuple_impl(_Tuple_impl<_Idx, _UHead>& __in) : _Base(_Tuple_impl<_Idx, _UHead>::_M_head(__in)) { } template
constexpr _Tuple_impl(const _Tuple_impl<_Idx, _UHead>&& __in) : _Base(std::forward
(_Tuple_impl<_Idx, _UHead>::_M_head(__in))) { } #endif // C++23 template
_GLIBCXX20_CONSTEXPR _Tuple_impl(allocator_arg_t __tag, const _Alloc& __a) : _Base(__tag, __use_alloc<_Head>(__a)) { } template
_GLIBCXX20_CONSTEXPR _Tuple_impl(allocator_arg_t, const _Alloc& __a, const _Head& __head) : _Base(__use_alloc<_Head, _Alloc, const _Head&>(__a), __head) { } template
_GLIBCXX20_CONSTEXPR _Tuple_impl(allocator_arg_t, const _Alloc& __a, _UHead&& __head) : _Base(__use_alloc<_Head, _Alloc, _UHead>(__a), std::forward<_UHead>(__head)) { } template
_GLIBCXX20_CONSTEXPR _Tuple_impl(allocator_arg_t, const _Alloc& __a, const _Tuple_impl& __in) : _Base(__use_alloc<_Head, _Alloc, const _Head&>(__a), _M_head(__in)) { } template
_GLIBCXX20_CONSTEXPR _Tuple_impl(allocator_arg_t, const _Alloc& __a, _Tuple_impl&& __in) : _Base(__use_alloc<_Head, _Alloc, _Head>(__a), std::forward<_Head>(_M_head(__in))) { } template
_GLIBCXX20_CONSTEXPR _Tuple_impl(allocator_arg_t, const _Alloc& __a, const _Tuple_impl<_Idx, _UHead>& __in) : _Base(__use_alloc<_Head, _Alloc, const _UHead&>(__a), _Tuple_impl<_Idx, _UHead>::_M_head(__in)) { } template
_GLIBCXX20_CONSTEXPR _Tuple_impl(allocator_arg_t, const _Alloc& __a, _Tuple_impl<_Idx, _UHead>&& __in) : _Base(__use_alloc<_Head, _Alloc, _UHead>(__a), std::forward<_UHead>(_Tuple_impl<_Idx, _UHead>::_M_head(__in))) { } #if __cplusplus > 202002L template
constexpr _Tuple_impl(allocator_arg_t, const _Alloc& __a, _Tuple_impl<_Idx, _UHead>& __in) : _Base(__use_alloc<_Head, _Alloc, _UHead&>(__a), _Tuple_impl<_Idx, _UHead>::_M_head(__in)) { } template
constexpr _Tuple_impl(allocator_arg_t, const _Alloc& __a, const _Tuple_impl<_Idx, _UHead>&& __in) : _Base(__use_alloc<_Head, _Alloc, const _UHead>(__a), std::forward
(_Tuple_impl<_Idx, _UHead>::_M_head(__in))) { } #endif // C++23 template
_GLIBCXX20_CONSTEXPR void _M_assign(const _Tuple_impl<_Idx, _UHead>& __in) { _M_head(*this) = _Tuple_impl<_Idx, _UHead>::_M_head(__in); } template
_GLIBCXX20_CONSTEXPR void _M_assign(_Tuple_impl<_Idx, _UHead>&& __in) { _M_head(*this) = std::forward<_UHead>(_Tuple_impl<_Idx, _UHead>::_M_head(__in)); } #if __cplusplus > 202002L template
constexpr void _M_assign(const _Tuple_impl<_Idx, _UHead>& __in) const { _M_head(*this) = _Tuple_impl<_Idx, _UHead>::_M_head(__in); } template
constexpr void _M_assign(_Tuple_impl<_Idx, _UHead>&& __in) const { _M_head(*this) = std::forward<_UHead>(_Tuple_impl<_Idx, _UHead>::_M_head(__in)); } #endif // C++23 protected: _GLIBCXX20_CONSTEXPR void _M_swap(_Tuple_impl& __in) { using std::swap; swap(_M_head(*this), _M_head(__in)); } #if __cplusplus > 202002L constexpr void _M_swap(const _Tuple_impl& __in) const { using std::swap; swap(_M_head(*this), _M_head(__in)); } #endif // C++23 }; // Concept utility functions, reused in conditionally-explicit // constructors. template
struct _TupleConstraints { template
using __constructible = __and_
...>; template
using __convertible = __and_
...>; // Constraint for a non-explicit constructor. // True iff each Ti in _Types... can be constructed from Ui in _UTypes... // and every Ui is implicitly convertible to Ti. template
static constexpr bool __is_implicitly_constructible() { return __and_<__constructible<_UTypes...>, __convertible<_UTypes...> >::value; } // Constraint for a non-explicit constructor. // True iff each Ti in _Types... can be constructed from Ui in _UTypes... // but not every Ui is implicitly convertible to Ti. template
static constexpr bool __is_explicitly_constructible() { return __and_<__constructible<_UTypes...>, __not_<__convertible<_UTypes...>> >::value; } static constexpr bool __is_implicitly_default_constructible() { return __and_
... >::value; } static constexpr bool __is_explicitly_default_constructible() { return __and_
..., __not_<__and_< std::__is_implicitly_default_constructible<_Types>...> >>::value; } }; // Partial specialization used when a required precondition isn't met, // e.g. when sizeof...(_Types) != sizeof...(_UTypes). template
struct _TupleConstraints
{ template
static constexpr bool __is_implicitly_constructible() { return false; } template
static constexpr bool __is_explicitly_constructible() { return false; } }; /// Primary class template, tuple template
class tuple : public _Tuple_impl<0, _Elements...> { typedef _Tuple_impl<0, _Elements...> _Inherited; template
using _TCC = _TupleConstraints<_Cond, _Elements...>; // Constraint for non-explicit default constructor template
using _ImplicitDefaultCtor = __enable_if_t< _TCC<_Dummy>::__is_implicitly_default_constructible(), bool>; // Constraint for explicit default constructor template
using _ExplicitDefaultCtor = __enable_if_t< _TCC<_Dummy>::__is_explicitly_default_constructible(), bool>; // Constraint for non-explicit constructors template
using _ImplicitCtor = __enable_if_t< _TCC<_Cond>::template __is_implicitly_constructible<_Args...>(), bool>; // Constraint for non-explicit constructors template
using _ExplicitCtor = __enable_if_t< _TCC<_Cond>::template __is_explicitly_constructible<_Args...>(), bool>; template
static constexpr __enable_if_t
__assignable() { return __and_
...>::value; } // Condition for noexcept-specifier of an assignment operator. template
static constexpr bool __nothrow_assignable() { return __and_
...>::value; } // Condition for noexcept-specifier of a constructor. template
static constexpr bool __nothrow_constructible() { return __and_
...>::value; } // Constraint for tuple(_UTypes&&...) where sizeof...(_UTypes) == 1. template
static constexpr bool __valid_args() { return sizeof...(_Elements) == 1 && !is_same
>::value; } // Constraint for tuple(_UTypes&&...) where sizeof...(_UTypes) > 1. template
static constexpr bool __valid_args() { return (sizeof...(_Tail) + 2) == sizeof...(_Elements); } /* Constraint for constructors with a tuple
parameter ensures * that the constructor is only viable when it would not interfere with * tuple(UTypes&&...) or tuple(const tuple&) or tuple(tuple&&). * Such constructors are only viable if: * either sizeof...(Types) != 1, * or (when Types... expands to T and UTypes... expands to U) * is_convertible_v
, is_constructible_v
, * and is_same_v
are all false. */ template
> struct _UseOtherCtor : false_type { }; // If TUPLE is convertible to the single element in *this, // then TUPLE should match tuple(UTypes&&...) instead. template
struct _UseOtherCtor<_Tuple, tuple<_Tp>, tuple<_Up>> : __or_
, is_constructible<_Tp, _Tuple>>::type { }; // If TUPLE and *this each have a single element of the same type, // then TUPLE should match a copy/move constructor instead. template
struct _UseOtherCtor<_Tuple, tuple<_Tp>, tuple<_Tp>> : true_type { }; // Return true iff sizeof...(Types) == 1 && tuple_size_v
== 1 // and the single element in Types can be initialized from TUPLE, // or is the same type as tuple_element_t<0, TUPLE>. template
static constexpr bool __use_other_ctor() { return _UseOtherCtor<_Tuple>::value; } #if __cplusplus > 202002L template
static constexpr bool __constructible = _TCC
::template __constructible<_Args...>::value; template
static constexpr bool __convertible = _TCC
::template __convertible<_Args...>::value; #endif // C++23 public: template
::value> = true> constexpr tuple() noexcept(__and_
...>::value) : _Inherited() { } template
::value> = false> explicit constexpr tuple() noexcept(__and_
...>::value) : _Inherited() { } template
= 1), _ImplicitCtor<_NotEmpty, const _Elements&...> = true> constexpr tuple(const _Elements&... __elements) noexcept(__nothrow_constructible
()) : _Inherited(__elements...) { } template
= 1), _ExplicitCtor<_NotEmpty, const _Elements&...> = false> explicit constexpr tuple(const _Elements&... __elements) noexcept(__nothrow_constructible
()) : _Inherited(__elements...) { } template
(), _ImplicitCtor<_Valid, _UElements...> = true> constexpr tuple(_UElements&&... __elements) noexcept(__nothrow_constructible<_UElements...>()) : _Inherited(std::forward<_UElements>(__elements)...) { } template
(), _ExplicitCtor<_Valid, _UElements...> = false> explicit constexpr tuple(_UElements&&... __elements) noexcept(__nothrow_constructible<_UElements...>()) : _Inherited(std::forward<_UElements>(__elements)...) { } constexpr tuple(const tuple&) = default; constexpr tuple(tuple&&) = default; template
&>(), _ImplicitCtor<_Valid, const _UElements&...> = true> constexpr tuple(const tuple<_UElements...>& __in) noexcept(__nothrow_constructible
()) : _Inherited(static_cast
&>(__in)) { } template
&>(), _ExplicitCtor<_Valid, const _UElements&...> = false> explicit constexpr tuple(const tuple<_UElements...>& __in) noexcept(__nothrow_constructible
()) : _Inherited(static_cast
&>(__in)) { } template
&&>(), _ImplicitCtor<_Valid, _UElements...> = true> constexpr tuple(tuple<_UElements...>&& __in) noexcept(__nothrow_constructible<_UElements...>()) : _Inherited(static_cast<_Tuple_impl<0, _UElements...>&&>(__in)) { } template
&&>(), _ExplicitCtor<_Valid, _UElements...> = false> explicit constexpr tuple(tuple<_UElements...>&& __in) noexcept(__nothrow_constructible<_UElements...>()) : _Inherited(static_cast<_Tuple_impl<0, _UElements...>&&>(__in)) { } #if __cplusplus > 202002L template
requires (sizeof...(_Elements) == sizeof...(_UElements)) && (!__use_other_ctor
&>()) && __constructible<_UElements&...> explicit(!__convertible<_UElements&...>) constexpr tuple(tuple<_UElements...>& __in) noexcept(__nothrow_constructible<_UElements&...>()) : _Inherited(static_cast<_Tuple_impl<0, _UElements...>&>(__in)) { } template
requires (sizeof...(_Elements) == sizeof...(_UElements)) && (!__use_other_ctor
&&>()) && __constructible
explicit(!__convertible
) constexpr tuple(const tuple<_UElements...>&& __in) noexcept(__nothrow_constructible
()) : _Inherited(static_cast
&&>(__in)) { } #endif // C++23 // Allocator-extended constructors. template
::value> = true> _GLIBCXX20_CONSTEXPR tuple(allocator_arg_t __tag, const _Alloc& __a) : _Inherited(__tag, __a) { } template
::value> = false> _GLIBCXX20_CONSTEXPR explicit tuple(allocator_arg_t __tag, const _Alloc& __a) : _Inherited(__tag, __a) { } template
= 1), _ImplicitCtor<_NotEmpty, const _Elements&...> = true> _GLIBCXX20_CONSTEXPR tuple(allocator_arg_t __tag, const _Alloc& __a, const _Elements&... __elements) : _Inherited(__tag, __a, __elements...) { } template
= 1), _ExplicitCtor<_NotEmpty, const _Elements&...> = false> _GLIBCXX20_CONSTEXPR explicit tuple(allocator_arg_t __tag, const _Alloc& __a, const _Elements&... __elements) : _Inherited(__tag, __a, __elements...) { } template
(), _ImplicitCtor<_Valid, _UElements...> = true> _GLIBCXX20_CONSTEXPR tuple(allocator_arg_t __tag, const _Alloc& __a, _UElements&&... __elements) : _Inherited(__tag, __a, std::forward<_UElements>(__elements)...) { } template
(), _ExplicitCtor<_Valid, _UElements...> = false> _GLIBCXX20_CONSTEXPR explicit tuple(allocator_arg_t __tag, const _Alloc& __a, _UElements&&... __elements) : _Inherited(__tag, __a, std::forward<_UElements>(__elements)...) { } template
_GLIBCXX20_CONSTEXPR tuple(allocator_arg_t __tag, const _Alloc& __a, const tuple& __in) : _Inherited(__tag, __a, static_cast
(__in)) { } template
_GLIBCXX20_CONSTEXPR tuple(allocator_arg_t __tag, const _Alloc& __a, tuple&& __in) : _Inherited(__tag, __a, static_cast<_Inherited&&>(__in)) { } template
&>(), _ImplicitCtor<_Valid, const _UElements&...> = true> _GLIBCXX20_CONSTEXPR tuple(allocator_arg_t __tag, const _Alloc& __a, const tuple<_UElements...>& __in) : _Inherited(__tag, __a, static_cast
&>(__in)) { } template
&>(), _ExplicitCtor<_Valid, const _UElements&...> = false> _GLIBCXX20_CONSTEXPR explicit tuple(allocator_arg_t __tag, const _Alloc& __a, const tuple<_UElements...>& __in) : _Inherited(__tag, __a, static_cast
&>(__in)) { } template
&&>(), _ImplicitCtor<_Valid, _UElements...> = true> _GLIBCXX20_CONSTEXPR tuple(allocator_arg_t __tag, const _Alloc& __a, tuple<_UElements...>&& __in) : _Inherited(__tag, __a, static_cast<_Tuple_impl<0, _UElements...>&&>(__in)) { } template
&&>(), _ExplicitCtor<_Valid, _UElements...> = false> _GLIBCXX20_CONSTEXPR explicit tuple(allocator_arg_t __tag, const _Alloc& __a, tuple<_UElements...>&& __in) : _Inherited(__tag, __a, static_cast<_Tuple_impl<0, _UElements...>&&>(__in)) { } #if __cplusplus > 202002L template
requires (sizeof...(_Elements) == sizeof...(_UElements)) && (!__use_other_ctor
&>()) && __constructible<_UElements&...> explicit(!__convertible<_UElements&...>) constexpr tuple(allocator_arg_t __tag, const _Alloc& __a, tuple<_UElements...>& __in) : _Inherited(__tag, __a, static_cast<_Tuple_impl<0, _UElements...>&>(__in)) { } template
requires (sizeof...(_Elements) == sizeof...(_UElements)) && (!__use_other_ctor
>()) && __constructible
explicit(!__convertible
) constexpr tuple(allocator_arg_t __tag, const _Alloc& __a, const tuple<_UElements...>&& __in) : _Inherited(__tag, __a, static_cast
&&>(__in)) { } #endif // C++23 // tuple assignment _GLIBCXX20_CONSTEXPR tuple& operator=(__conditional_t<__assignable
(), const tuple&, const __nonesuch&> __in) noexcept(__nothrow_assignable
()) { this->_M_assign(__in); return *this; } _GLIBCXX20_CONSTEXPR tuple& operator=(__conditional_t<__assignable<_Elements...>(), tuple&&, __nonesuch&&> __in) noexcept(__nothrow_assignable<_Elements...>()) { this->_M_assign(std::move(__in)); return *this; } template
_GLIBCXX20_CONSTEXPR __enable_if_t<__assignable
(), tuple&> operator=(const tuple<_UElements...>& __in) noexcept(__nothrow_assignable
()) { this->_M_assign(__in); return *this; } template
_GLIBCXX20_CONSTEXPR __enable_if_t<__assignable<_UElements...>(), tuple&> operator=(tuple<_UElements...>&& __in) noexcept(__nothrow_assignable<_UElements...>()) { this->_M_assign(std::move(__in)); return *this; } #if __cplusplus > 202002L constexpr const tuple& operator=(const tuple& __in) const requires (is_copy_assignable_v
&& ...) { this->_M_assign(__in); return *this; } constexpr const tuple& operator=(tuple&& __in) const requires (is_assignable_v
&& ...) { this->_M_assign(std::move(__in)); return *this; } template
constexpr const tuple& operator=(const tuple<_UElements...>& __in) const requires (sizeof...(_Elements) == sizeof...(_UElements)) && (is_assignable_v
&& ...) { this->_M_assign(__in); return *this; } template
constexpr const tuple& operator=(tuple<_UElements...>&& __in) const requires (sizeof...(_Elements) == sizeof...(_UElements)) && (is_assignable_v
&& ...) { this->_M_assign(std::move(__in)); return *this; } #endif // C++23 // tuple swap _GLIBCXX20_CONSTEXPR void swap(tuple& __in) noexcept(__and_<__is_nothrow_swappable<_Elements>...>::value) { _Inherited::_M_swap(__in); } #if __cplusplus > 202002L // As an extension, we constrain the const swap member function in order // to continue accepting explicit instantiation of tuples whose elements // are not all const swappable. Without this constraint, such an // explicit instantiation would also instantiate the ill-formed body of // this function and yield a hard error. This constraint shouldn't // affect the behavior of valid programs. constexpr void swap(const tuple& __in) const noexcept(__and_v<__is_nothrow_swappable
...>) requires (is_swappable_v
&& ...) { _Inherited::_M_swap(__in); } #endif // C++23 }; #if __cpp_deduction_guides >= 201606 template
tuple(_UTypes...) -> tuple<_UTypes...>; template
tuple(pair<_T1, _T2>) -> tuple<_T1, _T2>; template
tuple(allocator_arg_t, _Alloc, _UTypes...) -> tuple<_UTypes...>; template
tuple(allocator_arg_t, _Alloc, pair<_T1, _T2>) -> tuple<_T1, _T2>; template
tuple(allocator_arg_t, _Alloc, tuple<_UTypes...>) -> tuple<_UTypes...>; #endif // Explicit specialization, zero-element tuple. template<> class tuple<> { public: _GLIBCXX20_CONSTEXPR void swap(tuple&) noexcept { /* no-op */ } #if __cplusplus > 202002L constexpr void swap(const tuple&) const noexcept { /* no-op */ } #endif // We need the default since we're going to define no-op // allocator constructors. tuple() = default; // No-op allocator constructors. template
_GLIBCXX20_CONSTEXPR tuple(allocator_arg_t, const _Alloc&) noexcept { } template
_GLIBCXX20_CONSTEXPR tuple(allocator_arg_t, const _Alloc&, const tuple&) noexcept { } }; /// Partial specialization, 2-element tuple. /// Includes construction and assignment from a pair. template
class tuple<_T1, _T2> : public _Tuple_impl<0, _T1, _T2> { typedef _Tuple_impl<0, _T1, _T2> _Inherited; // Constraint for non-explicit default constructor template
using _ImplicitDefaultCtor = __enable_if_t< _TupleConstraints<_Dummy, _U1, _U2>:: __is_implicitly_default_constructible(), bool>; // Constraint for explicit default constructor template
using _ExplicitDefaultCtor = __enable_if_t< _TupleConstraints<_Dummy, _U1, _U2>:: __is_explicitly_default_constructible(), bool>; template
using _TCC = _TupleConstraints<_Dummy, _T1, _T2>; // Constraint for non-explicit constructors template
using _ImplicitCtor = __enable_if_t< _TCC<_Cond>::template __is_implicitly_constructible<_U1, _U2>(), bool>; // Constraint for non-explicit constructors template
using _ExplicitCtor = __enable_if_t< _TCC<_Cond>::template __is_explicitly_constructible<_U1, _U2>(), bool>; template
static constexpr bool __assignable() { return __and_
, is_assignable<_T2&, _U2>>::value; } template
static constexpr bool __nothrow_assignable() { return __and_
, is_nothrow_assignable<_T2&, _U2>>::value; } template
static constexpr bool __nothrow_constructible() { return __and_
, is_nothrow_constructible<_T2, _U2>>::value; } static constexpr bool __nothrow_default_constructible() { return __and_
, is_nothrow_default_constructible<_T2>>::value; } template
static constexpr bool __is_alloc_arg() { return is_same<__remove_cvref_t<_U1>, allocator_arg_t>::value; } #if __cplusplus > 202002L template
static constexpr bool __constructible = _TCC
::template __constructible<_U1, _U2>::value; template
static constexpr bool __convertible = _TCC
::template __convertible<_U1, _U2>::value; #endif // C++23 public: template
= true> constexpr tuple() noexcept(__nothrow_default_constructible()) : _Inherited() { } template
= false> explicit constexpr tuple() noexcept(__nothrow_default_constructible()) : _Inherited() { } template
= true> constexpr tuple(const _T1& __a1, const _T2& __a2) noexcept(__nothrow_constructible
()) : _Inherited(__a1, __a2) { } template
= false> explicit constexpr tuple(const _T1& __a1, const _T2& __a2) noexcept(__nothrow_constructible
()) : _Inherited(__a1, __a2) { } template
(), _U1, _U2> = true> constexpr tuple(_U1&& __a1, _U2&& __a2) noexcept(__nothrow_constructible<_U1, _U2>()) : _Inherited(std::forward<_U1>(__a1), std::forward<_U2>(__a2)) { } template
(), _U1, _U2> = false> explicit constexpr tuple(_U1&& __a1, _U2&& __a2) noexcept(__nothrow_constructible<_U1, _U2>()) : _Inherited(std::forward<_U1>(__a1), std::forward<_U2>(__a2)) { } constexpr tuple(const tuple&) = default; constexpr tuple(tuple&&) = default; template
= true> constexpr tuple(const tuple<_U1, _U2>& __in) noexcept(__nothrow_constructible
()) : _Inherited(static_cast
&>(__in)) { } template
= false> explicit constexpr tuple(const tuple<_U1, _U2>& __in) noexcept(__nothrow_constructible
()) : _Inherited(static_cast
&>(__in)) { } template
= true> constexpr tuple(tuple<_U1, _U2>&& __in) noexcept(__nothrow_constructible<_U1, _U2>()) : _Inherited(static_cast<_Tuple_impl<0, _U1, _U2>&&>(__in)) { } template
= false> explicit constexpr tuple(tuple<_U1, _U2>&& __in) noexcept(__nothrow_constructible<_U1, _U2>()) : _Inherited(static_cast<_Tuple_impl<0, _U1, _U2>&&>(__in)) { } #if __cplusplus > 202002L template
requires __constructible<_U1&, _U2&> explicit(!__convertible<_U1&, _U2&>) constexpr tuple(tuple<_U1, _U2>& __in) noexcept(__nothrow_constructible<_U1&, _U2&>()) : _Inherited(static_cast<_Tuple_impl<0, _U1, _U2>&>(__in)) { } template
requires __constructible
explicit(!__convertible
) constexpr tuple(const tuple<_U1, _U2>&& __in) noexcept(__nothrow_constructible
()) : _Inherited(static_cast
&&>(__in)) { } #endif // C++23 template
= true> constexpr tuple(const pair<_U1, _U2>& __in) noexcept(__nothrow_constructible
()) : _Inherited(__in.first, __in.second) { } template
= false> explicit constexpr tuple(const pair<_U1, _U2>& __in) noexcept(__nothrow_constructible
()) : _Inherited(__in.first, __in.second) { } template
= true> constexpr tuple(pair<_U1, _U2>&& __in) noexcept(__nothrow_constructible<_U1, _U2>()) : _Inherited(std::forward<_U1>(__in.first), std::forward<_U2>(__in.second)) { } template
= false> explicit constexpr tuple(pair<_U1, _U2>&& __in) noexcept(__nothrow_constructible<_U1, _U2>()) : _Inherited(std::forward<_U1>(__in.first), std::forward<_U2>(__in.second)) { } #if __cplusplus > 202002L template
requires __constructible<_U1&, _U2&> explicit(!__convertible<_U1&, _U2&>) constexpr tuple(pair<_U1, _U2>& __in) noexcept(__nothrow_constructible<_U1&, _U2&>()) : _Inherited(__in.first, __in.second) { } template
requires __constructible
explicit(!__convertible
) constexpr tuple(const pair<_U1, _U2>&& __in) noexcept(__nothrow_constructible
()) : _Inherited(std::forward
(__in.first), std::forward
(__in.second)) { } #endif // C++23 // Allocator-extended constructors. template
::value, _T1, _T2> = true> _GLIBCXX20_CONSTEXPR tuple(allocator_arg_t __tag, const _Alloc& __a) : _Inherited(__tag, __a) { } template
::value, _T1, _T2> = false> _GLIBCXX20_CONSTEXPR explicit tuple(allocator_arg_t __tag, const _Alloc& __a) : _Inherited(__tag, __a) { } template
= true> _GLIBCXX20_CONSTEXPR tuple(allocator_arg_t __tag, const _Alloc& __a, const _T1& __a1, const _T2& __a2) : _Inherited(__tag, __a, __a1, __a2) { } template
= false> explicit _GLIBCXX20_CONSTEXPR tuple(allocator_arg_t __tag, const _Alloc& __a, const _T1& __a1, const _T2& __a2) : _Inherited(__tag, __a, __a1, __a2) { } template
= true> _GLIBCXX20_CONSTEXPR tuple(allocator_arg_t __tag, const _Alloc& __a, _U1&& __a1, _U2&& __a2) : _Inherited(__tag, __a, std::forward<_U1>(__a1), std::forward<_U2>(__a2)) { } template
= false> explicit _GLIBCXX20_CONSTEXPR tuple(allocator_arg_t __tag, const _Alloc& __a, _U1&& __a1, _U2&& __a2) : _Inherited(__tag, __a, std::forward<_U1>(__a1), std::forward<_U2>(__a2)) { } template
_GLIBCXX20_CONSTEXPR tuple(allocator_arg_t __tag, const _Alloc& __a, const tuple& __in) : _Inherited(__tag, __a, static_cast