// <tuple> -*- C++ -*-

// Copyright (C) 2007-2026 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
// <http://www.gnu.org/licenses/>.

/** @file include/tuple
 *  This is a Standard C++ Library header.
 */

#ifndef _GLIBCXX_TUPLE
#define _GLIBCXX_TUPLE 1

#ifdef _GLIBCXX_SYSHDR
#pragma GCC system_header
#endif

#if __cplusplus < 201103L
# include <bits/c++0x_warning.h>
#else

#include <bits/stl_pair.h>		// for std::pair
#include <bits/uses_allocator.h>	// for std::allocator_arg_t
#include <bits/utility.h>		// for std::tuple_size etc.
#include <bits/invoke.h>		// for std::__invoke
#if __cplusplus > 201703L
# include <compare>
# include <bits/ranges_util.h>		// for std::ranges::subrange
#endif

#define __glibcxx_want_constexpr_tuple
#define __glibcxx_want_tuple_element_t
#define __glibcxx_want_tuples_by_type
#define __glibcxx_want_apply
#define __glibcxx_want_make_from_tuple
#define __glibcxx_want_ranges_zip
#define __glibcxx_want_tuple_like
#define __glibcxx_want_constrained_equality
#include <bits/version.h>

namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION

  /**
   *  @addtogroup utilities
   *  @{
   */

  template<typename... _Elements>
    class tuple;

#if ! __has_cpp_attribute(__no_unique_address__)
#error "support for [[__no_unique_address__]] attribute is required"
#endif

  /// @cond undocumented
#if ! _GLIBCXX_INLINE_VERSION
  template<typename _Tp>
    struct __is_empty_non_tuple : is_empty<_Tp> { };

  // Using EBO for elements that are tuples causes ambiguous base errors.
  // Although we have replaced EBO with [[no_unique_address]] we have to
  // preserve the original layout for ABI compatibility.
  template<typename _El0, typename... _El>
    struct __is_empty_non_tuple<tuple<_El0, _El...>> : false_type { };

  // Use [[no_unique_address]] for empty, non-final types that are not tuples.
  template<typename _Tp>
    using __empty_not_final
    = __conditional_t<__is_final(_Tp), false_type,
		      __is_empty_non_tuple<_Tp>>;

  template<size_t _Idx, typename _Head,
	   bool = __empty_not_final<_Head>::value>
    struct _Head_base;
#else
  // For the unstable ABI we always use [[no_unique_address]].
  template<size_t _Idx, typename _Head, bool = true>
    struct _Head_base;
#endif

  // Primary template uses [[no_unique_address]].
  template<size_t _Idx, typename _Head, bool /* = true */>
    struct _Head_base
    {
      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<typename _UHead>
	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<typename _Alloc>
	_GLIBCXX20_CONSTEXPR
	_Head_base(allocator_arg_t, __uses_alloc1<_Alloc> __a)
	: _M_head_impl(allocator_arg, *__a._M_a) { }

      template<typename _Alloc>
	_GLIBCXX20_CONSTEXPR
	_Head_base(allocator_arg_t, __uses_alloc2<_Alloc> __a)
	: _M_head_impl(*__a._M_a) { }

      template<typename _UHead>
	_GLIBCXX20_CONSTEXPR
	_Head_base(__uses_alloc0, _UHead&& __uhead)
	: _M_head_impl(std::forward<_UHead>(__uhead)) { }

      template<typename _Alloc, typename _UHead>
	_GLIBCXX20_CONSTEXPR
	_Head_base(__uses_alloc1<_Alloc> __a, _UHead&& __uhead)
	: _M_head_impl(allocator_arg, *__a._M_a, std::forward<_UHead>(__uhead))
	{ }

      template<typename _Alloc, typename _UHead>
	_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;
    };

#if ! _GLIBCXX_INLINE_VERSION
  // Partial specialization that doesn't use [[no_unique_address]].
  template<size_t _Idx, typename _Head>
    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<typename _UHead>
        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<typename _Alloc>
	_GLIBCXX20_CONSTEXPR
	_Head_base(allocator_arg_t, __uses_alloc1<_Alloc> __a)
	: _M_head_impl(allocator_arg, *__a._M_a) { }

      template<typename _Alloc>
	_GLIBCXX20_CONSTEXPR
	_Head_base(allocator_arg_t, __uses_alloc2<_Alloc> __a)
	: _M_head_impl(*__a._M_a) { }

      template<typename _UHead>
	_GLIBCXX20_CONSTEXPR
	_Head_base(__uses_alloc0, _UHead&& __uhead)
	: _M_head_impl(std::forward<_UHead>(__uhead)) { }

      template<typename _Alloc, typename _UHead>
	_GLIBCXX20_CONSTEXPR
	_Head_base(__uses_alloc1<_Alloc> __a, _UHead&& __uhead)
	: _M_head_impl(allocator_arg, *__a._M_a, std::forward<_UHead>(__uhead))
	{ }

      template<typename _Alloc, typename _UHead>
	_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;
    };
#endif

#if __cpp_lib_tuple_like // >= C++23
  struct __tuple_like_tag_t { explicit __tuple_like_tag_t() = default; };

  // This forward declaration is used by the operator<=> overload for
  // tuple-like types.
  template<typename _Cat, typename _Tp, typename _Up, typename _IndexSeq>
    constexpr _Cat
    __tuple_cmp(const _Tp& __t, const _Up& __u, _IndexSeq);
