// <optional> -*- C++ -*-

// Copyright (C) 2013-2026 Free Software Foundation, Inc.
// Copyright The GNU Toolchain Authors.
//
// 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/optional
 *  This is a Standard C++ Library header.
 */

#ifndef _GLIBCXX_OPTIONAL
#define _GLIBCXX_OPTIONAL 1

#ifdef _GLIBCXX_SYSHDR
#pragma GCC system_header
#endif

#define __glibcxx_want_freestanding_optional
#define __glibcxx_want_optional
#define __glibcxx_want_optional_range_support
#define __glibcxx_want_constrained_equality
#define __glibcxx_want_constexpr_exceptions
#include <bits/version.h>

#ifdef __cpp_lib_optional // C++ >= 17

#include <type_traits>
#include <exception>
#include <new>
#include <initializer_list>
#include <bits/enable_special_members.h>
#include <bits/exception_defines.h>
#include <bits/functional_hash.h>
#include <bits/stl_construct.h> // _Construct
#include <bits/utility.h> // in_place_t
#if __cplusplus > 201703L
# include <compare>
# include <bits/invoke.h> // std::__invoke
#endif
#if __cplusplus > 202002L
# include <concepts>
#endif
#ifdef __cpp_lib_optional_range_support // C++ >= 26
# include <bits/formatfwd.h>
# include <bits/ranges_base.h>
# include <bits/range_access.h>
#endif

namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION

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

  template<typename _Tp>
    class optional;

  /// Tag type to disengage optional objects.
  struct nullopt_t
  {
    // Do not user-declare default constructor at all for
    // optional_value = {} syntax to work.
    // nullopt_t() = delete;

    // Used for constructing nullopt.
    enum class _Construct { _Token };

    // Must be constexpr for nullopt_t to be literal.
    explicit constexpr nullopt_t(_Construct) noexcept { }
  };

  /// Tag to disengage optional objects.
  inline constexpr nullopt_t nullopt { nullopt_t::_Construct::_Token };

  template<typename _Fn> struct _Optional_func { _Fn& _M_f; };

  /**
   *  @brief Exception class thrown when a disengaged optional object is
   *  dereferenced.
   *  @ingroup exceptions
   */
  class bad_optional_access : public exception
  {
  public:
    bad_optional_access() = default;
    virtual ~bad_optional_access() = default;

#if __cpp_lib_constexpr_exceptions >= 202502L
    constexpr
#endif
    const char* what() const noexcept override
    { return "bad optional access"; }
  };

  // XXX Does not belong here.
  [[__noreturn__]]
#if __cpp_lib_constexpr_exceptions >= 202502L
  constexpr
#else
  inline
