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

// Copyright (C) 2007-2025 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;

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

  // Using EBO for elements that are tuples causes ambiguous base errors.
  template<typename _El0, typename... _El>
    struct __is_empty_non_tuple<tuple<_El0, _El...>> : false_type { };

  // Use the Empty Base-class Optimization for empty, non-final types.
  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;

#if __has_cpp_attribute(__no_unique_address__)
  template<size_t _Idx, typename _Head>
    struct _Head_base<_Idx, _Head, true>
    {
      constexpr _Head_base()
      : _M_head_impl() { }

      constexpr _Head_base(const _Head& __h)
      : _M_head_impl(__h) { }

      constexpr _Head_base(const _Head_base&) = default;
      constexpr _Head_base(_Head_base&&) = default;

      template<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;
    };
#else
  template<size_t _Idx, typename _Head>
    struct _Head_base<_Idx, _Head, true>
    : public _Head
    {
      constexpr _Head_base()
      : _Head() { }

      constexpr _Head_base(const _Head& __h)
      : _Head(__h) { }

      constexpr _Head_base(const _Head_base&) = default;
      constexpr _Head_base(_Head_base&&) = default;

      template<typename _UHead>
        constexpr _Head_base(_UHead&& __h)
	: _Head(std::forward<_UHead>(__h)) { }

      _GLIBCXX20_CONSTEXPR
      _Head_base(allocator_arg_t, __uses_alloc0)
      : _Head() { }

      template<typename _Alloc>
	_GLIBCXX20_CONSTEXPR
	_Head_base(allocator_arg_t, __uses_alloc1<_Alloc> __a)
	: _Head(allocator_arg, *__a._M_a) { }

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

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

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

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

      static constexpr _Head&
      _M_head(_Head_base& __b) noexcept { return __b; }

      static constexpr const _Head&
      _M_head(const _Head_base& __b) noexcept { return __b; }
    };
#endif

  template<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;
    };

#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>
    class 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 _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&&) = 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 _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 _Elements&... __elements)
	noexcept(__nothrow_constructible<const _Elements&...>())
	: _Inherited(__elements...) { }

      template<bool _NotEmpty = (sizeof...(_Elements) >= 1),
	       _ExplicitCtor<_NotEmpty, const _Elements&...> = false>
	explicit constexpr
	tuple(const _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 _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 _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

  // 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

  /// 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