#endif // C++23

  /**
   * 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<size_t _Idx, typename... _Elements>
    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<size_t _Idx, typename _Head, typename... _Tail>
    struct _Tuple_impl<_Idx, _Head, _Tail...>
    : public _Tuple_impl<_Idx + 1, _Tail...>,
      private _Head_base<_Idx, _Head>
    {
      template<size_t, typename...> 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<typename _UHead, typename... _UTail,
	       typename = __enable_if_t<sizeof...(_Tail) == sizeof...(_UTail)>>
	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<typename... _UElements>
	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<typename _UHead, typename... _UTails>
	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 __cpp_lib_ranges_zip // >= C++23
      template<typename... _UElements>
	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<typename _UHead, typename... _UTails>
	constexpr
	_Tuple_impl(const _Tuple_impl<_Idx, _UHead, _UTails...>&& __in)
	: _Inherited(std::move
		     (_Tuple_impl<_Idx, _UHead, _UTails...>::_M_tail(__in))),
	  _Base(std::forward<const _UHead>
		(_Tuple_impl<_Idx, _UHead, _UTails...>::_M_head(__in)))
	{ }
#endif // C++23

#if __cpp_lib_tuple_like // >= C++23
      template<typename _UTuple, size_t... _Is>
	constexpr
	_Tuple_impl(__tuple_like_tag_t, _UTuple&& __u, index_sequence<_Is...>)
	: _Tuple_impl(std::get<_Is>(std::forward<_UTuple>(__u))...)
	{ }
#endif // C++23

      template<typename _Alloc>
	_GLIBCXX20_CONSTEXPR
	_Tuple_impl(allocator_arg_t __tag, const _Alloc& __a)
	: _Inherited(__tag, __a),
	  _Base(__tag, __use_alloc<_Head>(__a))
	{ }

      template<typename _Alloc>
	_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<typename _Alloc, typename _UHead, typename... _UTail,
	       typename = __enable_if_t<sizeof...(_Tail) == sizeof...(_UTail)>>
	_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<typename _Alloc>
	_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<typename _Alloc>
	_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<typename _Alloc, typename _UHead, typename... _UTails>
	_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<typename _Alloc, typename _UHead, typename... _UTails>
	_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 __cpp_lib_ranges_zip // >= C++23
      template<typename _Alloc, typename _UHead, typename... _UTails>
	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<typename _Alloc, typename _UHead, typename... _UTails>
	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<const _UHead>
		(_Tuple_impl<_Idx, _UHead, _UTails...>::_M_head(__in)))
	{ }
#endif // C++23

#if __cpp_lib_tuple_like // >= C++23
      template<typename _Alloc, typename _UTuple, size_t... _Is>
	constexpr
	_Tuple_impl(__tuple_like_tag_t, allocator_arg_t __tag, const _Alloc& __a,
		    _UTuple&& __u, index_sequence<_Is...>)
	: _Tuple_impl(__tag, __a, std::get<_Is>(std::forward<_UTuple>(__u))...)
	{ }
#endif // C++23

      template<typename... _UElements>
	_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<typename _UHead, typename... _UTails>
	_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 __cpp_lib_ranges_zip // >= C++23
      template<typename... _UElements>
	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<typename _UHead, typename... _UTails>
	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

#if __cpp_lib_tuple_like // >= C++23
      template<typename _UTuple>
	constexpr void
	_M_assign(__tuple_like_tag_t __tag, _UTuple&& __u)
	{
	  _M_head(*this) = std::get<_Idx>(std::forward<_UTuple>(__u));
	  _M_tail(*this)._M_assign(__tag, std::forward<_UTuple>(__u));
	}

      template<typename _UTuple>
	constexpr void
	_M_assign(__tuple_like_tag_t __tag, _UTuple&& __u) const
	{
	  _M_head(*this) = std::get<_Idx>(std::forward<_UTuple>(__u));
	  _M_tail(*this)._M_assign(__tag, std::forward<_UTuple>(__u));
	}
#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 __cpp_lib_ranges_zip // >= C++23
      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<size_t _Idx, typename _Head>
    struct _Tuple_impl<_Idx, _Head>
    : private _Head_base<_Idx, _Head>
    {
      template<size_t, typename...> 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<typename _UHead>
	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<typename _UHead>
	constexpr
	_Tuple_impl(const _Tuple_impl<_Idx, _UHead>& __in)
	: _Base(_Tuple_impl<_Idx, _UHead>::_M_head(__in))
	{ }

      template<typename _UHead>
	constexpr
	_Tuple_impl(_Tuple_impl<_Idx, _UHead>&& __in)
	: _Base(std::forward<_UHead>(_Tuple_impl<_Idx, _UHead>::_M_head(__in)))
	{ }

#if __cpp_lib_ranges_zip // >= C++23
      template<typename _UHead>
	constexpr
	_Tuple_impl(_Tuple_impl<_Idx, _UHead>& __in)
	: _Base(_Tuple_impl<_Idx, _UHead>::_M_head(__in))
	{ }

      template<typename _UHead>
	constexpr
	_Tuple_impl(const _Tuple_impl<_Idx, _UHead>&& __in)
	: _Base(std::forward<const _UHead>(_Tuple_impl<_Idx, _UHead>::_M_head(__in)))
	{ }
#endif // C++23

#if __cpp_lib_tuple_like // >= C++23
      template<typename _UTuple>
	constexpr
	_Tuple_impl(__tuple_like_tag_t, _UTuple&& __u, index_sequence<0>)
	: _Tuple_impl(std::get<0>(std::forward<_UTuple>(__u)))
	{ }
#endif // C++23

      template<typename _Alloc>
	_GLIBCXX20_CONSTEXPR
	_Tuple_impl(allocator_arg_t __tag, const _Alloc& __a)
	: _Base(__tag, __use_alloc<_Head>(__a))
	{ }

      template<typename _Alloc>
	_GLIBCXX20_CONSTEXPR
	_Tuple_impl(allocator_arg_t, const _Alloc& __a,
		    const _Head& __head)
	: _Base(__use_alloc<_Head, _Alloc, const _Head&>(__a), __head)
	{ }

      template<typename _Alloc, typename _UHead>
	_GLIBCXX20_CONSTEXPR
	_Tuple_impl(allocator_arg_t, const _Alloc& __a,
		    _UHead&& __head)
	: _Base(__use_alloc<_Head, _Alloc, _UHead>(__a),
		std::forward<_UHead>(__head))
	{ }

      template<typename _Alloc>
	_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<typename _Alloc>
	_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<typename _Alloc, typename _UHead>
	_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<typename _Alloc, typename _UHead>
	_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 __cpp_lib_ranges_zip // >= C++23
      template<typename _Alloc, typename _UHead>
	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<typename _Alloc, typename _UHead>
	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<const _UHead>(_Tuple_impl<_Idx, _UHead>::_M_head(__in)))
	{ }
#endif // C++23

#if __cpp_lib_tuple_like // >= C++23
      template<typename _Alloc, typename _UTuple>
	constexpr
	_Tuple_impl(__tuple_like_tag_t, allocator_arg_t __tag, const _Alloc& __a,
		    _UTuple&& __u, index_sequence<0>)
	: _Tuple_impl(__tag, __a, std::get<0>(std::forward<_UTuple>(__u)))
	{ }
#endif // C++23

      template<typename _UHead>
	_GLIBCXX20_CONSTEXPR
	void
	_M_assign(const _Tuple_impl<_Idx, _UHead>& __in)
	{
	  _M_head(*this) = _Tuple_impl<_Idx, _UHead>::_M_head(__in);
	}

      template<typename _UHead>
	_GLIBCXX20_CONSTEXPR
	void
	_M_assign(_Tuple_impl<_Idx, _UHead>&& __in)
	{
	  _M_head(*this)
	    = std::forward<_UHead>(_Tuple_impl<_Idx, _UHead>::_M_head(__in));
	}

#if __cpp_lib_ranges_zip // >= C++23
      template<typename _UHead>
	constexpr void
	_M_assign(const _Tuple_impl<_Idx, _UHead>& __in) const
	{
	  _M_head(*this) = _Tuple_impl<_Idx, _UHead>::_M_head(__in);
	}

      template<typename _UHead>
	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

#if __cpp_lib_tuple_like // >= C++23
    template<typename _UTuple>
      constexpr void
      _M_assign(__tuple_like_tag_t, _UTuple&& __u)
      { _M_head(*this) = std::get<_Idx>(std::forward<_UTuple>(__u)); }

    template<typename _UTuple>
      constexpr void
      _M_assign(__tuple_like_tag_t, _UTuple&& __u) const
      { _M_head(*this) = std::get<_Idx>(std::forward<_UTuple>(__u)); }
#endif // C++23

    protected:
      _GLIBCXX20_CONSTEXPR
      void
      _M_swap(_Tuple_impl& __in)
      {
	using std::swap;
	swap(_M_head(*this), _M_head(__in));
      }

#if __cpp_lib_ranges_zip // >= C++23
      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<bool, typename... _Types>
    struct _TupleConstraints
    {
      template<typename... _UTypes>
	using __constructible = __and_<is_constructible<_Types, _UTypes>...>;

      template<typename... _UTypes>
	using __convertible = __and_<is_convertible<_UTypes, _Types>...>;

      // 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<typename... _UTypes>
	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<typename... _UTypes>
	static constexpr bool __is_explicitly_constructible()
	{
	  return __and_<__constructible<_UTypes...>,
			__not_<__convertible<_UTypes...>>
			>::value;
	}

      static constexpr bool __is_implicitly_default_constructible()
      {
	return __and_<std::__is_implicitly_default_constructible<_Types>...
		      >::value;
      }

      static constexpr bool __is_explicitly_default_constructible()
      {
	return __and_<is_default_constructible<_Types>...,
		      __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<typename... _Types>
    struct _TupleConstraints<false, _Types...>
    {
      template<typename... _UTypes>
	static constexpr bool __is_implicitly_constructible()
	{ return false; }

      template<typename... _UTypes>
	static constexpr bool __is_explicitly_constructible()
	{ return false; }
    };
  /// @endcond

  /// Primary class template, tuple
  template<typename... _Elements>
    // _GLIBCXX_RESOLVE_LIB_DEFECTS
    // 3990. Program-defined specializations of std::tuple and std::variant
    // can't be properly supported
    class _GLIBCXX_NO_SPECIALIZATIONS tuple
    : public _Tuple_impl<0, _Elements...>
    {
      using _Inherited = _Tuple_impl<0, _Elements...>;

#if __cpp_concepts && __cpp_consteval && __cpp_conditional_explicit // >= C++20
      template<typename... _UTypes>
	static consteval bool
	__constructible()
	{
	  if constexpr (sizeof...(_UTypes) == sizeof...(_Elements))
	    return __and_v<is_constructible<_Elements, _UTypes>...>;
	  else
	    return false;
	}

      template<typename... _UTypes>
	static consteval bool
	__nothrow_constructible()
	{
	  if constexpr (sizeof...(_UTypes) == sizeof...(_Elements))
	    return __and_v<is_nothrow_constructible<_Elements, _UTypes>...>;
	  else
	    return false;
	}

      template<typename... _UTypes>
	static consteval bool
	__convertible()
	{
	  if constexpr (sizeof...(_UTypes) == sizeof...(_Elements))
	    return __and_v<is_convertible<_UTypes, _Elements>...>;
	  else
	    return false;
	}

      // _GLIBCXX_RESOLVE_LIB_DEFECTS
      // 3121. tuple constructor constraints for UTypes&&... overloads
      template<typename... _UTypes>
	static consteval bool
	__disambiguating_constraint()
	{
	  if constexpr (sizeof...(_Elements) != sizeof...(_UTypes))
	    return false;
	  else if constexpr (sizeof...(_Elements) == 1)
	    {
	      using _U0 = typename _Nth_type<0, _UTypes...>::type;
	      return !is_same_v<remove_cvref_t<_U0>, tuple>;
	    }
	  else if constexpr (sizeof...(_Elements) < 4)
	    {
	      using _U0 = typename _Nth_type<0, _UTypes...>::type;
	      if constexpr (!is_same_v<remove_cvref_t<_U0>, allocator_arg_t>)
		return true;
	      else
		{
		  using _T0 = typename _Nth_type<0, _Elements...>::type;
		  return is_same_v<remove_cvref_t<_T0>, allocator_arg_t>;
		}
	    }
	  return true;
	}

      // Return true iff sizeof...(Types) == 1 && tuple_size_v<TUPLE> == 1
      // and the single element in Types can be initialized from TUPLE,
      // or is the same type as tuple_element_t<0, TUPLE>.
      template<typename _Tuple>
	static consteval bool
	__use_other_ctor()
	{
	  if constexpr (sizeof...(_Elements) != 1)
	    return false;
	  else if constexpr (is_same_v<remove_cvref_t<_Tuple>, tuple>)
	    return true; // Should use a copy/move constructor instead.
	  else
	    {
	      using _Tp = typename _Nth_type<0, _Elements...>::type;
	      if constexpr (is_convertible_v<_Tuple, _Tp>)
		return true;
	      else if constexpr (is_constructible_v<_Tp, _Tuple>)
		return true;
	    }
	  return false;
	}

      template<typename... _Up>
	static consteval bool
	__dangles()
	{
#if __has_builtin(__reference_constructs_from_temporary)
	  return (__reference_constructs_from_temporary(_Elements, _Up&&)
		    || ...);
#else
	  return false;
#endif
	}

#if __cpp_lib_tuple_like // >= C++23
      // _GLIBCXX_RESOLVE_LIB_DEFECTS
      // 4045. tuple can create dangling references from tuple-like
      template<typename _UTuple>
	static consteval bool
	__dangles_from_tuple_like()
	{
	  return []<size_t... _Is>(index_sequence<_Is...>) {
	    return __dangles<decltype(std::get<_Is>(std::declval<_UTuple>()))...>();
	  }(index_sequence_for<_Elements...>{});
	}

      template<typename _UTuple>
	static consteval bool
	__constructible_from_tuple_like()
	{
	  return []<size_t... _Is>(index_sequence<_Is...>) {
	    return __constructible<decltype(std::get<_Is>(std::declval<_UTuple>()))...>();
	  }(index_sequence_for<_Elements...>{});
	}

      template<typename _UTuple>
	static consteval bool
	__convertible_from_tuple_like()
	{
	  return []<size_t... _Is>(index_sequence<_Is...>) {
	    return __convertible<decltype(std::get<_Is>(std::declval<_UTuple>()))...>();
	  }(index_sequence_for<_Elements...>{});
	}
#endif // C++23

    public:
      constexpr
      explicit(!(__is_implicitly_default_constructible_v<_Elements> && ...))
      tuple()
      noexcept((is_nothrow_default_constructible_v<_Elements> && ...))
      requires (is_default_constructible_v<_Elements> && ...)
      : _Inherited()
      { }

      // Defined as a template to work around PR libstdc++/116440.
      template<typename = void>
	constexpr explicit(!__convertible<const _Elements&...>())
	tuple(const type_identity_t<_Elements>&... __elements)
	noexcept(__nothrow_constructible<const _Elements&...>())
	requires (__constructible<const _Elements&...>())
	: _Inherited(__elements...)
	{ }

      template<typename... _UTypes>
	requires (__disambiguating_constraint<_UTypes...>())
	  && (__constructible<_UTypes...>())
	  && (!__dangles<_UTypes...>())
	constexpr explicit(!__convertible<_UTypes...>())
	tuple(_UTypes&&... __u)
	noexcept(__nothrow_constructible<_UTypes...>())
	: _Inherited(std::forward<_UTypes>(__u)...)
	{ }

      template<typename... _UTypes>
	requires (__disambiguating_constraint<_UTypes...>())
	  && (__constructible<_UTypes...>())
	  && (__dangles<_UTypes...>())
	tuple(_UTypes&&...) = delete;

      constexpr tuple(const tuple&) = default;

      constexpr
      tuple(tuple&&) requires (is_move_constructible_v<_Elements> && ...)
	= default;

      template<typename... _UTypes>
	requires (__constructible<const _UTypes&...>())
	  && (!__use_other_ctor<const tuple<_UTypes...>&>())
	  && (!__dangles<const _UTypes&...>())
	constexpr explicit(!__convertible<const _UTypes&...>())
	tuple(const tuple<_UTypes...>& __u)
	noexcept(__nothrow_constructible<const _UTypes&...>())
	: _Inherited(static_cast<const _Tuple_impl<0, _UTypes...>&>(__u))
	{ }

      template<typename... _UTypes>
	requires (__constructible<const _UTypes&...>())
	  && (!__use_other_ctor<const tuple<_UTypes...>&>())
	  && (__dangles<const _UTypes&...>())
	tuple(const tuple<_UTypes...>&) = delete;

      template<typename... _UTypes>
	requires (__constructible<_UTypes...>())
	  && (!__use_other_ctor<tuple<_UTypes...>>())
	  && (!__dangles<_UTypes...>())
	constexpr explicit(!__convertible<_UTypes...>())
	tuple(tuple<_UTypes...>&& __u)
	noexcept(__nothrow_constructible<_UTypes...>())
	: _Inherited(static_cast<_Tuple_impl<0, _UTypes...>&&>(__u))
	{ }

      template<typename... _UTypes>
	requires (__constructible<_UTypes...>())
	  && (!__use_other_ctor<tuple<_UTypes...>>())
	  && (__dangles<_UTypes...>())
	tuple(tuple<_UTypes...>&&) = delete;

#if __cpp_lib_ranges_zip // >= C++23
      template<typename... _UTypes>
	requires (__constructible<_UTypes&...>())
	  && (!__use_other_ctor<tuple<_UTypes...>&>())
	  && (!__dangles<_UTypes&...>())
	constexpr explicit(!__convertible<_UTypes&...>())
	tuple(tuple<_UTypes...>& __u)
	noexcept(__nothrow_constructible<_UTypes&...>())
	: _Inherited(static_cast<_Tuple_impl<0, _UTypes...>&>(__u))
	{ }

      template<typename... _UTypes>
	requires (__constructible<_UTypes&...>())
	  && (!__use_other_ctor<tuple<_UTypes...>&>())
	  && (__dangles<_UTypes&...>())
	tuple(tuple<_UTypes...>&) = delete;

      template<typename... _UTypes>
	requires (__constructible<const _UTypes...>())
	  && (!__use_other_ctor<const tuple<_UTypes...>>())
	  && (!__dangles<const _UTypes...>())
	constexpr explicit(!__convertible<const _UTypes...>())
	tuple(const tuple<_UTypes...>&& __u)
	noexcept(__nothrow_constructible<const _UTypes...>())
	: _Inherited(static_cast<const _Tuple_impl<0, _UTypes...>&&>(__u))
	{ }

      template<typename... _UTypes>
	requires (__constructible<const _UTypes...>())
	  && (!__use_other_ctor<const tuple<_UTypes...>>())
	  && (__dangles<const _UTypes...>())
	tuple(const tuple<_UTypes...>&&) = delete;
#endif // C++23

      template<typename _U1, typename _U2>
	requires (sizeof...(_Elements) == 2)
	  && (__constructible<const _U1&, const _U2&>())
	  && (!__dangles<const _U1&, const _U2&>())
	constexpr explicit(!__convertible<const _U1&, const _U2&>())
	tuple(const pair<_U1, _U2>& __u)
	noexcept(__nothrow_constructible<const _U1&, const _U2&>())
	: _Inherited(__u.first, __u.second)
	{ }

      template<typename _U1, typename _U2>
	requires (sizeof...(_Elements) == 2)
	  && (__constructible<const _U1&, const _U2&>())
	  && (__dangles<const _U1&, const _U2&>())
	tuple(const pair<_U1, _U2>&) = delete;

      template<typename _U1, typename _U2>
	requires (sizeof...(_Elements) == 2)
	  && (__constructible<_U1, _U2>())
	  && (!__dangles<_U1, _U2>())
	constexpr explicit(!__convertible<_U1, _U2>())
	tuple(pair<_U1, _U2>&& __u)
	noexcept(__nothrow_constructible<_U1, _U2>())
	: _Inherited(std::forward<_U1>(__u.first),
		     std::forward<_U2>(__u.second))
	{ }

      template<typename _U1, typename _U2>
	requires (sizeof...(_Elements) == 2)
	  && (__constructible<_U1, _U2>())
	  && (__dangles<_U1, _U2>())
	tuple(pair<_U1, _U2>&&) = delete;

#if __cpp_lib_ranges_zip // >= C++23
      template<typename _U1, typename _U2>
	requires (sizeof...(_Elements) == 2)
	  && (__constructible<_U1&, _U2&>())
	  && (!__dangles<_U1&, _U2&>())
	constexpr explicit(!__convertible<_U1&, _U2&>())
	tuple(pair<_U1, _U2>& __u)
	noexcept(__nothrow_constructible<_U1&, _U2&>())
	: _Inherited(__u.first, __u.second)
	{ }

      template<typename _U1, typename _U2>
	requires (sizeof...(_Elements) == 2)
	  && (__constructible<_U1&, _U2&>())
	  && (__dangles<_U1&, _U2&>())
	tuple(pair<_U1, _U2>&) = delete;

      template<typename _U1, typename _U2>
	requires (sizeof...(_Elements) == 2)
	  && (__constructible<const _U1, const _U2>())
	  && (!__dangles<const _U1, const _U2>())
	constexpr explicit(!__convertible<const _U1, const _U2>())
	tuple(const pair<_U1, _U2>&& __u)
	noexcept(__nothrow_constructible<const _U1, const _U2>())
	: _Inherited(std::forward<const _U1>(__u.first),
		     std::forward<const _U2>(__u.second))
	{ }

      template<typename _U1, typename _U2>
	requires (sizeof...(_Elements) == 2)
	  && (__constructible<const _U1, const _U2>())
	  && (__dangles<const _U1, const _U2>())
	tuple(const pair<_U1, _U2>&&) = delete;
#endif // C++23

#if __cpp_lib_tuple_like // >= C++23
      template<__eligible_tuple_like<tuple> _UTuple>
	requires (__constructible_from_tuple_like<_UTuple>())
	  && (!__use_other_ctor<_UTuple>())
	  && (!__dangles_from_tuple_like<_UTuple>())
	constexpr explicit(!__convertible_from_tuple_like<_UTuple>())
	tuple(_UTuple&& __u)
	: _Inherited(__tuple_like_tag_t{},
		     std::forward<_UTuple>(__u),
		     index_sequence_for<_Elements...>{})
	{ }

      template<__eligible_tuple_like<tuple> _UTuple>
	requires (__constructible_from_tuple_like<_UTuple>())
	  && (!__use_other_ctor<_UTuple>())
	  && (__dangles_from_tuple_like<_UTuple>())
	tuple(_UTuple&&) = delete;
#endif // C++23

      // Allocator-extended constructors.

      template<typename _Alloc>
	constexpr
	explicit(!(__is_implicitly_default_constructible_v<_Elements> && ...))
	tuple(allocator_arg_t __tag, const _Alloc& __a)
	requires (is_default_constructible_v<_Elements> && ...)
	: _Inherited(__tag, __a)
	{ }

      template<typename _Alloc>
	constexpr explicit(!__convertible<const _Elements&...>())
	tuple(allocator_arg_t __tag, const _Alloc& __a,
	      const type_identity_t<_Elements>&... __elements)
	requires (__constructible<const _Elements&...>())
	: _Inherited(__tag, __a, __elements...)
	{ }

      template<typename _Alloc, typename... _UTypes>
	requires (__disambiguating_constraint<_UTypes...>())
	  && (__constructible<_UTypes...>())
	  && (!__dangles<_UTypes...>())
	constexpr explicit(!__convertible<_UTypes...>())
	tuple(allocator_arg_t __tag, const _Alloc& __a, _UTypes&&... __u)
	: _Inherited(__tag, __a, std::forward<_UTypes>(__u)...)
	{ }

      template<typename _Alloc, typename... _UTypes>
	requires (__disambiguating_constraint<_UTypes...>())
	  && (__constructible<_UTypes...>())
	  && (__dangles<_UTypes...>())
	tuple(allocator_arg_t, const _Alloc&, _UTypes&&...) = delete;

      template<typename _Alloc>
	constexpr
	tuple(allocator_arg_t __tag, const _Alloc& __a, const tuple& __u)
	: _Inherited(__tag, __a, static_cast<const _Inherited&>(__u))
	{ }

      template<typename _Alloc>
	requires (__constructible<_Elements...>())
	constexpr
	tuple(allocator_arg_t __tag, const _Alloc& __a, tuple&& __u)
	: _Inherited(__tag, __a, static_cast<_Inherited&&>(__u))
	{ }

      template<typename _Alloc, typename... _UTypes>
	requires (__constructible<const _UTypes&...>())
	  && (!__use_other_ctor<const tuple<_UTypes...>&>())
	  && (!__dangles<const _UTypes&...>())
	constexpr explicit(!__convertible<const _UTypes&...>())
	tuple(allocator_arg_t __tag, const _Alloc& __a,
	      const tuple<_UTypes...>& __u)
	: _Inherited(__tag, __a,
		     static_cast<const _Tuple_impl<0, _UTypes...>&>(__u))
	{ }

      template<typename _Alloc, typename... _UTypes>
	requires (__constructible<const _UTypes&...>())
	  && (!__use_other_ctor<const tuple<_UTypes...>&>())
	  && (__dangles<const _UTypes&...>())
	tuple(allocator_arg_t, const _Alloc&, const tuple<_UTypes...>&) = delete;

      template<typename _Alloc, typename... _UTypes>
	requires (__constructible<_UTypes...>())
	  && (!__use_other_ctor<tuple<_UTypes...>>())
	  && (!__dangles<_UTypes...>())
	constexpr explicit(!__use_other_ctor<tuple<_UTypes...>>())
	tuple(allocator_arg_t __tag, const _Alloc& __a, tuple<_UTypes...>&& __u)
	: _Inherited(__tag, __a, static_cast<_Tuple_impl<0, _UTypes...>&&>(__u))
	{ }

      template<typename _Alloc, typename... _UTypes>
	requires (__constructible<_UTypes...>())
	  && (!__use_other_ctor<tuple<_UTypes...>>())
	  && (__dangles<_UTypes...>())
	tuple(allocator_arg_t, const _Alloc&, tuple<_UTypes...>&&) = delete;

#if __cpp_lib_ranges_zip // >= C++23
      template<typename _Alloc, typename... _UTypes>
	requires (__constructible<_UTypes&...>())
	  && (!__use_other_ctor<tuple<_UTypes...>&>())
	  && (!__dangles<_UTypes&...>())
	constexpr explicit(!__convertible<_UTypes&...>())
	tuple(allocator_arg_t __tag, const _Alloc& __a, tuple<_UTypes...>& __u)
	: _Inherited(__tag, __a, static_cast<_Tuple_impl<0, _UTypes...>&>(__u))
	{ }

      template<typename _Alloc, typename... _UTypes>
	requires (__constructible<_UTypes&...>())
	  && (!__use_other_ctor<tuple<_UTypes...>&>())
	  && (__dangles<_UTypes&...>())
	tuple(allocator_arg_t, const _Alloc&, tuple<_UTypes...>&) = delete;

      template<typename _Alloc, typename... _UTypes>
	requires (__constructible<const _UTypes...>())
	  && (!__use_other_ctor<const tuple<_UTypes...>>())
	  && (!__dangles<const _UTypes...>())
	constexpr explicit(!__convertible<const _UTypes...>())
	tuple(allocator_arg_t __tag, const _Alloc& __a,
	      const tuple<_UTypes...>&& __u)
	: _Inherited(__tag, __a,
		     static_cast<const _Tuple_impl<0, _UTypes...>&&>(__u))
	{ }

      template<typename _Alloc, typename... _UTypes>
	requires (__constructible<const _UTypes...>())
	  && (!__use_other_ctor<const tuple<_UTypes...>>())
	  && (__dangles<const _UTypes...>())
	tuple(allocator_arg_t, const _Alloc&, const tuple<_UTypes...>&&) = delete;
#endif // C++23

      template<typename _Alloc, typename _U1, typename _U2>
	requires (sizeof...(_Elements) == 2)
	  && (__constructible<const _U1&, const _U2&>())
	  && (!__dangles<const _U1&, const _U2&>())
	constexpr explicit(!__convertible<const _U1&, const _U2&>())
	tuple(allocator_arg_t __tag, const _Alloc& __a,
	      const pair<_U1, _U2>& __u)
	noexcept(__nothrow_constructible<const _U1&, const _U2&>())
	: _Inherited(__tag, __a, __u.first, __u.second)
	{ }

      template<typename _Alloc, typename _U1, typename _U2>
	requires (sizeof...(_Elements) == 2)
	  && (__constructible<const _U1&, const _U2&>())
	  && (__dangles<const _U1&, const _U2&>())
	tuple(allocator_arg_t, const _Alloc&, const pair<_U1, _U2>&) = delete;

      template<typename _Alloc, typename _U1, typename _U2>
	requires (sizeof...(_Elements) == 2)
	  && (__constructible<_U1, _U2>())
	  && (!__dangles<_U1, _U2>())
	constexpr explicit(!__convertible<_U1, _U2>())
	tuple(allocator_arg_t __tag, const _Alloc& __a, pair<_U1, _U2>&& __u)
	noexcept(__nothrow_constructible<_U1, _U2>())
	: _Inherited(__tag, __a, std::move(__u.first), std::move(__u.second))
	{ }

      template<typename _Alloc, typename _U1, typename _U2>
	requires (sizeof...(_Elements) == 2)
	  && (__constructible<_U1, _U2>())
	  && (__dangles<_U1, _U2>())
	tuple(allocator_arg_t, const _Alloc&, pair<_U1, _U2>&&) = delete;

#if __cpp_lib_ranges_zip // >= C++23
      template<typename _Alloc, typename _U1, typename _U2>
	requires (sizeof...(_Elements) == 2)
	  && (__constructible<_U1&, _U2&>())
	  && (!__dangles<_U1&, _U2&>())
	constexpr explicit(!__convertible<_U1&, _U2&>())
	tuple(allocator_arg_t __tag, const _Alloc& __a, pair<_U1, _U2>& __u)
	noexcept(__nothrow_constructible<_U1&, _U2&>())
	: _Inherited(__tag, __a, __u.first, __u.second)
	{ }

      template<typename _Alloc, typename _U1, typename _U2>
	requires (sizeof...(_Elements) == 2)
	  && (__constructible<_U1&, _U2&>())
	  && (__dangles<_U1&, _U2&>())
	tuple(allocator_arg_t, const _Alloc&, pair<_U1, _U2>&) = delete;

      template<typename _Alloc, typename _U1, typename _U2>
	requires (sizeof...(_Elements) == 2)
	  && (__constructible<const _U1, const _U2>())
	  && (!__dangles<const _U1, const _U2>())
	constexpr explicit(!__convertible<const _U1, const _U2>())
	tuple(allocator_arg_t __tag, const _Alloc& __a,
	const pair<_U1, _U2>&& __u)
	noexcept(__nothrow_constructible<const _U1, const _U2>())
	: _Inherited(__tag, __a, std::move(__u.first), std::move(__u.second))
	{ }

      template<typename _Alloc, typename _U1, typename _U2>
	requires (sizeof...(_Elements) == 2)
	  && (__constructible<const _U1, const _U2>())
	  && (__dangles<const _U1, const _U2>())
	tuple(allocator_arg_t, const _Alloc&, const pair<_U1, _U2>&&) = delete;
#endif // C++23

#if __cpp_lib_tuple_like // >= C++23
      template<typename _Alloc, __eligible_tuple_like<tuple> _UTuple>
	requires (__constructible_from_tuple_like<_UTuple>())
	  && (!__use_other_ctor<_UTuple>())
	  && (!__dangles_from_tuple_like<_UTuple>())
	constexpr explicit(!__convertible_from_tuple_like<_UTuple>())
	tuple(allocator_arg_t __tag, const _Alloc& __a, _UTuple&& __u)
	: _Inherited(__tuple_like_tag_t{},
		     __tag, __a, std::forward<_UTuple>(__u),
		     index_sequence_for<_Elements...>{})
	{ }

      template<typename _Alloc, __eligible_tuple_like<tuple> _UTuple>
	requires (__constructible_from_tuple_like<_UTuple>())
	  && (!__use_other_ctor<_UTuple>())
	  && (__dangles_from_tuple_like<_UTuple>())
	tuple(allocator_arg_t, const _Alloc&, _UTuple&&) = delete;
#endif // C++23

#else // !(concepts && conditional_explicit)

      template<bool _Cond>
	using _TCC = _TupleConstraints<_Cond, _Elements...>;

      // Constraint for non-explicit default constructor
      template<bool _Dummy>
	using _ImplicitDefaultCtor = __enable_if_t<
	  _TCC<_Dummy>::__is_implicitly_default_constructible(),
	  bool>;

      // Constraint for explicit default constructor
      template<bool _Dummy>
	using _ExplicitDefaultCtor = __enable_if_t<
	  _TCC<_Dummy>::__is_explicitly_default_constructible(),
	  bool>;

      // Constraint for non-explicit constructors
      template<bool _Cond, typename... _Args>
	using _ImplicitCtor = __enable_if_t<
	  _TCC<_Cond>::template __is_implicitly_constructible<_Args...>(),
	  bool>;

      // Constraint for non-explicit constructors
      template<bool _Cond, typename... _Args>
	using _ExplicitCtor = __enable_if_t<
	  _TCC<_Cond>::template __is_explicitly_constructible<_Args...>(),
	  bool>;

      // Condition for noexcept-specifier of a constructor.
      template<typename... _UElements>
	static constexpr bool __nothrow_constructible()
	{
	  return
	    __and_<is_nothrow_constructible<_Elements, _UElements>...>::value;
	}

      // Constraint for tuple(_UTypes&&...) where sizeof...(_UTypes) == 1.
      template<typename _Up>
	static constexpr bool __valid_args()
	{
	  return sizeof...(_Elements) == 1
	    && !is_same<tuple, __remove_cvref_t<_Up>>::value;
	}

      // Constraint for tuple(_UTypes&&...) where sizeof...(_UTypes) > 1.
      template<typename, typename, typename... _Tail>
	static constexpr bool __valid_args()
	{ return (sizeof...(_Tail) + 2) == sizeof...(_Elements); }

      /* Constraint for constructors with a tuple<UTypes...> 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<TUPLE, T>, is_constructible_v<T, TUPLE>,
       * and is_same_v<T, U> are all false.
       */
      template<typename _Tuple, typename = tuple,
	       typename = __remove_cvref_t<_Tuple>>
	struct _UseOtherCtor
	: false_type
	{ };
      // If TUPLE is convertible to the single element in *this,
      // then TUPLE should match tuple(UTypes&&...) instead.
      template<typename _Tuple, typename _Tp, typename _Up>
	struct _UseOtherCtor<_Tuple, tuple<_Tp>, tuple<_Up>>
	: __or_<is_convertible<_Tuple, _Tp>, 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<typename _Tuple, typename _Tp>
	struct _UseOtherCtor<_Tuple, tuple<_Tp>, tuple<_Tp>>
	: true_type
	{ };

      // Return true iff sizeof...(Types) == 1 && tuple_size_v<TUPLE> == 1
      // and the single element in Types can be initialized from TUPLE,
      // or is the same type as tuple_element_t<0, TUPLE>.
      template<typename _Tuple>
	static constexpr bool __use_other_ctor()
	{ return _UseOtherCtor<_Tuple>::value; }

      /// @cond undocumented