#endif
  void
  __throw_bad_optional_access()
  { _GLIBCXX_THROW_OR_ABORT(bad_optional_access()); }

  // This class template manages construction/destruction of
  // the contained value for a std::optional.
  template <typename _Tp>
    struct _Optional_payload_base
    {
      using _Stored_type = remove_const_t<_Tp>;

      _Optional_payload_base() = default;
      ~_Optional_payload_base() = default;

      template<typename... _Args>
	constexpr
	_Optional_payload_base(in_place_t __tag, _Args&&... __args)
	: _M_payload(__tag, std::forward<_Args>(__args)...),
	  _M_engaged(true)
	{ }

      template<typename _Up, typename... _Args>
	constexpr
	_Optional_payload_base(std::initializer_list<_Up> __il,
			       _Args&&... __args)
	: _M_payload(__il, std::forward<_Args>(__args)...),
	  _M_engaged(true)
	{ }

      // Constructor used by _Optional_base copy constructor when the
      // contained value is not trivially copy constructible.
      constexpr
      _Optional_payload_base(bool /* __engaged */,
			     const _Optional_payload_base& __other)
      {
	if (__other._M_engaged)
	  this->_M_construct(__other._M_get());
      }

      // Constructor used by _Optional_base move constructor when the
      // contained value is not trivially move constructible.
      constexpr
      _Optional_payload_base(bool /* __engaged */,
			     _Optional_payload_base&& __other)
      {
	if (__other._M_engaged)
	  this->_M_construct(std::move(__other._M_get()));
      }

      // Copy constructor is only used to when the contained value is
      // trivially copy constructible.
      _Optional_payload_base(const _Optional_payload_base&) = default;

      // Move constructor is only used to when the contained value is
      // trivially copy constructible.
      _Optional_payload_base(_Optional_payload_base&&) = default;

      _Optional_payload_base&
      operator=(const _Optional_payload_base&) = default;

      _Optional_payload_base&
      operator=(_Optional_payload_base&&) = default;

      // used to perform non-trivial copy assignment.
      constexpr void
      _M_copy_assign(const _Optional_payload_base& __other)
      {
	if (this->_M_engaged && __other._M_engaged)
	  this->_M_get() = __other._M_get();
	else
	  {
	    if (__other._M_engaged)
	      this->_M_construct(__other._M_get());
	    else
	      this->_M_reset();
	  }
      }

      // used to perform non-trivial move assignment.
      constexpr void
      _M_move_assign(_Optional_payload_base&& __other)
      noexcept(__and_v<is_nothrow_move_constructible<_Tp>,
		       is_nothrow_move_assignable<_Tp>>)
      {
	if (this->_M_engaged && __other._M_engaged)
	  this->_M_get() = std::move(__other._M_get());
	else
	  {
	    if (__other._M_engaged)
	      this->_M_construct(std::move(__other._M_get()));
	    else
	      this->_M_reset();
	  }
      }

      struct _Empty_byte { };

      template<typename _Up, bool = is_trivially_destructible_v<_Up>>
	union _Storage
	{
	  constexpr _Storage() noexcept : _M_empty() { }

	  template<typename... _Args>
	    constexpr
	    _Storage(in_place_t, _Args&&... __args)
	    : _M_value(std::forward<_Args>(__args)...)
	    { }

	  template<typename _Vp, typename... _Args>
	    constexpr
	    _Storage(std::initializer_list<_Vp> __il, _Args&&... __args)
	    : _M_value(__il, std::forward<_Args>(__args)...)
	    { }

#if __cplusplus >= 202002L
	  template<typename _Fn, typename _Arg>
	    constexpr
	    _Storage(_Optional_func<_Fn> __f, _Arg&& __arg)
	    : _M_value(std::__invoke(std::forward<_Fn>(__f._M_f),
				     std::forward<_Arg>(__arg)))
	    { }
#endif

#if __cpp_concepts >= 202002L // Conditionally trivial special member functions
	  ~_Storage() = default;

	  // User-provided destructor is needed when _Up has non-trivial dtor.
	  _GLIBCXX20_CONSTEXPR
	  ~_Storage() requires (!is_trivially_destructible_v<_Up>)
	  { }

	  _Storage(const _Storage&) = default;
	  _Storage(_Storage&&) = default;
	  _Storage& operator=(const _Storage&) = default;
	  _Storage& operator=(_Storage&&) = default;
#endif

	  _Empty_byte _M_empty;
	  _Up _M_value;
	};

#if __cpp_concepts < 202002L
      template<typename _Up>
	union _Storage<_Up, false>
	{
	  constexpr _Storage() noexcept : _M_empty() { }

	  template<typename... _Args>
	    constexpr
	    _Storage(in_place_t, _Args&&... __args)
	    : _M_value(std::forward<_Args>(__args)...)
	    { }

	  template<typename _Vp, typename... _Args>
	    constexpr
	    _Storage(std::initializer_list<_Vp> __il, _Args&&... __args)
	    : _M_value(__il, std::forward<_Args>(__args)...)
	    { }

#if __cplusplus >= 202002L
	  template<typename _Fn, typename _Arg>
	    constexpr
	    _Storage(_Optional_func<_Fn> __f, _Arg&& __arg)
	    : _M_value(std::__invoke(std::forward<_Fn>(__f._M_f),
				     std::forward<_Arg>(__arg)))
	    { }
#endif

	  // User-provided destructor is needed when _Up has non-trivial dtor.
	  _GLIBCXX20_CONSTEXPR ~_Storage() { }

	  _Storage(const _Storage&) = default;
	  _Storage(_Storage&&) = default;
	  _Storage& operator=(const _Storage&) = default;
	  _Storage& operator=(_Storage&&) = default;

	  _Empty_byte _M_empty;
	  _Up _M_value;
	};
#endif

      _Storage<_Stored_type> _M_payload;

      bool _M_engaged = false;

      template<typename... _Args>
	constexpr void
	_M_construct(_Args&&... __args)
	noexcept(is_nothrow_constructible_v<_Stored_type, _Args...>)
	{
	  std::_Construct(std::__addressof(this->_M_payload._M_value),
			  std::forward<_Args>(__args)...);
	  this->_M_engaged = true;
	}

      constexpr void
      _M_destroy() noexcept
      {
	_M_engaged = false;
	_M_payload._M_value.~_Stored_type();
#if defined(__clang__) && __cpp_lib_optional >= 202106L // full constexpr support
	if (std::is_constant_evaluated())
	  // Work around PR124910 for Clang.
	  std::construct_at(std::__addressof(_M_payload._M_empty));
#endif
      }

#if __cplusplus >= 202002L
      template<typename _Fn, typename _Up>
	constexpr void
	_M_apply(_Optional_func<_Fn> __f, _Up&& __x)
	{
	  std::construct_at(std::__addressof(this->_M_payload),
			    __f, std::forward<_Up>(__x));
	  _M_engaged = true;
	}
#endif

      // The _M_get() operations have _M_engaged as a precondition.
      // They exist to access the contained value with the appropriate
      // const-qualification, because _M_payload has had the const removed.

      constexpr _Tp&
      _M_get() noexcept
      { return this->_M_payload._M_value; }

      constexpr const _Tp&
      _M_get() const noexcept
      { return this->_M_payload._M_value; }

      // _M_reset is a 'safe' operation with no precondition.
      constexpr void
      _M_reset() noexcept
      {
	if (this->_M_engaged)
	  _M_destroy();
	else // This seems redundant but improves codegen, see PR 112480.
	  this->_M_engaged = false;
      }
    };

  // Class template that manages the payload for optionals.
  template <typename _Tp,
	    bool /*_HasTrivialDestructor*/ =
	      is_trivially_destructible_v<_Tp>,
	    bool /*_HasTrivialCopy */ =
	      is_trivially_copy_assignable_v<_Tp>
	      && is_trivially_copy_constructible_v<_Tp>,
	    bool /*_HasTrivialMove */ =
	      is_trivially_move_assignable_v<_Tp>
	      && is_trivially_move_constructible_v<_Tp>>
    struct _Optional_payload;

  // Payload for potentially-constexpr optionals (trivial copy/move/destroy).
  template <typename _Tp>
    struct _Optional_payload<_Tp, true, true, true>
    : _Optional_payload_base<_Tp>
    {
      using _Optional_payload_base<_Tp>::_Optional_payload_base;

      _Optional_payload() = default;
    };

  // Payload for optionals with non-trivial copy construction/assignment.
  template <typename _Tp>
    struct _Optional_payload<_Tp, true, false, true>
    : _Optional_payload_base<_Tp>
    {
      using _Optional_payload_base<_Tp>::_Optional_payload_base;

      _Optional_payload() = default;
      ~_Optional_payload() = default;
      _Optional_payload(const _Optional_payload&) = default;
      _Optional_payload(_Optional_payload&&) = default;
      _Optional_payload& operator=(_Optional_payload&&) = default;

      // Non-trivial copy assignment.
      constexpr
      _Optional_payload&
      operator=(const _Optional_payload& __other)
      {
	this->_M_copy_assign(__other);
	return *this;
      }
    };

  // Payload for optionals with non-trivial move construction/assignment.
  template <typename _Tp>
    struct _Optional_payload<_Tp, true, true, false>
    : _Optional_payload_base<_Tp>
    {
      using _Optional_payload_base<_Tp>::_Optional_payload_base;

      _Optional_payload() = default;
      ~_Optional_payload() = default;
      _Optional_payload(const _Optional_payload&) = default;
      _Optional_payload(_Optional_payload&&) = default;
      _Optional_payload& operator=(const _Optional_payload&) = default;

      // Non-trivial move assignment.
      constexpr
      _Optional_payload&
      operator=(_Optional_payload&& __other)
      noexcept(__and_v<is_nothrow_move_constructible<_Tp>,
		       is_nothrow_move_assignable<_Tp>>)
      {
	this->_M_move_assign(std::move(__other));
	return *this;
      }
    };

  // Payload for optionals with non-trivial copy and move assignment.
  template <typename _Tp>
    struct _Optional_payload<_Tp, true, false, false>
    : _Optional_payload_base<_Tp>
    {
      using _Optional_payload_base<_Tp>::_Optional_payload_base;

      _Optional_payload() = default;
      ~_Optional_payload() = default;
      _Optional_payload(const _Optional_payload&) = default;
      _Optional_payload(_Optional_payload&&) = default;

      // Non-trivial copy assignment.
      constexpr
      _Optional_payload&
      operator=(const _Optional_payload& __other)
      {
	this->_M_copy_assign(__other);
	return *this;
      }

      // Non-trivial move assignment.
      constexpr
      _Optional_payload&
      operator=(_Optional_payload&& __other)
      noexcept(__and_v<is_nothrow_move_constructible<_Tp>,
		       is_nothrow_move_assignable<_Tp>>)
      {
	this->_M_move_assign(std::move(__other));
	return *this;
      }
    };

  // Payload for optionals with non-trivial destructors.
  template <typename _Tp, bool _Copy, bool _Move>
    struct _Optional_payload<_Tp, false, _Copy, _Move>
    : _Optional_payload<_Tp, true, false, false>
    {
      // Base class implements all the constructors and assignment operators:
      using _Optional_payload<_Tp, true, false, false>::_Optional_payload;
      _Optional_payload() = default;
      _Optional_payload(const _Optional_payload&) = default;
      _Optional_payload(_Optional_payload&&) = default;
      _Optional_payload& operator=(const _Optional_payload&) = default;
      _Optional_payload& operator=(_Optional_payload&&) = default;

      // Destructor needs to destroy the contained value:
      _GLIBCXX20_CONSTEXPR ~_Optional_payload() { this->_M_reset(); }
    };

  /**
    * @brief Class template that provides copy/move constructors of optional.
    *
    * Such a separate base class template is necessary in order to
    * conditionally make copy/move constructors trivial.
    *
    * When the contained value is trivially copy/move constructible,
    * the copy/move constructors of _Optional_base will invoke the
    * trivial copy/move constructor of _Optional_payload. Otherwise,
    * they will invoke _Optional_payload(bool, const _Optional_payload&)
    * or _Optional_payload(bool, _Optional_payload&&) to initialize
    * the contained value, if copying/moving an engaged optional.
    *
    * Whether the other special members are trivial is determined by the
    * _Optional_payload<_Tp> specialization used for the _M_payload member.
    *
    * @see optional, _Enable_special_members
    */
  template<typename _Tp,
	   bool = is_trivially_copy_constructible_v<_Tp>,
	   bool = is_trivially_move_constructible_v<_Tp>>
    struct _Optional_base
    {
      // Constructors for disengaged optionals.
      constexpr _Optional_base() = default;

      // Constructors for engaged optionals.
      template<typename... _Args,
	       enable_if_t<is_constructible_v<_Tp, _Args...>, bool> = false>
	constexpr explicit
	_Optional_base(in_place_t, _Args&&... __args)
	: _M_payload(in_place, std::forward<_Args>(__args)...)
	{ }

      template<typename _Up, typename... _Args,
	       enable_if_t<is_constructible_v<_Tp,
					      initializer_list<_Up>&,
					      _Args...>, bool> = false>
	constexpr explicit
	_Optional_base(in_place_t,
		       initializer_list<_Up> __il,
		       _Args&&... __args)
	: _M_payload(in_place, __il, std::forward<_Args>(__args)...)
	{ }

      // Copy and move constructors.
      constexpr
      _Optional_base(const _Optional_base& __other)
      noexcept(is_nothrow_copy_constructible_v<_Tp>)
      : _M_payload(__other._M_payload._M_engaged, __other._M_payload)
      { }

      constexpr
      _Optional_base(_Optional_base&& __other)
      noexcept(is_nothrow_move_constructible_v<_Tp>)
      : _M_payload(__other._M_payload._M_engaged,
		   std::move(__other._M_payload))
      { }

#if __cpp_concepts >= 202002L // Conditionally trivial special member functions
      // Define these in the primary template if possible, so that we don't
      // need to use partial specializations of this class template.
      constexpr _Optional_base(const _Optional_base&)
	requires is_trivially_copy_constructible_v<_Tp> = default;

      constexpr _Optional_base(_Optional_base&&)
	requires is_trivially_move_constructible_v<_Tp> = default;
#endif

      // Assignment operators.
      _Optional_base& operator=(const _Optional_base&) = default;
      _Optional_base& operator=(_Optional_base&&) = default;

      _Optional_payload<_Tp> _M_payload;

    protected:
      // For the primary template, we define these functions here.
      using _Stored_type = remove_const_t<_Tp>;

      // The _M_construct operation has !_M_engaged as a precondition
      // while _M_destruct has _M_engaged as a precondition.
      template<typename... _Args>
	constexpr void
	_M_construct(_Args&&... __args)
	noexcept(is_nothrow_constructible_v<_Stored_type, _Args...>)
	{
	  _M_payload._M_construct(std::forward<_Args>(__args)...);
	}

      constexpr void
      _M_destruct() noexcept
      { _M_payload._M_destroy(); }

      // _M_reset is a 'safe' operation with no precondition.
      constexpr void
      _M_reset() noexcept
      { _M_payload._M_reset(); }

      constexpr bool _M_is_engaged() const noexcept
      { return _M_payload._M_engaged; }

      // The _M_get operations have _M_engaged as a precondition.
      constexpr _Tp&
      _M_get() noexcept
      { return _M_payload._M_get(); }

      constexpr const _Tp&
      _M_get() const noexcept
      { return _M_payload._M_get(); }
    };