#undef __glibcxx_no_dangling_refs
#if __has_builtin(__reference_constructs_from_temporary) \
      && defined _GLIBCXX_DEBUG
      // Error if construction from U... would create a dangling ref.
# if __cpp_fold_expressions
#  define __glibcxx_dangling_refs(U) \
  (__reference_constructs_from_temporary(_Elements, U) || ...)
# else
#  define __glibcxx_dangling_refs(U) \
  __or_<__bool_constant<__reference_constructs_from_temporary(_Elements, U) \
       >...>::value
# endif
# define __glibcxx_no_dangling_refs(U) \
  static_assert(!__glibcxx_dangling_refs(U), \
		"std::tuple constructor creates a dangling reference")
#else
# define __glibcxx_no_dangling_refs(U)
#endif
      /// @endcond

    public:
      template<typename _Dummy = void,
	       _ImplicitDefaultCtor<is_void<_Dummy>::value> = true>
	constexpr
	tuple()
	noexcept(__and_<is_nothrow_default_constructible<_Elements>...>::value)
	: _Inherited() { }

      template<typename _Dummy = void,
	       _ExplicitDefaultCtor<is_void<_Dummy>::value> = false>
	explicit constexpr
	tuple()
	noexcept(__and_<is_nothrow_default_constructible<_Elements>...>::value)
	: _Inherited() { }

      template<bool _NotEmpty = (sizeof...(_Elements) >= 1),
	       _ImplicitCtor<_NotEmpty, const _Elements&...> = true>
	constexpr
	tuple(const __type_identity_t<_Elements>&... __elements)
	noexcept(__nothrow_constructible<const _Elements&...>())
	: _Inherited(__elements...) { }

      template<bool _NotEmpty = (sizeof...(_Elements) >= 1),
	       _ExplicitCtor<_NotEmpty, const _Elements&...> = false>
	explicit constexpr
	tuple(const __type_identity_t<_Elements>&... __elements)
	noexcept(__nothrow_constructible<const _Elements&...>())
	: _Inherited(__elements...) { }

      template<typename... _UElements,
	       bool _Valid = __valid_args<_UElements...>(),
	       _ImplicitCtor<_Valid, _UElements...> = true>
	constexpr
	tuple(_UElements&&... __elements)
	noexcept(__nothrow_constructible<_UElements...>())
	: _Inherited(std::forward<_UElements>(__elements)...)
	{ __glibcxx_no_dangling_refs(_UElements&&); }

      template<typename... _UElements,
	       bool _Valid = __valid_args<_UElements...>(),
	       _ExplicitCtor<_Valid, _UElements...> = false>
	explicit constexpr
	tuple(_UElements&&... __elements)
	noexcept(__nothrow_constructible<_UElements...>())
	: _Inherited(std::forward<_UElements>(__elements)...)
	{ __glibcxx_no_dangling_refs(_UElements&&); }

      constexpr tuple(const tuple&) = default;

      constexpr tuple(tuple&&) = default;

      template<typename... _UElements,
	       bool _Valid = (sizeof...(_Elements) == sizeof...(_UElements))
			   && !__use_other_ctor<const tuple<_UElements...>&>(),
	       _ImplicitCtor<_Valid, const _UElements&...> = true>
	constexpr
	tuple(const tuple<_UElements...>& __in)
	noexcept(__nothrow_constructible<const _UElements&...>())
	: _Inherited(static_cast<const _Tuple_impl<0, _UElements...>&>(__in))
	{ __glibcxx_no_dangling_refs(const _UElements&); }

      template<typename... _UElements,
	       bool _Valid = (sizeof...(_Elements) == sizeof...(_UElements))
			   && !__use_other_ctor<const tuple<_UElements...>&>(),
	       _ExplicitCtor<_Valid, const _UElements&...> = false>
	explicit constexpr
	tuple(const tuple<_UElements...>& __in)
	noexcept(__nothrow_constructible<const _UElements&...>())
	: _Inherited(static_cast<const _Tuple_impl<0, _UElements...>&>(__in))
	{ __glibcxx_no_dangling_refs(const _UElements&); }

      template<typename... _UElements,
	       bool _Valid = (sizeof...(_Elements) == sizeof...(_UElements))
			     && !__use_other_ctor<tuple<_UElements...>&&>(),
	       _ImplicitCtor<_Valid, _UElements...> = true>
	constexpr
	tuple(tuple<_UElements...>&& __in)
	noexcept(__nothrow_constructible<_UElements...>())
	: _Inherited(static_cast<_Tuple_impl<0, _UElements...>&&>(__in))
	{ __glibcxx_no_dangling_refs(_UElements&&); }

      template<typename... _UElements,
	       bool _Valid = (sizeof...(_Elements) == sizeof...(_UElements))
			     && !__use_other_ctor<tuple<_UElements...>&&>(),
	       _ExplicitCtor<_Valid, _UElements...> = false>
	explicit constexpr
	tuple(tuple<_UElements...>&& __in)
	noexcept(__nothrow_constructible<_UElements...>())
	: _Inherited(static_cast<_Tuple_impl<0, _UElements...>&&>(__in))
	{ __glibcxx_no_dangling_refs(_UElements&&); }

      // Allocator-extended constructors.

      template<typename _Alloc,
	       _ImplicitDefaultCtor<is_object<_Alloc>::value> = true>
	_GLIBCXX20_CONSTEXPR
	tuple(allocator_arg_t __tag, const _Alloc& __a)
	: _Inherited(__tag, __a) { }

      template<typename _Alloc,
	       _ExplicitDefaultCtor<is_object<_Alloc>::value> = false>
	_GLIBCXX20_CONSTEXPR
	explicit
	tuple(allocator_arg_t __tag, const _Alloc& __a)
	: _Inherited(__tag, __a) { }

      template<typename _Alloc, bool _NotEmpty = (sizeof...(_Elements) >= 1),
	       _ImplicitCtor<_NotEmpty, const _Elements&...> = true>
	_GLIBCXX20_CONSTEXPR
	tuple(allocator_arg_t __tag, const _Alloc& __a,
	      const __type_identity_t<_Elements>&... __elements)
	: _Inherited(__tag, __a, __elements...) { }

      template<typename _Alloc, bool _NotEmpty = (sizeof...(_Elements) >= 1),
	       _ExplicitCtor<_NotEmpty, const _Elements&...> = false>
	_GLIBCXX20_CONSTEXPR
	explicit
	tuple(allocator_arg_t __tag, const _Alloc& __a,
	      const __type_identity_t<_Elements>&... __elements)
	: _Inherited(__tag, __a, __elements...) { }

      template<typename _Alloc, typename... _UElements,
	       bool _Valid = __valid_args<_UElements...>(),
	       _ImplicitCtor<_Valid, _UElements...> = true>
	_GLIBCXX20_CONSTEXPR
	tuple(allocator_arg_t __tag, const _Alloc& __a,
	      _UElements&&... __elements)
	: _Inherited(__tag, __a, std::forward<_UElements>(__elements)...)
	{ __glibcxx_no_dangling_refs(_UElements&&); }

      template<typename _Alloc, typename... _UElements,
		 bool _Valid = __valid_args<_UElements...>(),
	       _ExplicitCtor<_Valid, _UElements...> = false>
	_GLIBCXX20_CONSTEXPR
	explicit
	tuple(allocator_arg_t __tag, const _Alloc& __a,
	      _UElements&&... __elements)
	: _Inherited(__tag, __a, std::forward<_UElements>(__elements)...)
	{ __glibcxx_no_dangling_refs(_UElements&&); }

      template<typename _Alloc>
	_GLIBCXX20_CONSTEXPR
	tuple(allocator_arg_t __tag, const _Alloc& __a, const tuple& __in)
	: _Inherited(__tag, __a, static_cast<const _Inherited&>(__in)) { }

      template<typename _Alloc>
	_GLIBCXX20_CONSTEXPR
	tuple(allocator_arg_t __tag, const _Alloc& __a, tuple&& __in)
	: _Inherited(__tag, __a, static_cast<_Inherited&&>(__in)) { }

      template<typename _Alloc, typename... _UElements,
	       bool _Valid = (sizeof...(_Elements) == sizeof...(_UElements))
			     && !__use_other_ctor<const tuple<_UElements...>&>(),
	       _ImplicitCtor<_Valid, const _UElements&...> = true>
	_GLIBCXX20_CONSTEXPR
	tuple(allocator_arg_t __tag, const _Alloc& __a,
	      const tuple<_UElements...>& __in)
	: _Inherited(__tag, __a,
		     static_cast<const _Tuple_impl<0, _UElements...>&>(__in))
	{ __glibcxx_no_dangling_refs(const _UElements&); }

      template<typename _Alloc, typename... _UElements,
	       bool _Valid = (sizeof...(_Elements) == sizeof...(_UElements))
			     && !__use_other_ctor<const tuple<_UElements...>&>(),
	       _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<const _Tuple_impl<0, _UElements...>&>(__in))
	{ __glibcxx_no_dangling_refs(const _UElements&); }

      template<typename _Alloc, typename... _UElements,
	       bool _Valid = (sizeof...(_Elements) == sizeof...(_UElements))
			     && !__use_other_ctor<tuple<_UElements...>&&>(),
	       _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))
	{ __glibcxx_no_dangling_refs(_UElements&&); }

      template<typename _Alloc, typename... _UElements,
	       bool _Valid = (sizeof...(_Elements) == sizeof...(_UElements))
			     && !__use_other_ctor<tuple<_UElements...>&&>(),
	       _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))
	{ __glibcxx_no_dangling_refs(_UElements&&); }
#endif // concepts && conditional_explicit

      // tuple assignment

#if __cpp_concepts && __cpp_consteval // >= C++20
    private:
      template<typename... _UTypes>
	static consteval bool
	__assignable()
	{
	  if constexpr (sizeof...(_UTypes) == sizeof...(_Elements))
	    return __and_v<is_assignable<_Elements&, _UTypes>...>;
	  else
	    return false;
	}

      template<typename... _UTypes>
	static consteval bool
	__nothrow_assignable()
	{
	  if constexpr (sizeof...(_UTypes) == sizeof...(_Elements))
	    return __and_v<is_nothrow_assignable<_Elements&, _UTypes>...>;
	  else
	    return false;
	}

#if __cpp_lib_ranges_zip // >= C++23
      template<typename... _UTypes>
	static consteval bool
	__const_assignable()
	{
	  if constexpr (sizeof...(_UTypes) == sizeof...(_Elements))
	    return __and_v<is_assignable<const _Elements&, _UTypes>...>;
	  else
	    return false;
	}
#endif // C++23

#if __cpp_lib_tuple_like // >= C++23
      template<typename _UTuple>
	static consteval bool
	__assignable_from_tuple_like()
	{
	  return []<size_t... _Is>(index_sequence<_Is...>) {
	    return __assignable<decltype(std::get<_Is>(std::declval<_UTuple>()))...>();
	  }(index_sequence_for<_Elements...>{});
	}

      template<typename _UTuple>
	static consteval bool
	__const_assignable_from_tuple_like()
	{
	  return []<size_t... _Is>(index_sequence<_Is...>) {
	    return __const_assignable<decltype(std::get<_Is>(std::declval<_UTuple>()))...>();
	  }(index_sequence_for<_Elements...>{});
	}
#endif // C++23

    public:

      tuple& operator=(const tuple& __u) = delete;

      constexpr tuple&
      operator=(const tuple& __u)
      noexcept(__nothrow_assignable<const _Elements&...>())
      requires (__assignable<const _Elements&...>())
      {
	this->_M_assign(__u);
	return *this;
      }

      constexpr tuple&
      operator=(tuple&& __u)
      noexcept(__nothrow_assignable<_Elements...>())
      requires (__assignable<_Elements...>())
      {
	this->_M_assign(std::move(__u));
	return *this;
      }

      template<typename... _UTypes>
	requires (__assignable<const _UTypes&...>())
	constexpr tuple&
	operator=(const tuple<_UTypes...>& __u)
	noexcept(__nothrow_assignable<const _UTypes&...>())
	{
	  this->_M_assign(__u);
	  return *this;
	}

      template<typename... _UTypes>
	requires (__assignable<_UTypes...>())
	constexpr tuple&
	operator=(tuple<_UTypes...>&& __u)
	noexcept(__nothrow_assignable<_UTypes...>())
	{
	  this->_M_assign(std::move(__u));
	  return *this;
	}

#if __cpp_lib_ranges_zip // >= C++23
      constexpr const tuple&
      operator=(const tuple& __u) const
      requires (__const_assignable<const _Elements&...>())
      {
	this->_M_assign(__u);
	return *this;
      }

      constexpr const tuple&
      operator=(tuple&& __u) const
      requires (__const_assignable<_Elements...>())
      {
	this->_M_assign(std::move(__u));
	return *this;
      }

      template<typename... _UTypes>
	constexpr const tuple&
	operator=(const tuple<_UTypes...>& __u) const
	requires (__const_assignable<const _UTypes&...>())
	{
	  this->_M_assign(__u);
	  return *this;
	}

      template<typename... _UTypes>
	constexpr const tuple&
	operator=(tuple<_UTypes...>&& __u) const
	requires (__const_assignable<_UTypes...>())
	{
	  this->_M_assign(std::move(__u));
	  return *this;
	}