#if __cpp_concepts < 202002L
  // If P0848R3 "Conditionally Trivial Special Member Functions" is not
  // supported (as determined from the __cpp_concepts macro value), the
  // _Optional_base primary template only has non-trivial copy and move
  // constructors. Use partial specializations of _Optional_base<T, C, M>
  // that have a trivial copy and/or move constructor.

  // Common base class for _Optional_base<T> to avoid repeating these
  // member functions in each partial specialization.
  // Only used if P0848R3 "Conditionally Trivial Special Member Functions"
  // is not supported, as indicated by the __cpp_concepts value.
  template<typename _Tp, typename _Dp>
    class _Optional_base_impl
    {
    protected:
      using _Stored_type = remove_const_t<_Tp>;

      // The _M_construct operation has !_M_engaged as a precondition
      // while _M_destruct has _M_engaged as a precondition.
      template<typename... _Args>
	constexpr void
	_M_construct(_Args&&... __args)
	noexcept(is_nothrow_constructible_v<_Stored_type, _Args...>)
	{
	  static_cast<_Dp*>(this)->_M_payload._M_construct(
	    std::forward<_Args>(__args)...);
	}

      constexpr void
      _M_destruct() noexcept
      { static_cast<_Dp*>(this)->_M_payload._M_destroy(); }

      // _M_reset is a 'safe' operation with no precondition.
      constexpr void
      _M_reset() noexcept
      { static_cast<_Dp*>(this)->_M_payload._M_reset(); }

      constexpr bool _M_is_engaged() const noexcept
      { return static_cast<const _Dp*>(this)->_M_payload._M_engaged; }

      // The _M_get operations have _M_engaged as a precondition.
      constexpr _Tp&
      _M_get() noexcept
      { return static_cast<_Dp*>(this)->_M_payload._M_get(); }

      constexpr const _Tp&
      _M_get() const noexcept
      { return static_cast<const _Dp*>(this)->_M_payload._M_get(); }
    };

  template<typename _Tp>
    struct _Optional_base<_Tp, false, true> // trivial move ctor
    : _Optional_base_impl<_Tp, _Optional_base<_Tp>>
    {
      // Constructors for disengaged optionals.
      constexpr _Optional_base() = default;

      // Constructors for engaged optionals.
      template<typename... _Args,
	       enable_if_t<is_constructible_v<_Tp, _Args...>, bool> = false>
	constexpr explicit
	_Optional_base(in_place_t, _Args&&... __args)
	: _M_payload(in_place, std::forward<_Args>(__args)...)
	{ }

      template<typename _Up, typename... _Args,
	       enable_if_t<is_constructible_v<_Tp,
					      initializer_list<_Up>&,
					      _Args...>, bool> = false>
	constexpr explicit
	_Optional_base(in_place_t,
		       initializer_list<_Up> __il,
		       _Args... __args)
	: _M_payload(in_place, __il, std::forward<_Args>(__args)...)
	{ }

      // Copy and move constructors.
      constexpr _Optional_base(const _Optional_base& __other)
      : _M_payload(__other._M_payload._M_engaged, __other._M_payload)
      { }

      constexpr _Optional_base(_Optional_base&& __other) = default;

      // Assignment operators.
      _Optional_base& operator=(const _Optional_base&) = default;
      _Optional_base& operator=(_Optional_base&&) = default;

      _Optional_payload<_Tp> _M_payload;
    };

  template<typename _Tp>
    struct _Optional_base<_Tp, true, false> // trivial copy ctor
    : _Optional_base_impl<_Tp, _Optional_base<_Tp>>
    {
      // Constructors for disengaged optionals.
      constexpr _Optional_base() = default;

      // Constructors for engaged optionals.
      template<typename... _Args,
	       enable_if_t<is_constructible_v<_Tp, _Args...>, bool> = false>
	constexpr explicit
	_Optional_base(in_place_t, _Args&&... __args)
	: _M_payload(in_place, std::forward<_Args>(__args)...)
	{ }

      template<typename _Up, typename... _Args,
	       enable_if_t<is_constructible_v<_Tp,
					      initializer_list<_Up>&,
					      _Args...>, bool> = false>
	constexpr explicit
	_Optional_base(in_place_t,
		       initializer_list<_Up> __il,
		       _Args&&... __args)
	: _M_payload(in_place, __il, std::forward<_Args>(__args)...)
	{ }

      // Copy and move constructors.
      constexpr _Optional_base(const _Optional_base& __other) = default;

      constexpr
      _Optional_base(_Optional_base&& __other)
      noexcept(is_nothrow_move_constructible_v<_Tp>)
      : _M_payload(__other._M_payload._M_engaged,
		   std::move(__other._M_payload))
      { }

      // Assignment operators.
      _Optional_base& operator=(const _Optional_base&) = default;
      _Optional_base& operator=(_Optional_base&&) = default;

      _Optional_payload<_Tp> _M_payload;
    };

  template<typename _Tp>
    struct _Optional_base<_Tp, true, true> // trivial copy and move ctors
    : _Optional_base_impl<_Tp, _Optional_base<_Tp>>
    {
      // Constructors for disengaged optionals.
      constexpr _Optional_base() = default;

      // Constructors for engaged optionals.
      template<typename... _Args,
	       enable_if_t<is_constructible_v<_Tp, _Args...>, bool> = false>
	constexpr explicit
	_Optional_base(in_place_t, _Args&&... __args)
	: _M_payload(in_place, std::forward<_Args>(__args)...)
	{ }

      template<typename _Up, typename... _Args,
	       enable_if_t<is_constructible_v<_Tp,
					      initializer_list<_Up>&,
					      _Args...>, bool> = false>
	constexpr explicit
	_Optional_base(in_place_t,
		       initializer_list<_Up> __il,
		       _Args&&... __args)
	: _M_payload(in_place, __il, std::forward<_Args>(__args)...)
	{ }

      // Copy and move constructors.
      constexpr _Optional_base(const _Optional_base& __other) = default;
      constexpr _Optional_base(_Optional_base&& __other) = default;

      // Assignment operators.
      _Optional_base& operator=(const _Optional_base&) = default;
      _Optional_base& operator=(_Optional_base&&) = default;

      _Optional_payload<_Tp> _M_payload;
    };
#endif // __cpp_concepts

  template<typename _Tp>
    inline constexpr bool __is_optional_v = false;
  template<typename _Tp>
    inline constexpr bool __is_optional_v<optional<_Tp>> = true;

  template<typename _Tp, typename _Wp>
    using __converts_from_any_cvref = __or_<
	is_constructible<_Tp, _Wp&>,       is_convertible<_Wp&, _Tp>,
	is_constructible<_Tp, _Wp>,        is_convertible<_Wp, _Tp>,
	is_constructible<_Tp, const _Wp&>, is_convertible<const _Wp&, _Tp>,
	is_constructible<_Tp, const _Wp>,  is_convertible<const _Wp, _Tp>
      >;

  template<typename _Tp, typename _Up>
    using __converts_from_optional
      = __converts_from_any_cvref<_Tp, optional<_Up>>;

  template<typename _Tp, typename _Up>
    using __assigns_from_optional =
      __or_<is_assignable<_Tp&, const optional<_Up>&>,
	    is_assignable<_Tp&, optional<_Up>&>,
	    is_assignable<_Tp&, const optional<_Up>&&>,
	    is_assignable<_Tp&, optional<_Up>&&>>;