#endif // C++23

      template<typename _U1, typename _U2>
	requires (__assignable<const _U1&, const _U2&>())
	constexpr tuple&
	operator=(const pair<_U1, _U2>& __u)
	noexcept(__nothrow_assignable<const _U1&, const _U2&>())
	{
	  this->_M_head(*this) = __u.first;
	  this->_M_tail(*this)._M_head(*this) = __u.second;
	  return *this;
	}

      template<typename _U1, typename _U2>
	requires (__assignable<_U1, _U2>())
	constexpr tuple&
	operator=(pair<_U1, _U2>&& __u)
	noexcept(__nothrow_assignable<_U1, _U2>())
	{
	  this->_M_head(*this) = std::forward<_U1>(__u.first);
	  this->_M_tail(*this)._M_head(*this) = std::forward<_U2>(__u.second);
	  return *this;
	}

#if __cpp_lib_ranges_zip // >= C++23
      template<typename _U1, typename _U2>
	requires (__const_assignable<const _U1&, const _U2>())
	constexpr const tuple&
	operator=(const pair<_U1, _U2>& __u) const
	{
	  this->_M_head(*this) = __u.first;
	  this->_M_tail(*this)._M_head(*this) = __u.second;
	  return *this;
	}

      template<typename _U1, typename _U2>
	requires (__const_assignable<_U1, _U2>())
	constexpr const tuple&
	operator=(pair<_U1, _U2>&& __u) const
	{
	  this->_M_head(*this) = std::forward<_U1>(__u.first);
	  this->_M_tail(*this)._M_head(*this) = std::forward<_U2>(__u.second);
	  return *this;
	}
#endif // C++23

#if __cpp_lib_tuple_like // >= C++23
      template<__eligible_tuple_like<tuple> _UTuple>
	requires (__assignable_from_tuple_like<_UTuple>())
	constexpr tuple&
	operator=(_UTuple&& __u)
	{
	  this->_M_assign(__tuple_like_tag_t{}, std::forward<_UTuple>(__u));
	  return *this;
	}

      template<__eligible_tuple_like<tuple> _UTuple>
	requires (__const_assignable_from_tuple_like<_UTuple>())
	constexpr const tuple&
	operator=(_UTuple&& __u) const
	{
	  this->_M_assign(__tuple_like_tag_t{}, std::forward<_UTuple>(__u));
	  return *this;
	}

      template<__tuple_like _UTuple>
	requires (!__is_tuple_v<_UTuple>)
	friend constexpr bool
	operator== [[nodiscard]] (const tuple& __t, const _UTuple& __u)
	{
	  static_assert(sizeof...(_Elements) == tuple_size_v<_UTuple>,
	      "tuple objects can only be compared if they have equal sizes.");
	  return [&]<size_t... _Is>(index_sequence<_Is...>) {
	    return (bool(std::get<_Is>(__t) == std::get<_Is>(__u))
		    && ...);
	  }(index_sequence_for<_Elements...>{});
	}

      template<__tuple_like _UTuple,
	       typename = make_index_sequence<tuple_size_v<_UTuple>>>
	struct __tuple_like_common_comparison_category;

      template<__tuple_like _UTuple, size_t... _Is>
	requires requires
	  { typename void_t<__detail::__synth3way_t<_Elements, tuple_element_t<_Is, _UTuple>>...>; }
	struct __tuple_like_common_comparison_category<_UTuple, index_sequence<_Is...>>
	{
	  using type = common_comparison_category_t
	    <__detail::__synth3way_t<_Elements, tuple_element_t<_Is, _UTuple>>...>;
	};

      template<__tuple_like _UTuple>
	requires (!__is_tuple_v<_UTuple>)
	friend constexpr typename __tuple_like_common_comparison_category<_UTuple>::type
	operator<=>(const tuple& __t, const _UTuple& __u)
	{
	  using _Cat = typename __tuple_like_common_comparison_category<_UTuple>::type;
	  return std::__tuple_cmp<_Cat>(__t, __u, index_sequence_for<_Elements...>());
	}
#endif // C++23

#else // ! (concepts && consteval)

    private:
      template<typename... _UElements>
	static constexpr
	__enable_if_t<sizeof...(_UElements) == sizeof...(_Elements), bool>
	__assignable()
	{ return __and_<is_assignable<_Elements&, _UElements>...>::value; }

      // Condition for noexcept-specifier of an assignment operator.
      template<typename... _UElements>
	static constexpr bool __nothrow_assignable()
	{
	  return
	    __and_<is_nothrow_assignable<_Elements&, _UElements>...>::value;
	}

    public:

      _GLIBCXX20_CONSTEXPR
      tuple&
      operator=(__conditional_t<__assignable<const _Elements&...>(),
				const tuple&,
				const __nonesuch&> __in)
      noexcept(__nothrow_assignable<const _Elements&...>())
      {
	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<typename... _UElements>
	_GLIBCXX20_CONSTEXPR
	__enable_if_t<__assignable<const _UElements&...>(), tuple&>
	operator=(const tuple<_UElements...>& __in)
	noexcept(__nothrow_assignable<const _UElements&...>())
	{
	  this->_M_assign(__in);
	  return *this;
	}

      template<typename... _UElements>
	_GLIBCXX20_CONSTEXPR
	__enable_if_t<__assignable<_UElements...>(), tuple&>
	operator=(tuple<_UElements...>&& __in)
	noexcept(__nothrow_assignable<_UElements...>())
	{
	  this->_M_assign(std::move(__in));
	  return *this;
	}
#endif // concepts && consteval

      // tuple swap
      _GLIBCXX20_CONSTEXPR
      void
      swap(tuple& __in)
      noexcept(__and_<__is_nothrow_swappable<_Elements>...>::value)
      { _Inherited::_M_swap(__in); }

#if __cpp_lib_ranges_zip // >= C++23
      // 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<const _Elements>...>)
      requires (is_swappable_v<const _Elements> && ...)
      { _Inherited::_M_swap(__in); }
#endif // C++23
    };

#if __cpp_deduction_guides >= 201606
  template<typename... _UTypes>
    tuple(_UTypes...) -> tuple<_UTypes...>;
  template<typename _T1, typename _T2>
    tuple(pair<_T1, _T2>) -> tuple<_T1, _T2>;
  template<typename _Alloc, typename... _UTypes>
    tuple(allocator_arg_t, _Alloc, _UTypes...) -> tuple<_UTypes...>;
  template<typename _Alloc, typename _T1, typename _T2>
    tuple(allocator_arg_t, _Alloc, pair<_T1, _T2>) -> tuple<_T1, _T2>;
  template<typename _Alloc, typename... _UTypes>
    tuple(allocator_arg_t, _Alloc, tuple<_UTypes...>) -> tuple<_UTypes...>;
#endif

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Winvalid-specialization"
  // Explicit specialization, zero-element tuple.
  template<>
    class tuple<>
    {
    public:
      // We need the default since we're going to define no-op
      // allocator constructors.
      tuple() = default;
      // Defaulted copy operations to maintain trivial copyability.
      // and support non-const assignment expressions.
      tuple(const tuple&) = default;
      tuple& operator=(const tuple&) = default;

      _GLIBCXX20_CONSTEXPR
      void swap(tuple&) noexcept { /* no-op */ }

#if __cpp_lib_ranges_zip // >= C++23
      template<same_as<tuple> _Tuple = tuple>
      constexpr const tuple&
      operator=(const _Tuple&) const noexcept
      { return *this; }

      constexpr void swap(const tuple&) const noexcept
      { /* no-op */ }
#endif

      // No-op allocator constructors.
      template<typename _Alloc>
	_GLIBCXX20_CONSTEXPR
	tuple(allocator_arg_t, const _Alloc&) noexcept { }
      template<typename _Alloc>
	_GLIBCXX20_CONSTEXPR
	tuple(allocator_arg_t, const _Alloc&, const tuple&) noexcept { }

#if __cpp_lib_tuple_like // >= C++23
      template<__tuple_like _UTuple>
	requires (!is_same_v<remove_cvref_t<_UTuple>, tuple>)
		  && (!is_same_v<remove_cvref_t<_UTuple>, allocator_arg_t>)
		  && (tuple_size_v<remove_cvref_t<_UTuple>> == 0)
      constexpr
      tuple(_UTuple&&) noexcept { }

      template<typename _Alloc, __tuple_like _UTuple>
	requires (!is_same_v<remove_cvref_t<_UTuple>, tuple>)
		  && (tuple_size_v<remove_cvref_t<_UTuple>> == 0)
      constexpr
      tuple(allocator_arg_t, const _Alloc&, _UTuple&&) noexcept { }

      template<__tuple_like _UTuple>
	requires (!is_same_v<remove_cvref_t<_UTuple>, tuple>)
		  && (tuple_size_v<remove_cvref_t<_UTuple>> == 0)
      constexpr tuple&
      operator=(_UTuple&&) noexcept
      { return *this; }

      template<__tuple_like _UTuple>
	requires (!is_same_v<remove_cvref_t<_UTuple>, tuple>)
		  && (tuple_size_v<remove_cvref_t<_UTuple>> == 0)
      constexpr const tuple&
      operator=(_UTuple&&) const noexcept
      { return *this; }

      template<__tuple_like _UTuple>
	requires (!__is_tuple_v<_UTuple>) && (tuple_size_v<_UTuple> == 0)
      [[nodiscard]]
      friend constexpr bool
      operator==(const tuple&, const _UTuple&) noexcept
      { return true; }

      template<__tuple_like _UTuple>
	requires (!__is_tuple_v<_UTuple>) && (tuple_size_v<_UTuple> == 0)
      friend constexpr strong_ordering
      operator<=>(const tuple&, const _UTuple&) noexcept
      { return strong_ordering::equal; }
#endif // C++23
    };

#if !(__cpp_concepts && __cpp_consteval && __cpp_conditional_explicit) // !C++20
  /// Partial specialization, 2-element tuple.
  /// Includes construction and assignment from a pair.
  template<typename _T1, typename _T2>
    class tuple<_T1, _T2> : public _Tuple_impl<0, _T1, _T2>
    {
      typedef _Tuple_impl<0, _T1, _T2> _Inherited;

      // Constraint for non-explicit default constructor
      template<bool _Dummy, typename _U1, typename _U2>
	using _ImplicitDefaultCtor = __enable_if_t<
	  _TupleConstraints<_Dummy, _U1, _U2>::
	    __is_implicitly_default_constructible(),
	  bool>;

      // Constraint for explicit default constructor
      template<bool _Dummy, typename _U1, typename _U2>
	using _ExplicitDefaultCtor = __enable_if_t<
	  _TupleConstraints<_Dummy, _U1, _U2>::
	    __is_explicitly_default_constructible(),
	  bool>;

      template<bool _Dummy>
	using _TCC = _TupleConstraints<_Dummy, _T1, _T2>;

      // Constraint for non-explicit constructors
      template<bool _Cond, typename _U1, typename _U2>
	using _ImplicitCtor = __enable_if_t<
	  _TCC<_Cond>::template __is_implicitly_constructible<_U1, _U2>(),
	  bool>;

      // Constraint for non-explicit constructors
      template<bool _Cond, typename _U1, typename _U2>
	using _ExplicitCtor = __enable_if_t<
	  _TCC<_Cond>::template __is_explicitly_constructible<_U1, _U2>(),
	  bool>;

      template<typename _U1, typename _U2>
	static constexpr bool __assignable()
	{
	  return __and_<is_assignable<_T1&, _U1>,
			is_assignable<_T2&, _U2>>::value;
	}

      template<typename _U1, typename _U2>
	static constexpr bool __nothrow_assignable()
	{
	  return __and_<is_nothrow_assignable<_T1&, _U1>,
			is_nothrow_assignable<_T2&, _U2>>::value;
	}

      template<typename _U1, typename _U2>
	static constexpr bool __nothrow_constructible()
	{
	  return __and_<is_nothrow_constructible<_T1, _U1>,
			    is_nothrow_constructible<_T2, _U2>>::value;
	}

      static constexpr bool __nothrow_default_constructible()
      {
	return __and_<is_nothrow_default_constructible<_T1>,
		      is_nothrow_default_constructible<_T2>>::value;
      }

      template<typename _U1>
	static constexpr bool __is_alloc_arg()
	{ return is_same<__remove_cvref_t<_U1>, allocator_arg_t>::value; }

      /// @cond undocumented
#undef __glibcxx_no_dangling_refs
      // Error if construction from _U1 and _U2 would create a dangling ref.
#if __has_builtin(__reference_constructs_from_temporary) \
      && defined _GLIBCXX_DEBUG
# define __glibcxx_no_dangling_refs(_U1, _U2) \
  static_assert(!__reference_constructs_from_temporary(_T1, _U1) \
	       && !__reference_constructs_from_temporary(_T2, _U2), \
		"std::tuple constructor creates a dangling reference")
#else
# define __glibcxx_no_dangling_refs(_U1, _U2)
#endif
      /// @endcond

    public:
      template<bool _Dummy = true,
	       _ImplicitDefaultCtor<_Dummy, _T1, _T2> = true>
	constexpr
	tuple()
	noexcept(__nothrow_default_constructible())
	: _Inherited() { }

      template<bool _Dummy = true,
	       _ExplicitDefaultCtor<_Dummy, _T1, _T2> = false>
	explicit constexpr
	tuple()
	noexcept(__nothrow_default_constructible())
	: _Inherited() { }

      template<bool _Dummy = true,
	       _ImplicitCtor<_Dummy, const _T1&, const _T2&> = true>
	constexpr
	tuple(const _T1& __a1, const _T2& __a2)
	noexcept(__nothrow_constructible<const _T1&, const _T2&>())
	: _Inherited(__a1, __a2) { }

      template<bool _Dummy = true,
	       _ExplicitCtor<_Dummy, const _T1&, const _T2&> = false>
	explicit constexpr
	tuple(const _T1& __a1, const _T2& __a2)
	noexcept(__nothrow_constructible<const _T1&, const _T2&>())
	: _Inherited(__a1, __a2) { }

      template<typename _U1, typename _U2,
	       _ImplicitCtor<!__is_alloc_arg<_U1>(), _U1, _U2> = true>
	constexpr
	tuple(_U1&& __a1, _U2&& __a2)
	noexcept(__nothrow_constructible<_U1, _U2>())
	: _Inherited(std::forward<_U1>(__a1), std::forward<_U2>(__a2))
	{ __glibcxx_no_dangling_refs(_U1&&, _U2&&); }

      template<typename _U1, typename _U2,
	       _ExplicitCtor<!__is_alloc_arg<_U1>(), _U1, _U2> = false>
	explicit constexpr
	tuple(_U1&& __a1, _U2&& __a2)
	noexcept(__nothrow_constructible<_U1, _U2>())
	: _Inherited(std::forward<_U1>(__a1), std::forward<_U2>(__a2))
	{ __glibcxx_no_dangling_refs(_U1&&, _U2&&); }

      constexpr tuple(const tuple&) = default;

      constexpr tuple(tuple&&) = default;

      template<typename _U1, typename _U2,
	       _ImplicitCtor<true, const _U1&, const _U2&> = true>
	constexpr
	tuple(const tuple<_U1, _U2>& __in)
	noexcept(__nothrow_constructible<const _U1&, const _U2&>())
	: _Inherited(static_cast<const _Tuple_impl<0, _U1, _U2>&>(__in))
	{ __glibcxx_no_dangling_refs(const _U1&, const _U2&); }

      template<typename _U1, typename _U2,
	       _ExplicitCtor<true, const _U1&, const _U2&> = false>
	explicit constexpr
	tuple(const tuple<_U1, _U2>& __in)
	noexcept(__nothrow_constructible<const _U1&, const _U2&>())
	: _Inherited(static_cast<const _Tuple_impl<0, _U1, _U2>&>(__in))
	{ __glibcxx_no_dangling_refs(const _U1&, const _U2&); }

      template<typename _U1, typename _U2,
	       _ImplicitCtor<true, _U1, _U2> = true>
	constexpr
	tuple(tuple<_U1, _U2>&& __in)
	noexcept(__nothrow_constructible<_U1, _U2>())
	: _Inherited(static_cast<_Tuple_impl<0, _U1, _U2>&&>(__in))
	{ __glibcxx_no_dangling_refs(_U1&&, _U2&&); }

      template<typename _U1, typename _U2,
	       _ExplicitCtor<true, _U1, _U2> = false>
	explicit constexpr
	tuple(tuple<_U1, _U2>&& __in)
	noexcept(__nothrow_constructible<_U1, _U2>())
	: _Inherited(static_cast<_Tuple_impl<0, _U1, _U2>&&>(__in))
	{ __glibcxx_no_dangling_refs(_U1&&, _U2&&); }

      template<typename _U1, typename _U2,
	       _ImplicitCtor<true, const _U1&, const _U2&> = true>
	constexpr
	tuple(const pair<_U1, _U2>& __in)
	noexcept(__nothrow_constructible<const _U1&, const _U2&>())
	: _Inherited(__in.first, __in.second)
	{ __glibcxx_no_dangling_refs(const _U1&, const _U2&); }

      template<typename _U1, typename _U2,
	       _ExplicitCtor<true, const _U1&, const _U2&> = false>
	explicit constexpr
	tuple(const pair<_U1, _U2>& __in)
	noexcept(__nothrow_constructible<const _U1&, const _U2&>())
	: _Inherited(__in.first, __in.second)
	{ __glibcxx_no_dangling_refs(const _U1&, const _U2&); }

      template<typename _U1, typename _U2,
	       _ImplicitCtor<true, _U1, _U2> = true>
	constexpr
	tuple(pair<_U1, _U2>&& __in)
	noexcept(__nothrow_constructible<_U1, _U2>())
	: _Inherited(std::forward<_U1>(__in.first),
		     std::forward<_U2>(__in.second))
	{ __glibcxx_no_dangling_refs(_U1&&, _U2&&); }

      template<typename _U1, typename _U2,
	       _ExplicitCtor<true, _U1, _U2> = false>
	explicit constexpr
	tuple(pair<_U1, _U2>&& __in)
	noexcept(__nothrow_constructible<_U1, _U2>())
	: _Inherited(std::forward<_U1>(__in.first),
		     std::forward<_U2>(__in.second))
	{ __glibcxx_no_dangling_refs(_U1&&, _U2&&); }

      // Allocator-extended constructors.

      template<typename _Alloc,
	       _ImplicitDefaultCtor<is_object<_Alloc>::value, _T1, _T2> = true>
	_GLIBCXX20_CONSTEXPR
	tuple(allocator_arg_t __tag, const _Alloc& __a)
	: _Inherited(__tag, __a) { }

      template<typename _Alloc,
	       _ExplicitDefaultCtor<is_object<_Alloc>::value, _T1, _T2> = false>
	_GLIBCXX20_CONSTEXPR
	explicit
	tuple(allocator_arg_t __tag, const _Alloc& __a)
	: _Inherited(__tag, __a) { }

      template<typename _Alloc, bool _Dummy = true,
	       _ImplicitCtor<_Dummy, const _T1&, const _T2&> = true>
	_GLIBCXX20_CONSTEXPR
	tuple(allocator_arg_t __tag, const _Alloc& __a,
	      const _T1& __a1, const _T2& __a2)
	: _Inherited(__tag, __a, __a1, __a2) { }

      template<typename _Alloc, bool _Dummy = true,
	       _ExplicitCtor<_Dummy, const _T1&, const _T2&> = false>
	explicit
	_GLIBCXX20_CONSTEXPR
	tuple(allocator_arg_t __tag, const _Alloc& __a,
	      const _T1& __a1, const _T2& __a2)
	: _Inherited(__tag, __a, __a1, __a2) { }

      template<typename _Alloc, typename _U1, typename _U2,
	       _ImplicitCtor<true, _U1, _U2> = 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))
	{ __glibcxx_no_dangling_refs(_U1&&, _U2&&); }

      template<typename _Alloc, typename _U1, typename _U2,
	       _ExplicitCtor<true, _U1, _U2> = 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))
	{ __glibcxx_no_dangling_refs(_U1&&, _U2&&); }

      template<typename _Alloc>
	_GLIBCXX20_CONSTEXPR
	tuple(allocator_arg_t __tag, const _Alloc& __a, const tuple& __in)
	: _Inherited(__tag, __a, static_cast<const _Inherited&>(__in)) { }

      template<typename _Alloc>
	_GLIBCXX20_CONSTEXPR
	tuple(allocator_arg_t __tag, const _Alloc& __a, tuple&& __in)
	: _Inherited(__tag, __a, static_cast<_Inherited&&>(__in)) { }

      template<typename _Alloc, typename _U1, typename _U2,
	       _ImplicitCtor<true, const _U1&, const _U2&> = true>
	_GLIBCXX20_CONSTEXPR
	tuple(allocator_arg_t __tag, const _Alloc& __a,
	      const tuple<_U1, _U2>& __in)
	: _Inherited(__tag, __a,
		     static_cast<const _Tuple_impl<0, _U1, _U2>&>(__in))
	{ __glibcxx_no_dangling_refs(const _U1&, const _U2&); }

      template<typename _Alloc, typename _U1, typename _U2,
	       _ExplicitCtor<true, const _U1&, const _U2&> = false>
	explicit
	_GLIBCXX20_CONSTEXPR
	tuple(allocator_arg_t __tag, const _Alloc& __a,
	      const tuple<_U1, _U2>& __in)
	: _Inherited(__tag, __a,
		     static_cast<const _Tuple_impl<0, _U1, _U2>&>(__in))
	{ __glibcxx_no_dangling_refs(const _U1&, const _U2&); }

      template<typename _Alloc, typename _U1, typename _U2,
	       _ImplicitCtor<true, _U1, _U2> = true>
	_GLIBCXX20_CONSTEXPR
	tuple(allocator_arg_t __tag, const _Alloc& __a, tuple<_U1, _U2>&& __in)
	: _Inherited(__tag, __a, static_cast<_Tuple_impl<0, _U1, _U2>&&>(__in))
	{ __glibcxx_no_dangling_refs(_U1&&, _U2&&); }

      template<typename _Alloc, typename _U1, typename _U2,
	       _ExplicitCtor<true, _U1, _U2> = false>
	explicit
	_GLIBCXX20_CONSTEXPR
	tuple(allocator_arg_t __tag, const _Alloc& __a, tuple<_U1, _U2>&& __in)
	: _Inherited(__tag, __a, static_cast<_Tuple_impl<0, _U1, _U2>&&>(__in))
	{ __glibcxx_no_dangling_refs(_U1&&, _U2&&); }

      template<typename _Alloc, typename _U1, typename _U2,
	       _ImplicitCtor<true, const _U1&, const _U2&> = true>
	_GLIBCXX20_CONSTEXPR
	tuple(allocator_arg_t __tag, const _Alloc& __a,
	      const pair<_U1, _U2>& __in)
	: _Inherited(__tag, __a, __in.first, __in.second)
	{ __glibcxx_no_dangling_refs(const _U1&, const _U2&); }

      template<typename _Alloc, typename _U1, typename _U2,
	       _ExplicitCtor<true, const _U1&, const _U2&> = false>
	explicit
	_GLIBCXX20_CONSTEXPR
	tuple(allocator_arg_t __tag, const _Alloc& __a,
	      const pair<_U1, _U2>& __in)
	: _Inherited(__tag, __a, __in.first, __in.second)
	{ __glibcxx_no_dangling_refs(const _U1&, const _U2&); }

      template<typename _Alloc, typename _U1, typename _U2,
	       _ImplicitCtor<true, _U1, _U2> = true>
	_GLIBCXX20_CONSTEXPR
	tuple(allocator_arg_t __tag, const _Alloc& __a, pair<_U1, _U2>&& __in)
	: _Inherited(__tag, __a, std::forward<_U1>(__in.first),
		     std::forward<_U2>(__in.second))
	{ __glibcxx_no_dangling_refs(_U1&&, _U2&&); }

      template<typename _Alloc, typename _U1, typename _U2,
	       _ExplicitCtor<true, _U1, _U2> = false>
	explicit
	_GLIBCXX20_CONSTEXPR
	tuple(allocator_arg_t __tag, const _Alloc& __a, pair<_U1, _U2>&& __in)
	: _Inherited(__tag, __a, std::forward<_U1>(__in.first),
		     std::forward<_U2>(__in.second))
	{ __glibcxx_no_dangling_refs(_U1&&, _U2&&); }

      // Tuple assignment.

      _GLIBCXX20_CONSTEXPR
      tuple&
      operator=(__conditional_t<__assignable<const _T1&, const _T2&>(),
				const tuple&,
				const __nonesuch&> __in)
      noexcept(__nothrow_assignable<const _T1&, const _T2&>())
      {
	this->_M_assign(__in);
	return *this;
      }

      _GLIBCXX20_CONSTEXPR
      tuple&
      operator=(__conditional_t<__assignable<_T1, _T2>(),
				tuple&&,
				__nonesuch&&> __in)
      noexcept(__nothrow_assignable<_T1, _T2>())
      {
	this->_M_assign(std::move(__in));
	return *this;
      }

      template<typename _U1, typename _U2>
	_GLIBCXX20_CONSTEXPR
	__enable_if_t<__assignable<const _U1&, const _U2&>(), tuple&>
	operator=(const tuple<_U1, _U2>& __in)
	noexcept(__nothrow_assignable<const _U1&, const _U2&>())
	{
	  this->_M_assign(__in);
	  return *this;
	}

      template<typename _U1, typename _U2>
	_GLIBCXX20_CONSTEXPR
	__enable_if_t<__assignable<_U1, _U2>(), tuple&>
	operator=(tuple<_U1, _U2>&& __in)
	noexcept(__nothrow_assignable<_U1, _U2>())
	{
	  this->_M_assign(std::move(__in));
	  return *this;
	}

      template<typename _U1, typename _U2>
	_GLIBCXX20_CONSTEXPR
	__enable_if_t<__assignable<const _U1&, const _U2&>(), tuple&>
	operator=(const pair<_U1, _U2>& __in)
	noexcept(__nothrow_assignable<const _U1&, const _U2&>())
	{
	  this->_M_head(*this) = __in.first;
	  this->_M_tail(*this)._M_head(*this) = __in.second;
	  return *this;
	}

      template<typename _U1, typename _U2>
	_GLIBCXX20_CONSTEXPR
	__enable_if_t<__assignable<_U1, _U2>(), tuple&>
	operator=(pair<_U1, _U2>&& __in)
	noexcept(__nothrow_assignable<_U1, _U2>())
	{
	  this->_M_head(*this) = std::forward<_U1>(__in.first);
	  this->_M_tail(*this)._M_head(*this) = std::forward<_U2>(__in.second);
	  return *this;
	}

      _GLIBCXX20_CONSTEXPR
      void
      swap(tuple& __in)
      noexcept(__and_<__is_nothrow_swappable<_T1>,
		      __is_nothrow_swappable<_T2>>::value)
      { _Inherited::_M_swap(__in); }
    };