#if __cpp_concepts && __cpp_conditional_explicit && __glibcxx_remove_cvref
# define _GLIBCXX_USE_CONSTRAINTS_FOR_OPTIONAL 1
#endif

  template<typename _Tp>
    inline constexpr bool __is_valid_contained_type_for_optional =
      (
#if __cpp_lib_optional >= 202506L
	is_lvalue_reference_v<_Tp> ||
#endif
	(is_object_v<_Tp> && is_destructible_v<_Tp> && !is_array_v<_Tp>)
      )
      && !is_same_v<remove_cv_t<remove_reference_t<_Tp>>, nullopt_t>
      && !is_same_v<remove_cv_t<remove_reference_t<_Tp>>, in_place_t>;

  /**
    * @brief Class template for optional values.
    */
  template<typename _Tp>
    class optional
    : private _Optional_base<_Tp>,
      private _Enable_copy_move<
	// Copy constructor.
	is_copy_constructible_v<_Tp>,
	// Copy assignment.
	__and_v<is_copy_constructible<_Tp>, is_copy_assignable<_Tp>>,
	// Move constructor.
	is_move_constructible_v<_Tp>,
	// Move assignment.
	__and_v<is_move_constructible<_Tp>, is_move_assignable<_Tp>>,
	// Unique tag type.
	optional<_Tp>>
    {
      static_assert(__is_valid_contained_type_for_optional<_Tp>);

    private:
      using _Base = _Optional_base<_Tp>;

      // SFINAE helpers

      // _GLIBCXX_RESOLVE_LIB_DEFECTS
      // 3836. std::expected<bool, E1> conversion constructor
      // expected(const expected<U, G>&) should take precedence over
      // expected(U&&) with operator bool
#ifdef _GLIBCXX_USE_CONSTRAINTS_FOR_OPTIONAL
      template<typename _From, typename = remove_cv_t<_Tp>>
	static constexpr bool __not_constructing_bool_from_optional
	  = true;

      // If T is cv bool, remove_cvref_t<U> is not a specialization of optional
      // i.e. do not initialize a bool from optional<U>::operator bool().
      template<typename _From>
	static constexpr bool
	__not_constructing_bool_from_optional<_From, bool>
	  = !__is_optional_v<remove_cvref_t<_From>>;

      // If T is not cv bool, converts-from-any-cvref<T, optional<U>> is false.
      // The constructor that converts from optional<U> is disabled if the
      // contained value can be initialized from optional<U>, so that the
      // optional(U&&) constructor can be used instead.
      template<typename _From, typename = remove_cv_t<_Tp>>
	static constexpr bool __construct_from_contained_value
	  = !__converts_from_optional<_Tp, _From>::value;

      // However, optional<U> can always be converted to bool, so don't apply
      // this constraint when T is cv bool.
      template<typename _From>
	static constexpr bool __construct_from_contained_value<_From, bool>
	  = true;
#else
      template<typename _From, typename = remove_cv_t<_Tp>>
	struct __not_constructing_bool_from_optional
	: true_type
	{ };

      template<typename _From>
	struct __not_constructing_bool_from_optional<_From, bool>
	: bool_constant<!__is_optional_v<__remove_cvref_t<_From>>>
	{ };

      template<typename _From, typename = remove_cv_t<_Tp>>
	struct __construct_from_contained_value
	: __not_<__converts_from_optional<_Tp, _From>>
	{ };

      template<typename _From>
	struct __construct_from_contained_value<_From, bool>
	: true_type
	{ };

      template<typename _Up>
	using __not_self = __not_<is_same<optional, __remove_cvref_t<_Up>>>;
      template<typename _Up>
	using __not_tag = __not_<is_same<in_place_t, __remove_cvref_t<_Up>>>;
      template<typename... _Cond>
	using _Requires = enable_if_t<__and_v<_Cond...>, bool>;
#endif

    public:
      using value_type = _Tp;
#ifdef __cpp_lib_optional_range_support // >= C++26
      using iterator = __gnu_cxx::__normal_iterator<_Tp*, optional>;
      using const_iterator = __gnu_cxx::__normal_iterator<const _Tp*, optional>;
#endif

      constexpr optional() noexcept { }

      constexpr optional(nullopt_t) noexcept { }

      // Converting constructors for engaged optionals.
#ifdef _GLIBCXX_USE_CONSTRAINTS_FOR_OPTIONAL
      template<typename _Up = remove_cv_t<_Tp>>
	requires (!is_same_v<optional, remove_cvref_t<_Up>>)
	  && (!is_same_v<in_place_t, remove_cvref_t<_Up>>)
	  && is_constructible_v<_Tp, _Up>
	  && __not_constructing_bool_from_optional<_Up>
	constexpr explicit(!is_convertible_v<_Up, _Tp>)
	optional(_Up&& __t)
	noexcept(is_nothrow_constructible_v<_Tp, _Up>)
	: _Base(std::in_place, std::forward<_Up>(__t)) { }

      template<typename _Up>
	requires (!is_same_v<_Tp, _Up>)
	  && is_constructible_v<_Tp, const _Up&>
	  && __construct_from_contained_value<_Up>
	constexpr explicit(!is_convertible_v<const _Up&, _Tp>)
	optional(const optional<_Up>& __t)
	noexcept(is_nothrow_constructible_v<_Tp, const _Up&>)
	{
	  if (__t)
	    emplace(__t._M_fwd());
	}

      template<typename _Up>
	requires (!is_same_v<_Tp, _Up>)
	  && is_constructible_v<_Tp, _Up>
	  && __construct_from_contained_value<_Up>
	constexpr explicit(!is_convertible_v<_Up, _Tp>)
	optional(optional<_Up>&& __t)
	noexcept(is_nothrow_constructible_v<_Tp, _Up>)
	{
	  if (__t)
	    emplace(std::move(__t)._M_fwd());
	}

      template<typename... _Args>
	requires is_constructible_v<_Tp, _Args...>
	explicit constexpr
	optional(in_place_t, _Args&&... __args)
	noexcept(is_nothrow_constructible_v<_Tp, _Args...>)
	: _Base(std::in_place, std::forward<_Args>(__args)...)
	{ }

      template<typename _Up, typename... _Args>
	requires is_constructible_v<_Tp, initializer_list<_Up>&, _Args...>
	explicit constexpr
	optional(in_place_t, initializer_list<_Up> __il, _Args&&... __args)
	noexcept(is_nothrow_constructible_v<_Tp, initializer_list<_Up>&,
					    _Args...>)
	: _Base(std::in_place, __il, std::forward<_Args>(__args)...)
	{ }
#else
      template<typename _Up = remove_cv_t<_Tp>,
	       _Requires<__not_self<_Up>, __not_tag<_Up>,
			 is_constructible<_Tp, _Up>,
			 is_convertible<_Up, _Tp>,
			 __not_constructing_bool_from_optional<_Up>> = true>
	constexpr
	optional(_Up&& __t)
	noexcept(is_nothrow_constructible_v<_Tp, _Up>)
	: _Base(std::in_place, std::forward<_Up>(__t)) { }

      template<typename _Up = remove_cv_t<_Tp>,
	       _Requires<__not_self<_Up>, __not_tag<_Up>,
			 is_constructible<_Tp, _Up>,
			 __not_<is_convertible<_Up, _Tp>>,
			 __not_constructing_bool_from_optional<_Up>> = false>
	explicit constexpr
	optional(_Up&& __t)
	noexcept(is_nothrow_constructible_v<_Tp, _Up>)
	: _Base(std::in_place, std::forward<_Up>(__t)) { }

      template<typename _Up,
	       _Requires<__not_<is_same<_Tp, _Up>>,
			 is_constructible<_Tp, const _Up&>,
			 is_convertible<const _Up&, _Tp>,
			 __construct_from_contained_value<_Up>> = true>
	constexpr
	optional(const optional<_Up>& __t)
	noexcept(is_nothrow_constructible_v<_Tp, const _Up&>)
	{
	  if (__t)
	    emplace(__t._M_fwd());
	}

      template<typename _Up,
	       _Requires<__not_<is_same<_Tp, _Up>>,
			 is_constructible<_Tp, const _Up&>,
			 __not_<is_convertible<const _Up&, _Tp>>,
			 __construct_from_contained_value<_Up>> = false>
	explicit constexpr
	optional(const optional<_Up>& __t)
	noexcept(is_nothrow_constructible_v<_Tp, const _Up&>)
	{
	  if (__t)
	    emplace(__t._M_fwd());
	}

      template<typename _Up,
	       _Requires<__not_<is_same<_Tp, _Up>>,
			 is_constructible<_Tp, _Up>,
			 is_convertible<_Up, _Tp>,
			 __construct_from_contained_value<_Up>> = true>
	constexpr
	optional(optional<_Up>&& __t)
	noexcept(is_nothrow_constructible_v<_Tp, _Up>)
	{
	  if (__t)
	    emplace(std::move(__t)._M_fwd());
	}

      template<typename _Up,
	       _Requires<__not_<is_same<_Tp, _Up>>,
			 is_constructible<_Tp, _Up>,
			 __not_<is_convertible<_Up, _Tp>>,
			 __construct_from_contained_value<_Up>> = false>
	explicit constexpr
	optional(optional<_Up>&& __t)
	noexcept(is_nothrow_constructible_v<_Tp, _Up>)
	{
	  if (__t)
	    emplace(std::move(__t)._M_fwd());
	}

      template<typename... _Args,
	       _Requires<is_constructible<_Tp, _Args...>> = false>
	explicit constexpr
	optional(in_place_t, _Args&&... __args)
	noexcept(is_nothrow_constructible_v<_Tp, _Args...>)
	: _Base(std::in_place, std::forward<_Args>(__args)...) { }

      template<typename _Up, typename... _Args,
	       _Requires<is_constructible<_Tp,
					  initializer_list<_Up>&,
					  _Args...>> = false>
	explicit constexpr
	optional(in_place_t, initializer_list<_Up> __il, _Args&&... __args)
	noexcept(is_nothrow_constructible_v<_Tp, initializer_list<_Up>&,
					    _Args...>)
	: _Base(std::in_place, __il, std::forward<_Args>(__args)...) { }
#endif

      // Assignment operators.
      _GLIBCXX20_CONSTEXPR optional&
      operator=(nullopt_t) noexcept
      {
	this->_M_reset();
	return *this;
      }

      template<typename _Up = remove_cv_t<_Tp>>
#ifdef _GLIBCXX_USE_CONSTRAINTS_FOR_OPTIONAL
	requires (!is_same_v<optional, remove_cvref_t<_Up>>)
	  && (!(is_scalar_v<_Tp> && is_same_v<_Tp, decay_t<_Up>>))
	  && is_constructible_v<_Tp, _Up>
	  && is_assignable_v<_Tp&, _Up>
	constexpr optional&
#else
	enable_if_t<__and_v<__not_self<_Up>,
			    __not_<__and_<is_scalar<_Tp>,
					  is_same<_Tp, decay_t<_Up>>>>,
			    is_constructible<_Tp, _Up>,
			    is_assignable<_Tp&, _Up>>,
		    optional&>
#endif
	operator=(_Up&& __u)
	noexcept(__and_v<is_nothrow_constructible<_Tp, _Up>,
			 is_nothrow_assignable<_Tp&, _Up>>)
	{
	  if (this->_M_is_engaged())
	    this->_M_get() = std::forward<_Up>(__u);
	  else
	    this->_M_construct(std::forward<_Up>(__u));

	  return *this;
	}

      template<typename _Up>
#ifdef _GLIBCXX_USE_CONSTRAINTS_FOR_OPTIONAL
	requires (!is_same_v<_Tp, _Up>)
	  && is_constructible_v<_Tp, const _Up&>
	  && is_assignable_v<_Tp&, const _Up&>
	  && (!__converts_from_optional<_Tp, _Up>::value)
	  && (!__assigns_from_optional<_Tp, _Up>::value)
	constexpr optional&
#else
	enable_if_t<__and_v<__not_<is_same<_Tp, _Up>>,
			    is_constructible<_Tp, const _Up&>,
			    is_assignable<_Tp&, const _Up&>,
			    __not_<__converts_from_optional<_Tp, _Up>>,
			    __not_<__assigns_from_optional<_Tp, _Up>>>,
		    optional&>
#endif
	operator=(const optional<_Up>& __u)
	noexcept(__and_v<is_nothrow_constructible<_Tp, const _Up&>,
			 is_nothrow_assignable<_Tp&, const _Up&>>)
	{
	  if (__u)
	    {
	      if (this->_M_is_engaged())
		this->_M_get() = __u._M_fwd();
	      else
		this->_M_construct(__u._M_fwd());
	    }
	  else
	    {
	      this->_M_reset();
	    }
	  return *this;
	}

      template<typename _Up>
#ifdef _GLIBCXX_USE_CONSTRAINTS_FOR_OPTIONAL
	requires (!is_same_v<_Tp, _Up>)
	  && is_constructible_v<_Tp, _Up>
	  && is_assignable_v<_Tp&, _Up>
	  && (!__converts_from_optional<_Tp, _Up>::value)
	  && (!__assigns_from_optional<_Tp, _Up>::value)
	constexpr optional&
#else
	enable_if_t<__and_v<__not_<is_same<_Tp, _Up>>,
			    is_constructible<_Tp, _Up>,
			    is_assignable<_Tp&, _Up>,
			    __not_<__converts_from_optional<_Tp, _Up>>,
			    __not_<__assigns_from_optional<_Tp, _Up>>>,
		    optional&>
#endif
	operator=(optional<_Up>&& __u)
	noexcept(__and_v<is_nothrow_constructible<_Tp, _Up>,
			 is_nothrow_assignable<_Tp&, _Up>>)
	{
	  if (__u)
	    {
	      if (this->_M_is_engaged())
		this->_M_get() = std::move(__u)._M_fwd();
	      else
		this->_M_construct(std::move(__u)._M_fwd());
	    }
	  else
	    {
	      this->_M_reset();
	    }

	  return *this;
	}

      // _GLIBCXX_RESOLVE_LIB_DEFECTS
      // 2746. Inconsistency between requirements for emplace between optional and variant
      template<typename... _Args>
	_GLIBCXX20_CONSTEXPR
	enable_if_t<is_constructible_v<_Tp, _Args...>, _Tp&>
	emplace(_Args&&... __args)
	noexcept(is_nothrow_constructible_v<_Tp, _Args...>)
	{
	  this->_M_reset();
	  this->_M_construct(std::forward<_Args>(__args)...);
	  return this->_M_get();
	}

      template<typename _Up, typename... _Args>
	_GLIBCXX20_CONSTEXPR
	enable_if_t<is_constructible_v<_Tp, initializer_list<_Up>&, _Args...>,
		    _Tp&>
	emplace(initializer_list<_Up> __il, _Args&&... __args)
	noexcept(is_nothrow_constructible_v<_Tp, initializer_list<_Up>&,
					    _Args...>)
	{
	  this->_M_reset();
	  this->_M_construct(__il, std::forward<_Args>(__args)...);
	  return this->_M_get();
	}

      // Destructor is implicit, implemented in _Optional_base.

      // Swap.
      _GLIBCXX20_CONSTEXPR void
      swap(optional& __other)
      noexcept(is_nothrow_move_constructible_v<_Tp>
	       && is_nothrow_swappable_v<_Tp>)
      {
	using std::swap;

	if (this->_M_is_engaged() && __other._M_is_engaged())
	  swap(this->_M_get(), __other._M_get());
	else if (this->_M_is_engaged())
	  {
	    __other._M_construct(std::move(this->_M_get()));
	    this->_M_destruct();
	  }
	else if (__other._M_is_engaged())
	  {
	    this->_M_construct(std::move(__other._M_get()));
	    __other._M_destruct();
	  }
      }

#ifdef __cpp_lib_optional_range_support // >= C++26
      // Iterator support.
      constexpr iterator begin() noexcept
      {
	return iterator(
	  this->_M_is_engaged() ? std::addressof(this->_M_get()) : nullptr
	);
      }

      constexpr const_iterator begin() const noexcept
      {
	return const_iterator(
	  this->_M_is_engaged() ? std::addressof(this->_M_get()) : nullptr
	);
      }

      constexpr iterator end() noexcept
      {
	return begin() + has_value();
      }

      constexpr const_iterator end() const noexcept
      {
	return begin() + has_value();
      }
#endif // __cpp_lib_optional_range_support

      // Observers.
      constexpr const _Tp*
      operator->() const noexcept
      {
	__glibcxx_assert(this->_M_is_engaged());
	return std::__addressof(this->_M_get());
      }

      constexpr _Tp*
      operator->() noexcept
      {
	__glibcxx_assert(this->_M_is_engaged());
	return std::__addressof(this->_M_get());
      }

      constexpr const _Tp&
      operator*() const& noexcept
      {
	__glibcxx_assert(this->_M_is_engaged());
	return this->_M_get();
      }

      constexpr _Tp&
      operator*()& noexcept
      {
	__glibcxx_assert(this->_M_is_engaged());
	return this->_M_get();
      }

      constexpr _Tp&&
      operator*()&& noexcept
      {
	__glibcxx_assert(this->_M_is_engaged());
	return std::move(this->_M_get());
      }

      constexpr const _Tp&&
      operator*() const&& noexcept
      {
	__glibcxx_assert(this->_M_is_engaged());
	return std::move(this->_M_get());
      }

      constexpr explicit operator bool() const noexcept
      { return this->_M_is_engaged(); }

      constexpr bool has_value() const noexcept
      { return this->_M_is_engaged(); }

      constexpr const _Tp&
      value() const&
      {
	if (this->_M_is_engaged())
	  return this->_M_get();
	__throw_bad_optional_access();
      }

      constexpr _Tp&
      value()&
      {
	if (this->_M_is_engaged())
	  return this->_M_get();
	__throw_bad_optional_access();
      }

      constexpr _Tp&&
      value()&&
      {
	if (this->_M_is_engaged())
	  return std::move(this->_M_get());
	__throw_bad_optional_access();
      }

      constexpr const _Tp&&
      value() const&&
      {
	if (this->_M_is_engaged())
	  return std::move(this->_M_get());
	__throw_bad_optional_access();
      }

      // _GLIBCXX_RESOLVE_LIB_DEFECTS
      // 4406. value_or return statement is inconsistent with Mandates
      template<typename _Up = remove_cv_t<_Tp>>
	constexpr remove_cv_t<_Tp>
	value_or(_Up&& __u) const&
	{
	  using _Xp = remove_cv_t<_Tp>;
	  static_assert(is_convertible_v<const _Tp&, _Xp>);
	  static_assert(is_convertible_v<_Up, _Xp>);

	  if (this->_M_is_engaged())
	    return this->_M_get();
	  return std::forward<_Up>(__u);
	}

      template<typename _Up = remove_cv_t<_Tp>>
	constexpr remove_cv_t<_Tp>
	value_or(_Up&& __u) &&
	{
	  using _Xp = remove_cv_t<_Tp>;
	  static_assert(is_convertible_v<_Tp, _Xp>);
	  static_assert(is_convertible_v<_Up, _Xp>);

	  if (this->_M_is_engaged())
	    return std::move(this->_M_get());
	  return std::forward<_Up>(__u);
	}

#if __cpp_lib_optional >= 202110L // C++23
      // [optional.monadic]

      template<typename _Fn>
	constexpr auto
	and_then(_Fn&& __f) &
	{
	  using _Up = remove_cvref_t<invoke_result_t<_Fn, _Tp&>>;
	  static_assert(__is_optional_v<_Up>,
			"the function passed to std::optional<T>::and_then "
			"must return a std::optional");
	  if (has_value())
	    return std::__invoke(std::forward<_Fn>(__f), _M_get());
	  else
	    return _Up();
	}

      template<typename _Fn>
	constexpr auto
	and_then(_Fn&& __f) const &
	{
	  using _Up = remove_cvref_t<invoke_result_t<_Fn, const _Tp&>>;
	  static_assert(__is_optional_v<_Up>,
			"the function passed to std::optional<T>::and_then "
			"must return a std::optional");
	  if (has_value())
	    return std::__invoke(std::forward<_Fn>(__f), _M_get());
	  else
	    return _Up();
	}

      template<typename _Fn>
	constexpr auto
	and_then(_Fn&& __f) &&
	{
	  using _Up = remove_cvref_t<invoke_result_t<_Fn, _Tp>>;
	  static_assert(__is_optional_v<_Up>,
			"the function passed to std::optional<T>::and_then "
			"must return a std::optional");
	  if (has_value())
	    return std::__invoke(std::forward<_Fn>(__f), std::move(_M_get()));
	  else
	    return _Up();
	}

      template<typename _Fn>
	constexpr auto
	and_then(_Fn&& __f) const &&
	{
	  using _Up = remove_cvref_t<invoke_result_t<_Fn, const _Tp>>;
	  static_assert(__is_optional_v<_Up>,
			"the function passed to std::optional<T>::and_then "
			"must return a std::optional");
	  if (has_value())
	    return std::__invoke(std::forward<_Fn>(__f), std::move(_M_get()));
	  else
	    return _Up();
	}

      template<typename _Fn>
	constexpr auto
	transform(_Fn&& __f) &
	{
	  using _Up = remove_cv_t<invoke_result_t<_Fn, _Tp&>>;
	  if (has_value())
	    return optional<_Up>(_Optional_func<_Fn>{__f}, _M_get());
	  else
	    return optional<_Up>();
	}

      template<typename _Fn>
	constexpr auto
	transform(_Fn&& __f) const &
	{
	  using _Up = remove_cv_t<invoke_result_t<_Fn, const _Tp&>>;
	  if (has_value())
	    return optional<_Up>(_Optional_func<_Fn>{__f}, _M_get());
	  else
	    return optional<_Up>();
	}

      template<typename _Fn>
	constexpr auto
	transform(_Fn&& __f) &&
	{
	  using _Up = remove_cv_t<invoke_result_t<_Fn, _Tp>>;
	  if (has_value())
	    return optional<_Up>(_Optional_func<_Fn>{__f}, std::move(_M_get()));
	  else
	    return optional<_Up>();
	}

      template<typename _Fn>
	constexpr auto
	transform(_Fn&& __f) const &&
	{
	  using _Up = remove_cv_t<invoke_result_t<_Fn, const _Tp>>;
	  if (has_value())
	    return optional<_Up>(_Optional_func<_Fn>{__f}, std::move(_M_get()));
	  else
	    return optional<_Up>();
	}

      template<typename _Fn> requires invocable<_Fn> && copy_constructible<_Tp>
	constexpr optional
	or_else(_Fn&& __f) const&
	{
	  using _Up = invoke_result_t<_Fn>;
	  static_assert(is_same_v<remove_cvref_t<_Up>, optional>,
			"the function passed to std::optional<T>::or_else "
			"must return a std::optional<T>");

	  if (has_value())
	    return *this;
	  else
	    return std::forward<_Fn>(__f)();
	}

      template<typename _Fn> requires invocable<_Fn> && move_constructible<_Tp>
	constexpr optional
	or_else(_Fn&& __f) &&
	{
	  using _Up = invoke_result_t<_Fn>;
	  static_assert(is_same_v<remove_cvref_t<_Up>, optional>,
			"the function passed to std::optional<T>::or_else "
			"must return a std::optional<T>");

	  if (has_value())
	    return std::move(*this);
	  else
	    return std::forward<_Fn>(__f)();
	}
#endif

      _GLIBCXX20_CONSTEXPR void reset() noexcept { this->_M_reset(); }

    private:
      using _Base::_M_get;

      [[__gnu__::__always_inline__]]
      constexpr _Tp&
      _M_fwd() & noexcept
      { return _M_get(); }

      [[__gnu__::__always_inline__]]
      constexpr _Tp&&
      _M_fwd() && noexcept
      { return std::move(_M_get()); }

      [[__gnu__::__always_inline__]]
      constexpr const _Tp&
      _M_fwd() const& noexcept
      { return _M_get(); }

      [[__gnu__::__always_inline__]]
      constexpr const _Tp&&
      _M_fwd() const&& noexcept
      { return std::move(_M_get()); }

      template<typename _Up> friend class optional;

#if __cpp_lib_optional >= 202110L // C++23
      template<typename _Fn, typename _Value>
	explicit constexpr
	optional(_Optional_func<_Fn> __f, _Value&& __v)
	{
	  this->_M_payload._M_apply(__f, std::forward<_Value>(__v));
	}
#endif
    };