#endif // concepts && conditional_explicit
#pragma GCC diagnostic pop

  /// class tuple_size
  template<typename... _Elements>
    struct tuple_size<tuple<_Elements...>>
    : public integral_constant<size_t, sizeof...(_Elements)> { };

#if __cplusplus >= 201703L
  template<typename... _Types>
    inline constexpr size_t tuple_size_v<tuple<_Types...>>
      = sizeof...(_Types);

  template<typename... _Types>
    inline constexpr size_t tuple_size_v<const tuple<_Types...>>
      = sizeof...(_Types);
#endif

  /// Trait to get the Ith element type from a tuple.
  template<size_t __i, typename... _Types>
    struct tuple_element<__i, tuple<_Types...>>
    {
      static_assert(__i < sizeof...(_Types), "tuple index must be in range");

      using type = typename _Nth_type<__i, _Types...>::type;
    };

  template<size_t __i, typename _Head, typename... _Tail>
    constexpr _Head&
    __get_helper(_Tuple_impl<__i, _Head, _Tail...>& __t) noexcept
    { return _Tuple_impl<__i, _Head, _Tail...>::_M_head(__t); }

  template<size_t __i, typename _Head, typename... _Tail>
    constexpr const _Head&
    __get_helper(const _Tuple_impl<__i, _Head, _Tail...>& __t) noexcept
    { return _Tuple_impl<__i, _Head, _Tail...>::_M_head(__t); }

  // Deleted overload to improve diagnostics for invalid indices
  template<size_t __i, typename... _Types>
    __enable_if_t<(__i >= sizeof...(_Types))>
    __get_helper(const tuple<_Types...>&) = delete;

  /// Return a reference to the ith element of a tuple.
  template<size_t __i, typename... _Elements>
    constexpr __tuple_element_t<__i, tuple<_Elements...>>&
    get(tuple<_Elements...>& __t) noexcept
    { return std::__get_helper<__i>(__t); }

  /// Return a const reference to the ith element of a const tuple.
  template<size_t __i, typename... _Elements>
    constexpr const __tuple_element_t<__i, tuple<_Elements...>>&
    get(const tuple<_Elements...>& __t) noexcept
    { return std::__get_helper<__i>(__t); }

  /// Return an rvalue reference to the ith element of a tuple rvalue.
  template<size_t __i, typename... _Elements>
    constexpr __tuple_element_t<__i, tuple<_Elements...>>&&
    get(tuple<_Elements...>&& __t) noexcept
    {
      typedef __tuple_element_t<__i, tuple<_Elements...>> __element_type;
      return std::forward<__element_type>(std::__get_helper<__i>(__t));
    }

  /// Return a const rvalue reference to the ith element of a const tuple rvalue.
  template<size_t __i, typename... _Elements>
    constexpr const __tuple_element_t<__i, tuple<_Elements...>>&&
    get(const tuple<_Elements...>&& __t) noexcept
    {
      typedef __tuple_element_t<__i, tuple<_Elements...>> __element_type;
      return std::forward<const __element_type>(std::__get_helper<__i>(__t));
    }

  /// @cond undocumented
  // Deleted overload chosen for invalid indices.
  template<size_t __i, typename... _Elements>
    constexpr __enable_if_t<(__i >= sizeof...(_Elements))>
    get(const tuple<_Elements...>&) = delete;
  /// @endcond

#ifdef __cpp_lib_tuples_by_type // C++ >= 14
  /// Return a reference to the unique element of type _Tp of a tuple.
  template <typename _Tp, typename... _Types>
    constexpr _Tp&
    get(tuple<_Types...>& __t) noexcept
    {
      constexpr size_t __idx = __find_uniq_type_in_pack<_Tp, _Types...>();
      static_assert(__idx < sizeof...(_Types),
	  "the type T in std::get<T> must occur exactly once in the tuple");
      return std::__get_helper<__idx>(__t);
    }

  /// Return a reference to the unique element of type _Tp of a tuple rvalue.
  template <typename _Tp, typename... _Types>
    constexpr _Tp&&
    get(tuple<_Types...>&& __t) noexcept
    {
      constexpr size_t __idx = __find_uniq_type_in_pack<_Tp, _Types...>();
      static_assert(__idx < sizeof...(_Types),
	  "the type T in std::get<T> must occur exactly once in the tuple");
      return std::forward<_Tp>(std::__get_helper<__idx>(__t));
    }

  /// Return a const reference to the unique element of type _Tp of a tuple.
  template <typename _Tp, typename... _Types>
    constexpr const _Tp&
    get(const tuple<_Types...>& __t) noexcept
    {
      constexpr size_t __idx = __find_uniq_type_in_pack<_Tp, _Types...>();
      static_assert(__idx < sizeof...(_Types),
	  "the type T in std::get<T> must occur exactly once in the tuple");
      return std::__get_helper<__idx>(__t);
    }

  /// Return a const reference to the unique element of type _Tp of
  /// a const tuple rvalue.
  template <typename _Tp, typename... _Types>
    constexpr const _Tp&&
    get(const tuple<_Types...>&& __t) noexcept
    {
      constexpr size_t __idx = __find_uniq_type_in_pack<_Tp, _Types...>();
      static_assert(__idx < sizeof...(_Types),
	  "the type T in std::get<T> must occur exactly once in the tuple");
      return std::forward<const _Tp>(std::__get_helper<__idx>(__t));
    }
#endif

#if __cpp_lib_three_way_comparison
  template<typename... _Tps, typename... _Ups>
    requires (sizeof...(_Tps) == sizeof...(_Ups))
      && (requires (const _Tps& __t, const _Ups& __u) {
	{ __t == __u } -> __detail::__boolean_testable;
      } && ...)
    constexpr bool
    operator== [[nodiscard]] (const tuple<_Tps...>& __t,
			      const tuple<_Ups...>& __u)
    {
      return [&]<size_t... _Inds>(index_sequence<_Inds...>) {
	// Fold == over the tuples until non-equal elements are found.
	return (bool(std::get<_Inds>(__t) == std::get<_Inds>(__u)) && ...);
      }(index_sequence_for<_Tps...>{});
    }

  template<typename _Cat, typename _Tp, typename _Up, typename _IndexSeq>
    [[nodiscard]]
    constexpr _Cat
    __tuple_cmp(const _Tp& __t, const _Up& __u, _IndexSeq __indices)
    {
      _Cat __c = _Cat::equivalent;

      // Set __c to the comparison result of two corresponding elements.
      // Return true they are equivalent.
      auto __cmp = [&]<size_t _Ind>(integral_constant<size_t, _Ind>) {
	__c = __detail::__synth3way(std::get<_Ind>(__t), std::get<_Ind>(__u));
	return __c == 0;
      };

      [&]<size_t... _Inds>(index_sequence<_Inds...>) {
	// Fold __cmp over the tuples until non-equivalent elements are found.
	(void)(__cmp(integral_constant<size_t, _Inds>{}) && ...);
      }(__indices);

      return __c;
    }

  template<typename... _Tps, typename... _Ups>
    requires (sizeof...(_Tps) == sizeof...(_Ups))
      && (requires { typename __detail::__synth3way_t<_Tps, _Ups>; } && ...)
    constexpr
    common_comparison_category_t<__detail::__synth3way_t<_Tps, _Ups>...>
    operator<=> [[nodiscard]] (const tuple<_Tps...>& __t,
			       const tuple<_Ups...>& __u)
    {
      using _Cat
	= common_comparison_category_t<__detail::__synth3way_t<_Tps, _Ups>...>;
      return std::__tuple_cmp<_Cat>(__t, __u, index_sequence_for<_Tps...>());
    }
#else

  // This class performs the comparison operations on tuples
  template<typename _Tp, typename _Up, size_t __i, size_t __size>
    struct __tuple_compare
    {
      static constexpr bool
      __eq(const _Tp& __t, const _Up& __u)
      {
	return bool(std::get<__i>(__t) == std::get<__i>(__u))
	  && __tuple_compare<_Tp, _Up, __i + 1, __size>::__eq(__t, __u);
      }

      static constexpr bool
      __less(const _Tp& __t, const _Up& __u)
      {
	return bool(std::get<__i>(__t) < std::get<__i>(__u))
	  || (!bool(std::get<__i>(__u) < std::get<__i>(__t))
	      && __tuple_compare<_Tp, _Up, __i + 1, __size>::__less(__t, __u));
      }
    };

  template<typename _Tp, typename _Up, size_t __size>
    struct __tuple_compare<_Tp, _Up, __size, __size>
    {
      static constexpr bool
      __eq(const _Tp&, const _Up&) { return true; }

      static constexpr bool
      __less(const _Tp&, const _Up&) { return false; }
    };

  template<typename... _TElements, typename... _UElements>
    _GLIBCXX_NODISCARD
    constexpr bool
    operator==(const tuple<_TElements...>& __t,
	       const tuple<_UElements...>& __u)
    {
      static_assert(sizeof...(_TElements) == sizeof...(_UElements),
	  "tuple objects can only be compared if they have equal sizes.");
      using __compare = __tuple_compare<tuple<_TElements...>,
					tuple<_UElements...>,
					0, sizeof...(_TElements)>;
      return __compare::__eq(__t, __u);
    }

  template<typename... _TElements, typename... _UElements>
    _GLIBCXX_NODISCARD
    constexpr bool
    operator<(const tuple<_TElements...>& __t,
	      const tuple<_UElements...>& __u)
    {
      static_assert(sizeof...(_TElements) == sizeof...(_UElements),
	  "tuple objects can only be compared if they have equal sizes.");
      using __compare = __tuple_compare<tuple<_TElements...>,
					tuple<_UElements...>,
					0, sizeof...(_TElements)>;
      return __compare::__less(__t, __u);
    }

  template<typename... _TElements, typename... _UElements>
    _GLIBCXX_NODISCARD
    constexpr bool
    operator!=(const tuple<_TElements...>& __t,
	       const tuple<_UElements...>& __u)
    { return !(__t == __u); }

  template<typename... _TElements, typename... _UElements>
    _GLIBCXX_NODISCARD
    constexpr bool
    operator>(const tuple<_TElements...>& __t,
	      const tuple<_UElements...>& __u)
    { return __u < __t; }

  template<typename... _TElements, typename... _UElements>
    _GLIBCXX_NODISCARD
    constexpr bool
    operator<=(const tuple<_TElements...>& __t,
	       const tuple<_UElements...>& __u)
    { return !(__u < __t); }

  template<typename... _TElements, typename... _UElements>
    _GLIBCXX_NODISCARD
    constexpr bool
    operator>=(const tuple<_TElements...>& __t,
	       const tuple<_UElements...>& __u)
    { return !(__t < __u); }
#endif // three_way_comparison

  // NB: DR 705.
  /// Create a tuple containing copies of the arguments
  template<typename... _Elements>
    constexpr tuple<typename __decay_and_strip<_Elements>::__type...>
    make_tuple(_Elements&&... __args)
    {
      typedef tuple<typename __decay_and_strip<_Elements>::__type...>
	__result_type;
      return __result_type(std::forward<_Elements>(__args)...);
    }

  // _GLIBCXX_RESOLVE_LIB_DEFECTS
  // 2275. Why is forward_as_tuple not constexpr?
  /// Create a tuple of lvalue or rvalue references to the arguments
  template<typename... _Elements>
    constexpr tuple<_Elements&&...>
    forward_as_tuple(_Elements&&... __args) noexcept
    { return tuple<_Elements&&...>(std::forward<_Elements>(__args)...); }

  /// @cond undocumented
  template<typename _Tuple, typename _Idx_tuple>
    struct __do_make_tuple;

  template<typename _Tuple, size_t... _Idx>
    struct __do_make_tuple<_Tuple, _Index_tuple<_Idx...>>
    {
      using __type = tuple<__tuple_element_t<_Idx, _Tuple>...>;
    };

  // Returns the std::tuple equivalent of a tuple-like type.
  template<typename _Tuple,
	   typename _Tup = __remove_cvref_t<_Tuple>,
	   typename _Indices = _Build_index_tuple<tuple_size<_Tup>::value>>
    struct __make_tuple
    : __do_make_tuple<_Tup, typename _Indices::__type>
    { };

  // Combines several std::tuple types into a single one.
  template<typename...>
    struct __combine_tuples;

  template<>
    struct __combine_tuples<>
    {
      using __type = tuple<>;
    };

  template<typename... _Ts>
    struct __combine_tuples<tuple<_Ts...>>
    {
      using __type = tuple<_Ts...>;
    };

  template<typename... _T1s, typename... _T2s>
    struct __combine_tuples<tuple<_T1s...>, tuple<_T2s...>>
    {
      using __type = tuple<_T1s..., _T2s...>;
    };

  template<typename... _T1s, typename... _T2s, typename... _T3s,
	   typename... _Rem>
    struct __combine_tuples<tuple<_T1s...>, tuple<_T2s...>, tuple<_T3s...>,
			    _Rem...>
    {
      using _First = tuple<_T1s..., _T2s..., _T3s...>;
      using _Second = typename __combine_tuples<_Rem...>::__type;
      using __type = typename __combine_tuples<_First, _Second>::__type;
    };

  // Computes the result type of tuple_cat given a set of tuple-like types.
  template<typename... _Tpls>
    struct __tuple_cat_result
    {
      typedef typename __combine_tuples
        <typename __make_tuple<_Tpls>::__type...>::__type __type;
    };

  // Helper to determine the index set for the first tuple-like
  // type of a given set.
  template<typename...>
    struct __make_1st_indices;

  template<>
    struct __make_1st_indices<>
    {
      typedef _Index_tuple<> __type;
    };

  template<typename _Tp, typename... _Tpls>
    struct __make_1st_indices<_Tp, _Tpls...>
    {
      typedef typename _Build_index_tuple<tuple_size<
	typename remove_reference<_Tp>::type>::value>::__type __type;
    };

  // Performs the actual concatenation by step-wise expanding tuple-like
  // objects into the elements,  which are finally forwarded into the
  // result tuple.
  template<typename _Ret, typename _Indices, typename... _Tpls>
    struct __tuple_concater;

  template<typename _Ret, size_t... _Is, typename _Tp, typename... _Tpls>
    struct __tuple_concater<_Ret, _Index_tuple<_Is...>, _Tp, _Tpls...>
    {
      template<typename... _Us>
        static constexpr _Ret
        _S_do(_Tp&& __tp, _Tpls&&... __tps, _Us&&... __us)
        {
	  typedef typename __make_1st_indices<_Tpls...>::__type __idx;
	  typedef __tuple_concater<_Ret, __idx, _Tpls...>      __next;
	  return __next::_S_do(std::forward<_Tpls>(__tps)...,
			       std::forward<_Us>(__us)...,
			       std::get<_Is>(std::forward<_Tp>(__tp))...);
	}
    };

  template<typename _Ret>
    struct __tuple_concater<_Ret, _Index_tuple<>>
    {
      template<typename... _Us>
	static constexpr _Ret
	_S_do(_Us&&... __us)
        {
	  return _Ret(std::forward<_Us>(__us)...);
	}
    };

  template<typename... _Tps>
    struct __is_tuple_like_impl<tuple<_Tps...>> : true_type
    { };
  /// @endcond

  /// Create a `tuple` containing all elements from multiple tuple-like objects
#if __cpp_lib_tuple_like // >= C++23
  template<__tuple_like... _Tpls>
#else
  template<typename... _Tpls, typename = typename
           enable_if<__and_<__is_tuple_like<_Tpls>...>::value>::type>
#endif
    constexpr auto
    tuple_cat(_Tpls&&... __tpls)
    -> typename __tuple_cat_result<_Tpls...>::__type
    {
      typedef typename __tuple_cat_result<_Tpls...>::__type __ret;
      typedef typename __make_1st_indices<_Tpls...>::__type __idx;
      typedef __tuple_concater<__ret, __idx, _Tpls...> __concater;
      return __concater::_S_do(std::forward<_Tpls>(__tpls)...);
    }

  // _GLIBCXX_RESOLVE_LIB_DEFECTS
  // 2301. Why is tie not constexpr?
  /// Return a tuple of lvalue references bound to the arguments
  template<typename... _Elements>
    constexpr tuple<_Elements&...>
    tie(_Elements&... __args) noexcept
    { return tuple<_Elements&...>(__args...); }

  /// Exchange the values of two tuples
  template<typename... _Elements>
    _GLIBCXX20_CONSTEXPR
    inline
#if __cplusplus > 201402L || !defined(__STRICT_ANSI__) // c++1z or gnu++11
    // Constrained free swap overload, see p0185r1
    typename enable_if<__and_<__is_swappable<_Elements>...>::value
      >::type
#else
    void
#endif
    swap(tuple<_Elements...>& __x, tuple<_Elements...>& __y)
    noexcept(noexcept(__x.swap(__y)))
    { __x.swap(__y); }

#if __cpp_lib_ranges_zip // >= C++23
  /// Exchange the values of two const tuples (if const elements can be swapped)
  template<typename... _Elements>
    requires (is_swappable_v<const _Elements> && ...)
    constexpr void
    swap(const tuple<_Elements...>& __x, const tuple<_Elements...>& __y)
    noexcept(noexcept(__x.swap(__y)))
    { __x.swap(__y); }
#endif // C++23

#if __cplusplus > 201402L || !defined(__STRICT_ANSI__) // c++1z or gnu++11
  // _GLIBCXX_RESOLVE_LIB_DEFECTS
  // 2766. Swapping non-swappable types
  template<typename... _Elements>
    _GLIBCXX20_CONSTEXPR
    typename enable_if<!__and_<__is_swappable<_Elements>...>::value>::type
    swap(tuple<_Elements...>&, tuple<_Elements...>&) = delete;
#endif

  /// Partial specialization for tuples
  template<typename... _Types, typename _Alloc>
    struct uses_allocator<tuple<_Types...>, _Alloc> : true_type { };

  // See stl_pair.h...
  /** "piecewise construction" using a tuple of arguments for each member.
   *
   * @param __first Arguments for the first member of the pair.
   * @param __second Arguments for the second member of the pair.
   *
   * The elements of each tuple will be used as the constructor arguments
   * for the data members of the pair.
  */
  template<class _T1, class _T2>
    template<typename... _Args1, typename... _Args2>
      _GLIBCXX20_CONSTEXPR
      inline
      pair<_T1, _T2>::
      pair(piecewise_construct_t,
	   tuple<_Args1...> __first, tuple<_Args2...> __second)
      : pair(__first, __second,
	     typename _Build_index_tuple<sizeof...(_Args1)>::__type(),
	     typename _Build_index_tuple<sizeof...(_Args2)>::__type())
      { }

  template<class _T1, class _T2>
    template<typename... _Args1, size_t... _Indexes1,
	     typename... _Args2, size_t... _Indexes2>
      _GLIBCXX20_CONSTEXPR inline
      pair<_T1, _T2>::
      pair(tuple<_Args1...>& __tuple1, tuple<_Args2...>& __tuple2,
	   _Index_tuple<_Indexes1...>, _Index_tuple<_Indexes2...>)
      : first(std::forward<_Args1>(std::get<_Indexes1>(__tuple1))...),
	second(std::forward<_Args2>(std::get<_Indexes2>(__tuple2))...)
      { }

#if defined(__cpp_lib_apply) || defined(__cpp_lib_make_from_tuple) // C++ >= 17
  // Unpack a std::tuple into a type trait and use its value.
  // For cv std::tuple<_Up> the result is _Trait<_Tp, cv _Up...>::value.
  // For cv std::tuple<_Up>& the result is _Trait<_Tp, cv _Up&...>::value.
  // Otherwise the result is false (because we don't know if std::get throws).
  template<template<typename...> class _Trait, typename _Tp, typename _Tuple>
    inline constexpr bool __unpack_std_tuple = false;

  template<template<typename...> class _Trait, typename _Tp, typename... _Up>
    inline constexpr bool __unpack_std_tuple<_Trait, _Tp, tuple<_Up...>>
      = _Trait<_Tp, _Up...>::value;

  template<template<typename...> class _Trait, typename _Tp, typename... _Up>
    inline constexpr bool __unpack_std_tuple<_Trait, _Tp, tuple<_Up...>&>
      = _Trait<_Tp, _Up&...>::value;

  template<template<typename...> class _Trait, typename _Tp, typename... _Up>
    inline constexpr bool __unpack_std_tuple<_Trait, _Tp, const tuple<_Up...>>
      = _Trait<_Tp, const _Up...>::value;

  template<template<typename...> class _Trait, typename _Tp, typename... _Up>
    inline constexpr bool __unpack_std_tuple<_Trait, _Tp, const tuple<_Up...>&>
      = _Trait<_Tp, const _Up&...>::value;
#endif

#ifdef __cpp_lib_apply // C++ >= 17
  template <typename _Fn, typename _Tuple, size_t... _Idx>
    constexpr decltype(auto)
    __apply_impl(_Fn&& __f, _Tuple&& __t, index_sequence<_Idx...>)
    {
      return std::__invoke(std::forward<_Fn>(__f),
			   std::get<_Idx>(std::forward<_Tuple>(__t))...);
    }

#if __cpp_lib_tuple_like // >= C++23
  template <typename _Fn, __tuple_like _Tuple>
#else
  template <typename _Fn, typename _Tuple>
#endif
    constexpr decltype(auto)
    apply(_Fn&& __f, _Tuple&& __t)
    noexcept(__unpack_std_tuple<is_nothrow_invocable, _Fn, _Tuple>)
    {
      using _Indices
	= make_index_sequence<tuple_size_v<remove_reference_t<_Tuple>>>;
      return std::__apply_impl(std::forward<_Fn>(__f),
			       std::forward<_Tuple>(__t),
			       _Indices{});
    }
#endif

#ifdef __cpp_lib_make_from_tuple // C++ >= 17
  template <typename _Tp, typename _Tuple, typename _Seq
	      = make_index_sequence<tuple_size_v<remove_reference_t<_Tuple>>>>
    constexpr bool __can_make_from_tuple = false;

  // _GLIBCXX_RESOLVE_LIB_DEFECTS
  // 3528. make_from_tuple can perform (the equivalent of) a C-style cast
  template <typename _Tp, typename _Tuple, size_t... _Idx>
    constexpr bool __can_make_from_tuple<_Tp, _Tuple, index_sequence<_Idx...>>
      = is_constructible_v<_Tp,
			   decltype(std::get<_Idx>(std::declval<_Tuple>()))...>;

  template <typename _Tp, typename _Tuple, size_t... _Idx>
    constexpr _Tp
    __make_from_tuple_impl(_Tuple&& __t, index_sequence<_Idx...>)
    {
      static_assert(__can_make_from_tuple<_Tp, _Tuple, index_sequence<_Idx...>>);
      return _Tp(std::get<_Idx>(std::forward<_Tuple>(__t))...);
    }

#if __cpp_lib_tuple_like // >= C++23
  template <typename _Tp, __tuple_like _Tuple>
#else
  template <typename _Tp, typename _Tuple>
#endif
    constexpr auto
    make_from_tuple(_Tuple&& __t)
    noexcept(__unpack_std_tuple<is_nothrow_constructible, _Tp, _Tuple>)
#ifdef __cpp_concepts // >= C++20
    -> _Tp
    requires __can_make_from_tuple<_Tp, _Tuple>
#else
    -> __enable_if_t<__can_make_from_tuple<_Tp, _Tuple>, _Tp>
#endif
    {
      constexpr size_t __n = tuple_size_v<remove_reference_t<_Tuple>>;
#if __has_builtin(__reference_constructs_from_temporary)
      if constexpr (__n == 1)
	{
	  using _Elt = decltype(std::get<0>(std::declval<_Tuple>()));
	  static_assert(!__reference_constructs_from_temporary(_Tp, _Elt));
	}
#endif
      return __make_from_tuple_impl<_Tp>(std::forward<_Tuple>(__t),
					 make_index_sequence<__n>{});
    }
#endif

#if __cpp_lib_tuple_like // >= C++23
  template<__tuple_like _TTuple, __tuple_like _UTuple,
	   template<typename> class _TQual, template<typename> class _UQual,
	   typename = make_index_sequence<tuple_size_v<_TTuple>>>
  struct __tuple_like_common_reference;

  template<__tuple_like _TTuple, __tuple_like _UTuple,
	   template<typename> class _TQual, template<typename> class _UQual,
	   size_t... _Is>
    requires requires
      { typename tuple<common_reference_t<_TQual<tuple_element_t<_Is, _TTuple>>,
					  _UQual<tuple_element_t<_Is, _UTuple>>>...>; }
  struct __tuple_like_common_reference<_TTuple, _UTuple, _TQual, _UQual, index_sequence<_Is...>>
  {
    using type = tuple<common_reference_t<_TQual<tuple_element_t<_Is, _TTuple>>,
					  _UQual<tuple_element_t<_Is, _UTuple>>>...>;
  };

  template<__tuple_like _TTuple, __tuple_like _UTuple,
	   template<typename> class _TQual, template<typename> class _UQual>
    requires (__is_tuple_v<_TTuple> || __is_tuple_v<_UTuple>)
      && is_same_v<_TTuple, decay_t<_TTuple>>
      && is_same_v<_UTuple, decay_t<_UTuple>>
      && (tuple_size_v<_TTuple> == tuple_size_v<_UTuple>)
      && requires { typename __tuple_like_common_reference<_TTuple, _UTuple, _TQual, _UQual>::type; }
  struct basic_common_reference<_TTuple, _UTuple, _TQual, _UQual>
  {
    using type = typename __tuple_like_common_reference<_TTuple, _UTuple, _TQual, _UQual>::type;
  };

  template<__tuple_like _TTuple, __tuple_like _UTuple,
	   typename = make_index_sequence<tuple_size_v<_TTuple>>>
  struct __tuple_like_common_type;

  template<__tuple_like _TTuple, __tuple_like _UTuple, size_t... _Is>
    requires requires
      { typename tuple<common_type_t<tuple_element_t<_Is, _TTuple>,
				   tuple_element_t<_Is, _UTuple>>...>; }
  struct __tuple_like_common_type<_TTuple, _UTuple, index_sequence<_Is...>>
  {
    using type = tuple<common_type_t<tuple_element_t<_Is, _TTuple>,
				     tuple_element_t<_Is, _UTuple>>...>;
  };

  template<__tuple_like _TTuple, __tuple_like _UTuple>
    requires (__is_tuple_v<_TTuple> || __is_tuple_v<_UTuple>)
      && is_same_v<_TTuple, decay_t<_TTuple>>
      && is_same_v<_UTuple, decay_t<_UTuple>>
      && (tuple_size_v<_TTuple> == tuple_size_v<_UTuple>)
      && requires { typename __tuple_like_common_type<_TTuple, _UTuple>::type; }
  struct common_type<_TTuple, _UTuple>
  {
    using type = typename __tuple_like_common_type<_TTuple, _UTuple>::type;
  };
#endif // C++23

  /// @}

#undef __glibcxx_no_dangling_refs

_GLIBCXX_END_NAMESPACE_VERSION
} // namespace std

#endif // C++11

#endif // _GLIBCXX_TUPLE