#if __cpp_lib_optional >= 202506L // C++26
  template<typename _Tp>
    class optional<_Tp&>;

  template<typename _Tp>
    constexpr bool __is_optional_ref_v = false;

  template<typename _Tp>
    constexpr bool __is_optional_ref_v<optional<_Tp&>> = true;

  template<typename _Tp>
    struct __optional_ref_base
    {};

#ifdef __cpp_lib_optional_range_support // >= C++26
  template<typename _Tp>
    struct __optional_ref_base<_Tp[]>
    {};

  template<typename _Tp>
    requires is_object_v<_Tp>
    struct __optional_ref_base<_Tp>
    {
      using iterator = __gnu_cxx::__normal_iterator<_Tp*, optional<_Tp&>>;
    };
#endif // __cpp_lib_optional_range_support

  template<typename _Tp>
    class optional<_Tp&> : public __optional_ref_base<_Tp>
    {
      static_assert(__is_valid_contained_type_for_optional<_Tp&>);

    public:
      using value_type = _Tp;

      // Constructors.
      constexpr optional() noexcept = default;
      constexpr optional(nullopt_t) noexcept : optional() {}
      constexpr optional(const optional&) noexcept = default;

      template<typename _Arg>
	requires is_constructible_v<_Tp&, _Arg>
	  && (!reference_constructs_from_temporary_v<_Tp&, _Arg>)
	explicit constexpr
	optional(in_place_t, _Arg&& __arg)
	{
	  __convert_ref_init_val(std::forward<_Arg>(__arg));
	}

      template<typename _Up>
	requires (!is_same_v<remove_cvref_t<_Up>, optional>)
	  && (!is_same_v<remove_cvref_t<_Up>, in_place_t>)
	  && is_constructible_v<_Tp&, _Up>
	  && (!reference_constructs_from_temporary_v<_Tp&, _Up>)
	explicit(!is_convertible_v<_Up, _Tp&>)
	constexpr
	optional(_Up&& __u)
	noexcept(is_nothrow_constructible_v<_Tp&, _Up>)
	{
	  __convert_ref_init_val(std::forward<_Up>(__u));
	}

      template<typename _Up>
	requires (!is_same_v<remove_cvref_t<_Up>, optional>)
	  && (!is_same_v<remove_cvref_t<_Up>, in_place_t>)
	  && is_constructible_v<_Tp&, _Up>
	  && reference_constructs_from_temporary_v<_Tp&, _Up>
	explicit(!is_convertible_v<_Up, _Tp&>)
	constexpr
	optional(_Up&& __u) = delete;

      // optional<U> &
      template<typename _Up>
	requires (!is_same_v<remove_cv_t<_Tp>, optional<_Up>>)
	  && (!is_same_v<_Tp&, _Up>)
	  && is_constructible_v<_Tp&, _Up&>
	  && (!reference_constructs_from_temporary_v<_Tp&, _Up&>)
	explicit(!is_convertible_v<_Up&, _Tp&>)
	constexpr
	optional(optional<_Up>& __rhs)
	noexcept(is_nothrow_constructible_v<_Tp&, _Up&>)
	{
	  if (__rhs)
	    __convert_ref_init_val(__rhs._M_fwd());
	}

      template<typename _Up>
	requires (!is_same_v<remove_cv_t<_Tp>, optional<_Up>>)
	  && (!is_same_v<_Tp&, _Up>)
	  && is_constructible_v<_Tp&, _Up&>
	  && reference_constructs_from_temporary_v<_Tp&, _Up&>
	explicit(!is_convertible_v<_Up&, _Tp&>)
	constexpr
	optional(optional<_Up>& __rhs) = delete;

      // const optional<U>&
      template<typename _Up>
	requires (!is_same_v<remove_cv_t<_Tp>, optional<_Up>>)
	  && (!is_same_v<_Tp&, _Up>)
	  && is_constructible_v<_Tp&, const _Up&>
	  && (!reference_constructs_from_temporary_v<_Tp&, const _Up&>)
	explicit(!is_convertible_v<const _Up&, _Tp&>)
	constexpr
	optional(const optional<_Up>& __rhs)
	noexcept(is_nothrow_constructible_v<_Tp&, _Up&>)
	{
	  if (__rhs)
	    __convert_ref_init_val(__rhs._M_fwd());
	}

      template<typename _Up>
	requires (!is_same_v<remove_cv_t<_Tp>, optional<_Up>>)
	  && (!is_same_v<_Tp&, _Up>)
	  && is_constructible_v<_Tp&, const _Up&>
	  && reference_constructs_from_temporary_v<_Tp&, const _Up&>
	explicit(!is_convertible_v<const _Up&, _Tp&>)
	constexpr
	optional(const optional<_Up>& __rhs) = delete;

      // optional<U>&&
      template<typename _Up>
	requires (!is_same_v<remove_cv_t<_Tp>, optional<_Up>>)
	  && (!is_same_v<_Tp&, _Up>)
	  && is_constructible_v<_Tp&, _Up>
	  && (!reference_constructs_from_temporary_v<_Tp&, _Up>)
	explicit(!is_convertible_v<_Up, _Tp&>)
	constexpr
	optional(optional<_Up>&& __rhs)
	noexcept(is_nothrow_constructible_v<_Tp&, _Up>)
	{
	  if (__rhs)
	    __convert_ref_init_val(std::move(__rhs)._M_fwd());
	}

      template<typename _Up>
	requires (!is_same_v<remove_cv_t<_Tp>, optional<_Up>>)
	  && (!is_same_v<_Tp&, _Up>)
	  && is_constructible_v<_Tp&, _Up>
	  && reference_constructs_from_temporary_v<_Tp&, _Up>
	explicit(!is_convertible_v<_Up, _Tp&>)
	constexpr
	optional(optional<_Up>&& __rhs) = delete;

      // const optional<U>&&
      template<typename _Up>
	requires (!is_same_v<remove_cv_t<_Tp>, optional<_Up>>)
	  && (!is_same_v<_Tp&, _Up>)
	  && is_constructible_v<_Tp&, const _Up>
	  && (!reference_constructs_from_temporary_v<_Tp&, _Up>)
	explicit(!is_convertible_v<const _Up, _Tp&>)
	constexpr
	optional(const optional<_Up>&& __rhs)
	noexcept(is_nothrow_constructible_v<_Tp&, const _Up>)
	{
	  if (__rhs)
	    __convert_ref_init_val(std::move(__rhs)._M_fwd());
	}

      template<typename _Up>
	requires (!is_same_v<remove_cv_t<_Tp>, optional<_Up>>)
	  && (!is_same_v<_Tp&, _Up>)
	  && is_constructible_v<_Tp&, const _Up>
	  && reference_constructs_from_temporary_v<_Tp&, const _Up>
	explicit(!is_convertible_v<const _Up, _Tp&>)
	constexpr
	optional(const optional<_Up>&& __rhs) = delete;

      constexpr ~optional() = default;

      // Assignment.
      constexpr optional& operator=(nullopt_t) noexcept
      {
	_M_val = nullptr;
	return *this;
      }

      constexpr optional& operator=(const optional&) noexcept = default;

      template<typename _Up>
	requires is_constructible_v<_Tp&, _Up>
	  && (!reference_constructs_from_temporary_v<_Tp&, _Up>)
	constexpr _Tp&
	emplace(_Up&& __u)
	noexcept(is_nothrow_constructible_v<_Tp&, _Up>)
	{
	  __convert_ref_init_val(std::forward<_Up>(__u));
	  // _GLIBCXX_RESOLVE_LIB_DEFECTS
	  // 4300. Missing Returns: element in optional<T&>::emplace
	  return *_M_val;
	}

      // Swap.
      constexpr void swap(optional& __rhs) noexcept
      { std::swap(_M_val, __rhs._M_val); }

#ifdef __cpp_lib_optional_range_support // >= C++26
      // Iterator support.
      constexpr auto begin() const noexcept
	requires is_object_v<_Tp> && (!is_unbounded_array_v<_Tp>)
      { return __gnu_cxx::__normal_iterator<_Tp*, optional>(_M_val); }

      constexpr auto end() const noexcept
	requires is_object_v<_Tp> && (!is_unbounded_array_v<_Tp>)
      { return begin() + has_value(); }
#endif // __cpp_lib_optional_range_support

      // Observers.
      constexpr _Tp* operator->() const noexcept
      {
	__glibcxx_assert(_M_val); // hardened precondition
	return _M_val;
      }

      constexpr _Tp& operator*() const noexcept
      {
	__glibcxx_assert(_M_val); // hardened precondition
	return *_M_val;
      }

      constexpr explicit operator bool() const noexcept
      {
	return _M_val;
      }

      constexpr bool has_value() const noexcept
      {
	return _M_val;
      }

      constexpr _Tp& value() const
      {
	if (_M_val)
	  return *_M_val;
	__throw_bad_optional_access();
      }

      // _GLIBCXX_RESOLVE_LIB_DEFECTS
      // 4304. std::optional<NonReturnable&> is ill-formed due to value_or
      template<typename _Up = remove_cv_t<_Tp>>
	requires is_object_v<_Tp> && (!is_array_v<_Tp>)
	constexpr decay_t<_Tp>
	value_or(_Up&& __u) const
	{
	  using _Xp = remove_cv_t<_Tp>;
	  static_assert(is_convertible_v<_Tp&, _Xp>);
	  static_assert(is_convertible_v<_Up, _Xp>);
	  if (_M_val)
	    return *_M_val;
	  return std::forward<_Up>(__u);
	}

      // Monadic operations.
      template<typename _Fn>
	constexpr auto
	and_then(_Fn&& __f) const
	{
	  using _Up = remove_cvref_t<invoke_result_t<_Fn, _Tp&>>;
	  static_assert(__is_optional_v<_Up>,
			"the function passed to std::optional<T&>::and_then "
			"must return a std::optional");
	  if (has_value())
	    return std::__invoke(std::forward<_Fn>(__f), *_M_val);
	  else
	    return _Up();
	}

      template<typename _Fn>
	constexpr
	optional<remove_cv_t<invoke_result_t<_Fn, _Tp&>>>
	transform(_Fn&& __f) const
	{
	  using _Up = remove_cv_t<invoke_result_t<_Fn, _Tp&>>;
	  if (has_value())
	    return optional<_Up>(_Optional_func<_Fn>{__f}, *_M_val);
	  else
	    return optional<_Up>();
	}

      template<typename _Fn>
	requires invocable<_Fn>
	constexpr
	optional
	or_else(_Fn&& __f) const
	{
	  static_assert(is_same_v<remove_cvref_t<invoke_result_t<_Fn>>, optional>,
			"the function passed to std::optional<T&>::or_else "
			"must return a std::optional<T&>");
	  // _GLIBCXX_RESOLVE_LIB_DEFECTS
	  // 4367. Improve optional<T&>::or_else
	  if (has_value())
	    return *this;
	  else
	    return std::forward<_Fn>(__f)();
	}

      // Modifiers.
      constexpr void reset() noexcept
      {
	_M_val = nullptr;
      }

    private:
      _Tp *_M_val = nullptr;

      [[__gnu__::__always_inline__]]
      constexpr _Tp&
      _M_fwd() const noexcept
      { return *_M_val; }

      template<typename _Up> friend class optional;

      template<typename _Up>
	constexpr
	void
	__convert_ref_init_val(_Up&& __u)
	noexcept
	{
	  _Tp& __r(std::forward<_Up>(__u));
	  _M_val = std::addressof(__r);
	}

      template<typename _Fn, typename _Value>
	explicit constexpr
	optional(_Optional_func<_Fn> __f, _Value&& __v)
	{
	  _Tp& __r = std::__invoke(std::forward<_Fn>(__f._M_f), std::forward<_Value>(__v));
	  _M_val = std::addressof(__r);
	}
    };
#endif // __cpp_lib_optional >= 202506L

  template<typename _Tp>
    using __optional_relop_t =
      enable_if_t<is_convertible_v<_Tp, bool>, bool>;

  template<typename _Tp, typename _Up>
    using __optional_eq_t = __optional_relop_t<
      decltype(std::declval<const _Tp&>() == std::declval<const _Up&>())
      >;

  template<typename _Tp, typename _Up>
    using __optional_ne_t = __optional_relop_t<
      decltype(std::declval<const _Tp&>() != std::declval<const _Up&>())
      >;

  template<typename _Tp, typename _Up>
    using __optional_lt_t = __optional_relop_t<
      decltype(std::declval<const _Tp&>() < std::declval<const _Up&>())
      >;

  template<typename _Tp, typename _Up>
    using __optional_gt_t = __optional_relop_t<
      decltype(std::declval<const _Tp&>() > std::declval<const _Up&>())
      >;

  template<typename _Tp, typename _Up>
    using __optional_le_t = __optional_relop_t<
      decltype(std::declval<const _Tp&>() <= std::declval<const _Up&>())
      >;

  template<typename _Tp, typename _Up>
    using __optional_ge_t = __optional_relop_t<
      decltype(std::declval<const _Tp&>() >= std::declval<const _Up&>())
      >;

  // Comparisons between optional values.
  template<typename _Tp, typename _Up>
    constexpr auto
    operator==(const optional<_Tp>& __lhs, const optional<_Up>& __rhs)
    -> __optional_eq_t<_Tp, _Up>
    {
      if (__lhs.has_value() != __rhs.has_value())
	return false;
      if (!__lhs.has_value())
	return true;
      return *__lhs == *__rhs;
    }

  template<typename _Tp, typename _Up>
    constexpr auto
    operator!=(const optional<_Tp>& __lhs, const optional<_Up>& __rhs)
    -> __optional_ne_t<_Tp, _Up>
    {
      if (__lhs.has_value() != __rhs.has_value())
	return true;
      if (!__lhs.has_value())
	return false;
      return *__lhs != *__rhs;
    }

  template<typename _Tp, typename _Up>
    constexpr auto
    operator<(const optional<_Tp>& __lhs, const optional<_Up>& __rhs)
    -> __optional_lt_t<_Tp, _Up>
    {
      if (!__rhs.has_value())
	return false;
      if (!__lhs.has_value())
	return true;
      return *__lhs < *__rhs;
    }

  template<typename _Tp, typename _Up>
    constexpr auto
    operator>(const optional<_Tp>& __lhs, const optional<_Up>& __rhs)
    -> __optional_gt_t<_Tp, _Up>
    {
      if (!__lhs.has_value())
	return false;
      if (!__rhs.has_value())
	return true;
      return *__lhs > *__rhs;
    }

  template<typename _Tp, typename _Up>
    constexpr auto
    operator<=(const optional<_Tp>& __lhs, const optional<_Up>& __rhs)
    -> __optional_le_t<_Tp, _Up>
    {
      if (!__lhs.has_value())
	return true;
      if (!__rhs.has_value())
	return false;
      return *__lhs <= *__rhs;
    }

  template<typename _Tp, typename _Up>
    constexpr auto
    operator>=(const optional<_Tp>& __lhs, const optional<_Up>& __rhs)
    -> __optional_ge_t<_Tp, _Up>
    {
      if (!__rhs.has_value())
	return true;
      if (!__lhs.has_value())
	return false;
      return *__lhs >= *__rhs;
    }

#ifdef __cpp_lib_three_way_comparison
  template<typename _Tp, three_way_comparable_with<_Tp> _Up>
    [[nodiscard]]
    constexpr compare_three_way_result_t<_Tp, _Up>
    operator<=>(const optional<_Tp>& __x, const optional<_Up>& __y)
    {
      return __x && __y ? *__x <=> *__y : bool(__x) <=> bool(__y);
    }
#endif

  // Comparisons with nullopt.
  template<typename _Tp>
    [[nodiscard]]
    constexpr bool
    operator==(const optional<_Tp>& __lhs, nullopt_t) noexcept
    { return !__lhs; }

#ifdef __cpp_lib_three_way_comparison
  template<typename _Tp>
    [[nodiscard]]
    constexpr strong_ordering
    operator<=>(const optional<_Tp>& __x, nullopt_t) noexcept
    { return bool(__x) <=> false; }
#else
  template<typename _Tp>
    constexpr bool
    operator==(nullopt_t, const optional<_Tp>& __rhs) noexcept
    { return !__rhs; }

  template<typename _Tp>
    constexpr bool
    operator!=(const optional<_Tp>& __lhs, nullopt_t) noexcept
    { return static_cast<bool>(__lhs); }

  template<typename _Tp>
    constexpr bool
    operator!=(nullopt_t, const optional<_Tp>& __rhs) noexcept
    { return static_cast<bool>(__rhs); }

  template<typename _Tp>
    constexpr bool
    operator<(const optional<_Tp>& /* __lhs */, nullopt_t) noexcept
    { return false; }

  template<typename _Tp>
    constexpr bool
    operator<(nullopt_t, const optional<_Tp>& __rhs) noexcept
    { return static_cast<bool>(__rhs); }

  template<typename _Tp>
    constexpr bool
    operator>(const optional<_Tp>& __lhs, nullopt_t) noexcept
    { return static_cast<bool>(__lhs); }

  template<typename _Tp>
    constexpr bool
    operator>(nullopt_t, const optional<_Tp>& /* __rhs */) noexcept
    { return false; }

  template<typename _Tp>
    constexpr bool
    operator<=(const optional<_Tp>& __lhs, nullopt_t) noexcept
    { return !__lhs; }

  template<typename _Tp>
    constexpr bool
    operator<=(nullopt_t, const optional<_Tp>& /* __rhs */) noexcept
    { return true; }

  template<typename _Tp>
    constexpr bool
    operator>=(const optional<_Tp>& /* __lhs */, nullopt_t) noexcept
    { return true; }

  template<typename _Tp>
    constexpr bool
    operator>=(nullopt_t, const optional<_Tp>& __rhs) noexcept
    { return !__rhs; }
#endif // three-way-comparison

#if __cpp_lib_concepts
  // _GLIBCXX_RESOLVE_LIB_DEFECTS
  // 4072. std::optional comparisons: constrain harder
# define _REQUIRES_NOT_OPTIONAL(T) requires (!__is_optional_v<T>)
#else
# define _REQUIRES_NOT_OPTIONAL(T)
#endif

  // Comparisons with value type.
  template<typename _Tp, typename _Up>
    _REQUIRES_NOT_OPTIONAL(_Up)
    constexpr auto
    operator== [[nodiscard]] (const optional<_Tp>& __lhs, const _Up& __rhs)
    -> __optional_eq_t<_Tp, _Up>
    {
      if (__lhs.has_value())
	return *__lhs == __rhs;
      return false;
    }

  template<typename _Tp, typename _Up>
    _REQUIRES_NOT_OPTIONAL(_Tp)
    constexpr auto
    operator== [[nodiscard]] (const _Tp& __lhs, const optional<_Up>& __rhs)
    -> __optional_eq_t<_Tp, _Up>
    {
      if (__rhs.has_value())
	return __lhs == *__rhs;
      return false;
    }

  template<typename _Tp, typename _Up>
    _REQUIRES_NOT_OPTIONAL(_Up)
    constexpr auto
    operator!= [[nodiscard]] (const optional<_Tp>& __lhs, const _Up& __rhs)
    -> __optional_ne_t<_Tp, _Up>
    {
      if (__lhs.has_value())
	return *__lhs != __rhs;
      return true;
    }

  template<typename _Tp, typename _Up>
    _REQUIRES_NOT_OPTIONAL(_Tp)
    constexpr auto
    operator!= [[nodiscard]] (const _Tp& __lhs, const optional<_Up>& __rhs)
    -> __optional_ne_t<_Tp, _Up>
    {
      if (__rhs.has_value())
	return __lhs != *__rhs;
      return true;
    }

  template<typename _Tp, typename _Up>
    _REQUIRES_NOT_OPTIONAL(_Up)
    constexpr auto
    operator< [[nodiscard]] (const optional<_Tp>& __lhs, const _Up& __rhs)
    -> __optional_lt_t<_Tp, _Up>
    {
      if (__lhs.has_value())
	return *__lhs < __rhs;
      return true;
    }

  template<typename _Tp, typename _Up>
    _REQUIRES_NOT_OPTIONAL(_Tp)
    constexpr auto
    operator< [[nodiscard]] (const _Tp& __lhs, const optional<_Up>& __rhs)
    -> __optional_lt_t<_Tp, _Up>
    {
      if (__rhs.has_value())
	return __lhs < *__rhs;
      return false;
    }

  template<typename _Tp, typename _Up>
    _REQUIRES_NOT_OPTIONAL(_Up)
    constexpr auto
    operator> [[nodiscard]] (const optional<_Tp>& __lhs, const _Up& __rhs)
    -> __optional_gt_t<_Tp, _Up>
    {
      if (__lhs.has_value())
	return *__lhs > __rhs;
      return false;
    }

  template<typename _Tp, typename _Up>
    _REQUIRES_NOT_OPTIONAL(_Tp)
    constexpr auto
    operator> [[nodiscard]] (const _Tp& __lhs, const optional<_Up>& __rhs)
    -> __optional_gt_t<_Tp, _Up>
    {
      if (__rhs.has_value())
	return __lhs > *__rhs;
      return true;
    }

  template<typename _Tp, typename _Up>
    _REQUIRES_NOT_OPTIONAL(_Up)
    constexpr auto
    operator<= [[nodiscard]] (const optional<_Tp>& __lhs, const _Up& __rhs)
    -> __optional_le_t<_Tp, _Up>
    {
      if (__lhs.has_value())
	return *__lhs <= __rhs;
      return true;
    }

  template<typename _Tp, typename _Up>
    _REQUIRES_NOT_OPTIONAL(_Tp)
    constexpr auto
    operator<= [[nodiscard]] (const _Tp& __lhs, const optional<_Up>& __rhs)
    -> __optional_le_t<_Tp, _Up>
    {
      if (__rhs.has_value())
	return __lhs <= *__rhs;
      return false;
    }

  template<typename _Tp, typename _Up>
    _REQUIRES_NOT_OPTIONAL(_Up)
    constexpr auto
    operator>= [[nodiscard]] (const optional<_Tp>& __lhs, const _Up& __rhs)
    -> __optional_ge_t<_Tp, _Up>
    {
      if (__lhs.has_value())
	return *__lhs >= __rhs;
      return false;
    }

  template<typename _Tp, typename _Up>
    _REQUIRES_NOT_OPTIONAL(_Tp)
    constexpr auto
    operator>= [[nodiscard]] (const _Tp& __lhs, const optional<_Up>& __rhs)
    -> __optional_ge_t<_Tp, _Up>
    {
      if (__rhs.has_value())
	return __lhs >= *__rhs;
      return true;
    }

#ifdef __cpp_lib_three_way_comparison
  // _GLIBCXX_RESOLVE_LIB_DEFECTS
  // 3746. optional's spaceship with U with a type derived from optional
  // causes infinite constraint meta-recursion
  template<typename _Tp>
    concept __is_derived_from_optional = requires (const _Tp& __t) {
      []<typename _Up>(const optional<_Up>&){ }(__t);
    };

  template<typename _Tp, typename _Up>
    requires (!__is_derived_from_optional<_Up>)
      && requires { typename compare_three_way_result_t<_Tp, _Up>; }
      && three_way_comparable_with<_Tp, _Up>
    constexpr compare_three_way_result_t<_Tp, _Up>
    operator<=> [[nodiscard]] (const optional<_Tp>& __x, const _Up& __v)
    { return bool(__x) ? *__x <=> __v : strong_ordering::less; }
#endif

  // Swap and creation functions.

  // _GLIBCXX_RESOLVE_LIB_DEFECTS
  // 2748. swappable traits for optionals
  template<typename _Tp>
    _GLIBCXX20_CONSTEXPR
    inline enable_if_t<is_move_constructible_v<_Tp> && is_swappable_v<_Tp>>
    swap(optional<_Tp>& __lhs, optional<_Tp>& __rhs)
    noexcept(noexcept(__lhs.swap(__rhs)))
    { __lhs.swap(__rhs); }

#if __cpp_lib_optional >= 202506L
  // We deviate from standard, that do not declared separate swap overload
  // from optional<T&>.
  template<typename _Tp>
    constexpr void
    swap(optional<_Tp&>& __lhs, optional<_Tp&>& __rhs) noexcept
    { __lhs.swap(__rhs); }
#endif

  // _GLIBCXX_RESOLVE_LIB_DEFECTS
  // 2766. Swapping non-swappable types
  template<typename _Tp>
    enable_if_t<!(is_move_constructible_v<_Tp> && is_swappable_v<_Tp>)>
    swap(optional<_Tp>&, optional<_Tp>&) = delete;

#if __cpp_lib_optional >= 202506L
  template<int = 0, typename _Tp>
#else
  template<typename _Tp>
#endif
    constexpr
    enable_if_t<is_constructible_v<decay_t<_Tp>, _Tp>,
		optional<decay_t<_Tp>>>
    make_optional(_Tp&& __t)
    noexcept(is_nothrow_constructible_v<optional<decay_t<_Tp>>, _Tp>)
    { return optional<decay_t<_Tp>>( std::forward<_Tp>(__t) ); }

  template<typename _Tp, typename... _Args>
    constexpr
    enable_if_t<is_constructible_v<_Tp, _Args...>,
		optional<_Tp>>
    make_optional(_Args&&... __args)
    noexcept(is_nothrow_constructible_v<_Tp, _Args...>)
    { return optional<_Tp>( in_place, std::forward<_Args>(__args)... ); }

  template<typename _Tp, typename _Up, typename... _Args>
    constexpr
    enable_if_t<is_constructible_v<_Tp, initializer_list<_Up>&, _Args...>,
		optional<_Tp>>
    make_optional(initializer_list<_Up> __il, _Args&&... __args)
    noexcept(is_nothrow_constructible_v<_Tp, initializer_list<_Up>&, _Args...>)
    { return optional<_Tp>( in_place, __il, std::forward<_Args>(__args)... ); }

  // Hash.

  template<typename _Tp, typename _Up = remove_const_t<_Tp>>
    struct __optional_hash
#if ! _GLIBCXX_INLINE_VERSION
    : public __hash_empty_base<_Up>
#endif
    {
#if __cplusplus < 202002L
      using result_type [[__deprecated__]] = size_t;
      using argument_type [[__deprecated__]] = optional<_Tp>;
#endif

      size_t
      operator()(const optional<_Tp>& __t) const
      noexcept(noexcept(hash<_Up>{}(*__t)))
      {
	// We pick an arbitrary hash for disengaged optionals which hopefully
	// usual values of _Tp won't typically hash to.
	constexpr size_t __magic_disengaged_hash = static_cast<size_t>(-3333);
	return __t ? hash<_Up>{}(*__t) : __magic_disengaged_hash;
      }
    };

  template<typename _Tp>
    struct hash<optional<_Tp>>
    // hash for optional<T&> is disabled because is_hash_enabled_for<T&> is false
    : public __conditional_t<__is_hash_enabled_for<remove_const_t<_Tp>>,
			     __optional_hash<_Tp>,
			     __hash_not_enabled<_Tp>>
    { };

  template<typename _Tp>
    struct __is_fast_hash<hash<optional<_Tp>>> : __is_fast_hash<hash<_Tp>>
    { };

  /// @}

#if __cpp_deduction_guides >= 201606
  template <typename _Tp> optional(_Tp) -> optional<_Tp>;
#endif

#ifdef __cpp_lib_optional_range_support // >= C++26
  template<typename _Tp>
    inline constexpr bool
      ranges::enable_view<optional<_Tp>> = true;

#if __cpp_lib_optional >= 202506L // C++26
  template<typename _Tp>
    constexpr bool
    ranges::enable_borrowed_range<optional<_Tp&>> = true;
#endif

  template<typename _Tp>
    inline constexpr range_format
      format_kind<optional<_Tp>> = range_format::disabled;
#endif // __cpp_lib_optional_range_support

#undef _GLIBCXX_USE_CONSTRAINTS_FOR_OPTIONAL

_GLIBCXX_END_NAMESPACE_VERSION
} // namespace std

#endif // __cpp_lib_optional

#endif // _GLIBCXX_OPTIONAL
