30#ifndef _GLIBCXX_OPTIONAL
31#define _GLIBCXX_OPTIONAL 1
34#pragma GCC system_header
37#define __glibcxx_want_freestanding_optional
38#define __glibcxx_want_optional
39#define __glibcxx_want_optional_range_support
40#define __glibcxx_want_constrained_equality
41#define __glibcxx_want_constexpr_exceptions
44#ifdef __cpp_lib_optional
55#if __cplusplus > 201703L
59#if __cplusplus > 202002L
62#ifdef __cpp_lib_optional_range_support
68namespace std _GLIBCXX_VISIBILITY(default)
70_GLIBCXX_BEGIN_NAMESPACE_VERSION
77 template<
typename _Tp>
91 explicit constexpr nullopt_t(_Construct)
noexcept { }
95 inline constexpr nullopt_t
nullopt { nullopt_t::_Construct::_Token };
97 template<
typename _Fn>
struct _Optional_func { _Fn& _M_f; };
104 class bad_optional_access :
public exception
107 bad_optional_access() =
default;
108 virtual ~bad_optional_access() =
default;
110#if __cpp_lib_constexpr_exceptions >= 202502L
113 const char* what() const noexcept
override
114 {
return "bad optional access"; }
119#if __cpp_lib_constexpr_exceptions >= 202502L
125 __throw_bad_optional_access()
126 { _GLIBCXX_THROW_OR_ABORT(bad_optional_access()); }
130 template <
typename _Tp>
131 struct _Optional_payload_base
133 using _Stored_type = remove_const_t<_Tp>;
135 _Optional_payload_base() =
default;
136 ~_Optional_payload_base() =
default;
138 template<
typename... _Args>
140 _Optional_payload_base(in_place_t __tag, _Args&&... __args)
141 : _M_payload(__tag, std::
forward<_Args>(__args)...),
145 template<
typename _Up,
typename... _Args>
147 _Optional_payload_base(std::initializer_list<_Up> __il,
149 : _M_payload(__il, std::
forward<_Args>(__args)...),
156 _Optional_payload_base(
bool ,
157 const _Optional_payload_base& __other)
159 if (__other._M_engaged)
160 this->_M_construct(__other._M_get());
166 _Optional_payload_base(
bool ,
167 _Optional_payload_base&& __other)
169 if (__other._M_engaged)
170 this->_M_construct(
std::move(__other._M_get()));
175 _Optional_payload_base(
const _Optional_payload_base&) =
default;
179 _Optional_payload_base(_Optional_payload_base&&) =
default;
181 _Optional_payload_base&
182 operator=(
const _Optional_payload_base&) =
default;
184 _Optional_payload_base&
185 operator=(_Optional_payload_base&&) =
default;
189 _M_copy_assign(
const _Optional_payload_base& __other)
191 if (this->_M_engaged && __other._M_engaged)
192 this->_M_get() = __other._M_get();
195 if (__other._M_engaged)
196 this->_M_construct(__other._M_get());
204 _M_move_assign(_Optional_payload_base&& __other)
205 noexcept(__and_v<is_nothrow_move_constructible<_Tp>,
206 is_nothrow_move_assignable<_Tp>>)
208 if (this->_M_engaged && __other._M_engaged)
209 this->_M_get() =
std::move(__other._M_get());
212 if (__other._M_engaged)
213 this->_M_construct(
std::move(__other._M_get()));
219 struct _Empty_byte { };
221 template<
typename _Up,
bool = is_trivially_destructible_v<_Up>>
224 constexpr _Storage() noexcept : _M_empty() { }
226 template<
typename... _Args>
228 _Storage(in_place_t, _Args&&... __args)
229 : _M_value(std::
forward<_Args>(__args)...)
232 template<
typename _Vp,
typename... _Args>
234 _Storage(std::initializer_list<_Vp> __il, _Args&&... __args)
235 : _M_value(__il, std::
forward<_Args>(__args)...)
238#if __cplusplus >= 202002L
239 template<
typename _Fn,
typename _Arg>
241 _Storage(_Optional_func<_Fn> __f, _Arg&& __arg)
247#if __cpp_concepts >= 202002L
248 ~_Storage() =
default;
252 ~_Storage()
requires (!is_trivially_destructible_v<_Up>)
255 _Storage(
const _Storage&) =
default;
256 _Storage(_Storage&&) =
default;
257 _Storage& operator=(
const _Storage&) =
default;
258 _Storage& operator=(_Storage&&) =
default;
261 _Empty_byte _M_empty;
265#if __cpp_concepts < 202002L
266 template<
typename _Up>
267 union _Storage<_Up, false>
269 constexpr _Storage() noexcept : _M_empty() { }
271 template<
typename... _Args>
273 _Storage(in_place_t, _Args&&... __args)
274 : _M_value(std::
forward<_Args>(__args)...)
277 template<
typename _Vp,
typename... _Args>
279 _Storage(std::initializer_list<_Vp> __il, _Args&&... __args)
280 : _M_value(__il, std::
forward<_Args>(__args)...)
283#if __cplusplus >= 202002L
284 template<
typename _Fn,
typename _Arg>
286 _Storage(_Optional_func<_Fn> __f, _Arg&& __arg)
293 _GLIBCXX20_CONSTEXPR ~_Storage() { }
295 _Storage(
const _Storage&) =
default;
296 _Storage(_Storage&&) =
default;
297 _Storage& operator=(
const _Storage&) =
default;
298 _Storage& operator=(_Storage&&) =
default;
300 _Empty_byte _M_empty;
305 _Storage<_Stored_type> _M_payload;
307 bool _M_engaged =
false;
309 template<
typename... _Args>
311 _M_construct(_Args&&... __args)
312 noexcept(is_nothrow_constructible_v<_Stored_type, _Args...>)
316 this->_M_engaged =
true;
320 _M_destroy() noexcept
323 _M_payload._M_value.~_Stored_type();
324#if __cpp_lib_optional >= 202106L
325 if (std::is_constant_evaluated())
332#if __cplusplus >= 202002L
333 template<
typename _Fn,
typename _Up>
335 _M_apply(_Optional_func<_Fn> __f, _Up&& __x)
349 {
return this->_M_payload._M_value; }
352 _M_get() const noexcept
353 {
return this->_M_payload._M_value; }
359 if (this->_M_engaged)
362 this->_M_engaged =
false;
367 template <
typename _Tp,
369 is_trivially_destructible_v<_Tp>,
371 is_trivially_copy_assignable_v<_Tp>
372 && is_trivially_copy_constructible_v<_Tp>,
374 is_trivially_move_assignable_v<_Tp>
375 && is_trivially_move_constructible_v<_Tp>>
376 struct _Optional_payload;
379 template <
typename _Tp>
380 struct _Optional_payload<_Tp, true, true, true>
381 : _Optional_payload_base<_Tp>
383 using _Optional_payload_base<_Tp>::_Optional_payload_base;
385 _Optional_payload() =
default;
389 template <
typename _Tp>
390 struct _Optional_payload<_Tp, true, false, true>
391 : _Optional_payload_base<_Tp>
393 using _Optional_payload_base<_Tp>::_Optional_payload_base;
395 _Optional_payload() =
default;
396 ~_Optional_payload() =
default;
397 _Optional_payload(
const _Optional_payload&) =
default;
398 _Optional_payload(_Optional_payload&&) =
default;
399 _Optional_payload& operator=(_Optional_payload&&) =
default;
404 operator=(
const _Optional_payload& __other)
406 this->_M_copy_assign(__other);
412 template <
typename _Tp>
413 struct _Optional_payload<_Tp, true, true, false>
414 : _Optional_payload_base<_Tp>
416 using _Optional_payload_base<_Tp>::_Optional_payload_base;
418 _Optional_payload() =
default;
419 ~_Optional_payload() =
default;
420 _Optional_payload(
const _Optional_payload&) =
default;
421 _Optional_payload(_Optional_payload&&) =
default;
422 _Optional_payload& operator=(
const _Optional_payload&) =
default;
427 operator=(_Optional_payload&& __other)
428 noexcept(__and_v<is_nothrow_move_constructible<_Tp>,
429 is_nothrow_move_assignable<_Tp>>)
431 this->_M_move_assign(
std::move(__other));
437 template <
typename _Tp>
438 struct _Optional_payload<_Tp, true, false, false>
439 : _Optional_payload_base<_Tp>
441 using _Optional_payload_base<_Tp>::_Optional_payload_base;
443 _Optional_payload() =
default;
444 ~_Optional_payload() =
default;
445 _Optional_payload(
const _Optional_payload&) =
default;
446 _Optional_payload(_Optional_payload&&) =
default;
451 operator=(
const _Optional_payload& __other)
453 this->_M_copy_assign(__other);
460 operator=(_Optional_payload&& __other)
461 noexcept(__and_v<is_nothrow_move_constructible<_Tp>,
462 is_nothrow_move_assignable<_Tp>>)
464 this->_M_move_assign(
std::move(__other));
470 template <
typename _Tp,
bool _Copy,
bool _Move>
471 struct _Optional_payload<_Tp, false, _Copy, _Move>
472 : _Optional_payload<_Tp, true, false, false>
475 using _Optional_payload<_Tp,
true,
false,
false>::_Optional_payload;
476 _Optional_payload() =
default;
477 _Optional_payload(
const _Optional_payload&) =
default;
478 _Optional_payload(_Optional_payload&&) =
default;
479 _Optional_payload& operator=(
const _Optional_payload&) =
default;
480 _Optional_payload& operator=(_Optional_payload&&) =
default;
483 _GLIBCXX20_CONSTEXPR ~_Optional_payload() { this->_M_reset(); }
504 template<
typename _Tp,
505 bool = is_trivially_copy_constructible_v<_Tp>,
506 bool = is_trivially_move_constructible_v<_Tp>>
507 struct _Optional_base
510 constexpr _Optional_base() =
default;
513 template<
typename... _Args,
514 enable_if_t<is_constructible_v<_Tp, _Args...>,
bool> =
false>
516 _Optional_base(in_place_t, _Args&&... __args)
517 : _M_payload(in_place, std::
forward<_Args>(__args)...)
520 template<
typename _Up,
typename... _Args,
522 initializer_list<_Up>&,
523 _Args...>,
bool> =
false>
525 _Optional_base(in_place_t,
526 initializer_list<_Up> __il,
528 : _M_payload(in_place, __il, std::
forward<_Args>(__args)...)
533 _Optional_base(
const _Optional_base& __other)
534 noexcept(is_nothrow_copy_constructible_v<_Tp>)
535 : _M_payload(__other._M_payload._M_engaged, __other._M_payload)
539 _Optional_base(_Optional_base&& __other)
540 noexcept(is_nothrow_move_constructible_v<_Tp>)
541 : _M_payload(__other._M_payload._M_engaged,
542 std::move(__other._M_payload))
545#if __cpp_concepts >= 202002L
548 constexpr _Optional_base(
const _Optional_base&)
549 requires is_trivially_copy_constructible_v<_Tp> =
default;
551 constexpr _Optional_base(_Optional_base&&)
552 requires is_trivially_move_constructible_v<_Tp> = default;
556 _Optional_base& operator=(
const _Optional_base&) =
default;
557 _Optional_base& operator=(_Optional_base&&) =
default;
559 _Optional_payload<_Tp> _M_payload;
563 using _Stored_type = remove_const_t<_Tp>;
567 template<
typename... _Args>
569 _M_construct(_Args&&... __args)
570 noexcept(is_nothrow_constructible_v<_Stored_type, _Args...>)
576 _M_destruct() noexcept
577 { _M_payload._M_destroy(); }
582 { _M_payload._M_reset(); }
584 constexpr bool _M_is_engaged() const noexcept
585 {
return _M_payload._M_engaged; }
590 {
return _M_payload._M_get(); }
593 _M_get() const noexcept
594 {
return _M_payload._M_get(); }
597#if __cpp_concepts < 202002L
608 template<
typename _Tp,
typename _Dp>
609 class _Optional_base_impl
612 using _Stored_type = remove_const_t<_Tp>;
616 template<
typename... _Args>
618 _M_construct(_Args&&... __args)
619 noexcept(is_nothrow_constructible_v<_Stored_type, _Args...>)
621 static_cast<_Dp*
>(
this)->_M_payload._M_construct(
626 _M_destruct() noexcept
627 {
static_cast<_Dp*
>(
this)->_M_payload._M_destroy(); }
632 {
static_cast<_Dp*
>(
this)->_M_payload._M_reset(); }
634 constexpr bool _M_is_engaged() const noexcept
635 {
return static_cast<const _Dp*
>(
this)->_M_payload._M_engaged; }
640 {
return static_cast<_Dp*
>(
this)->_M_payload._M_get(); }
643 _M_get() const noexcept
644 {
return static_cast<const _Dp*
>(
this)->_M_payload._M_get(); }
647 template<
typename _Tp>
648 struct _Optional_base<_Tp, false, true>
649 : _Optional_base_impl<_Tp, _Optional_base<_Tp>>
652 constexpr _Optional_base() =
default;
655 template<
typename... _Args,
656 enable_if_t<is_constructible_v<_Tp, _Args...>,
bool> =
false>
658 _Optional_base(in_place_t, _Args&&... __args)
659 : _M_payload(in_place, std::
forward<_Args>(__args)...)
662 template<
typename _Up,
typename... _Args,
664 initializer_list<_Up>&,
665 _Args...>,
bool> =
false>
667 _Optional_base(in_place_t,
668 initializer_list<_Up> __il,
670 : _M_payload(in_place, __il, std::
forward<_Args>(__args)...)
674 constexpr _Optional_base(
const _Optional_base& __other)
675 : _M_payload(__other._M_payload._M_engaged, __other._M_payload)
678 constexpr _Optional_base(_Optional_base&& __other) =
default;
681 _Optional_base& operator=(
const _Optional_base&) =
default;
682 _Optional_base& operator=(_Optional_base&&) =
default;
684 _Optional_payload<_Tp> _M_payload;
687 template<
typename _Tp>
688 struct _Optional_base<_Tp, true, false>
689 : _Optional_base_impl<_Tp, _Optional_base<_Tp>>
692 constexpr _Optional_base() =
default;
695 template<
typename... _Args,
696 enable_if_t<is_constructible_v<_Tp, _Args...>,
bool> =
false>
698 _Optional_base(in_place_t, _Args&&... __args)
699 : _M_payload(in_place, std::
forward<_Args>(__args)...)
702 template<
typename _Up,
typename... _Args,
705 _Args...>,
bool> =
false>
707 _Optional_base(in_place_t,
710 : _M_payload(in_place, __il, std::
forward<_Args>(__args)...)
714 constexpr _Optional_base(
const _Optional_base& __other) =
default;
717 _Optional_base(_Optional_base&& __other)
718 noexcept(is_nothrow_move_constructible_v<_Tp>)
719 : _M_payload(__other._M_payload._M_engaged,
720 std::
move(__other._M_payload))
724 _Optional_base& operator=(
const _Optional_base&) =
default;
725 _Optional_base& operator=(_Optional_base&&) =
default;
727 _Optional_payload<_Tp> _M_payload;
730 template<
typename _Tp>
731 struct _Optional_base<_Tp, true, true>
732 : _Optional_base_impl<_Tp, _Optional_base<_Tp>>
735 constexpr _Optional_base() =
default;
738 template<
typename... _Args,
739 enable_if_t<is_constructible_v<_Tp, _Args...>,
bool> =
false>
741 _Optional_base(in_place_t, _Args&&... __args)
742 : _M_payload(in_place, std::
forward<_Args>(__args)...)
745 template<
typename _Up,
typename... _Args,
748 _Args...>,
bool> =
false>
750 _Optional_base(in_place_t,
753 : _M_payload(in_place, __il, std::
forward<_Args>(__args)...)
757 constexpr _Optional_base(
const _Optional_base& __other) =
default;
758 constexpr _Optional_base(_Optional_base&& __other) =
default;
761 _Optional_base& operator=(
const _Optional_base&) =
default;
762 _Optional_base& operator=(_Optional_base&&) =
default;
764 _Optional_payload<_Tp> _M_payload;
768 template<
typename _Tp>
769 inline constexpr bool __is_optional_v =
false;
770 template<
typename _Tp>
771 inline constexpr bool __is_optional_v<optional<_Tp>> =
true;
773 template<
typename _Tp,
typename _Wp>
774 using __converts_from_any_cvref = __or_<
781 template<
typename _Tp,
typename _Up>
782 using __converts_from_optional
783 = __converts_from_any_cvref<_Tp, optional<_Up>>;
785 template<
typename _Tp,
typename _Up>
786 using __assigns_from_optional =
787 __or_<is_assignable<_Tp&, const optional<_Up>&>,
792#if __cpp_concepts && __cpp_conditional_explicit && __glibcxx_remove_cvref
793# define _GLIBCXX_USE_CONSTRAINTS_FOR_OPTIONAL 1
796 template<
typename _Tp>
797 inline constexpr bool __is_valid_contained_type_for_optional =
799#if __cpp_lib_optional >= 202506L
800 is_lvalue_reference_v<_Tp> ||
802 (is_object_v<_Tp> && is_destructible_v<_Tp> && !is_array_v<_Tp>)
810 template<
typename _Tp>
812 :
private _Optional_base<_Tp>,
813 private _Enable_copy_move<
815 is_copy_constructible_v<_Tp>,
817 __and_v<is_copy_constructible<_Tp>, is_copy_assignable<_Tp>>,
819 is_move_constructible_v<_Tp>,
821 __and_v<is_move_constructible<_Tp>, is_move_assignable<_Tp>>,
825 static_assert(__is_valid_contained_type_for_optional<_Tp>);
828 using _Base = _Optional_base<_Tp>;
836#ifdef _GLIBCXX_USE_CONSTRAINTS_FOR_OPTIONAL
837 template<
typename _From,
typename = remove_cv_t<_Tp>>
838 static constexpr bool __not_constructing_bool_from_optional
843 template<
typename _From>
844 static constexpr bool
845 __not_constructing_bool_from_optional<_From, bool>
846 = !__is_optional_v<remove_cvref_t<_From>>;
852 template<
typename _From,
typename = remove_cv_t<_Tp>>
853 static constexpr bool __construct_from_contained_value
854 = !__converts_from_optional<_Tp, _From>::value;
858 template<
typename _From>
859 static constexpr bool __construct_from_contained_value<_From, bool>
862 template<
typename _From,
typename = remove_cv_t<_Tp>>
863 struct __not_constructing_bool_from_optional
867 template<
typename _From>
868 struct __not_constructing_bool_from_optional<_From, bool>
869 : bool_constant<!__is_optional_v<__remove_cvref_t<_From>>>
872 template<
typename _From,
typename = remove_cv_t<_Tp>>
873 struct __construct_from_contained_value
874 : __not_<__converts_from_optional<_Tp, _From>>
877 template<
typename _From>
878 struct __construct_from_contained_value<_From, bool>
882 template<
typename _Up>
883 using __not_self = __not_<is_same<optional, __remove_cvref_t<_Up>>>;
884 template<
typename _Up>
885 using __not_tag = __not_<is_same<in_place_t, __remove_cvref_t<_Up>>>;
886 template<
typename... _Cond>
887 using _Requires =
enable_if_t<__and_v<_Cond...>,
bool>;
891 using value_type = _Tp;
892#ifdef __cpp_lib_optional_range_support
893 using iterator = __gnu_cxx::__normal_iterator<_Tp*, optional>;
894 using const_iterator = __gnu_cxx::__normal_iterator<const _Tp*, optional>;
897 constexpr optional() noexcept { }
899 constexpr optional(nullopt_t)
noexcept { }
902#ifdef _GLIBCXX_USE_CONSTRAINTS_FOR_OPTIONAL
903 template<
typename _Up = remove_cv_t<_Tp>>
904 requires (!is_same_v<optional, remove_cvref_t<_Up>>)
905 && (!is_same_v<in_place_t, remove_cvref_t<_Up>>)
906 && is_constructible_v<_Tp, _Up>
907 && __not_constructing_bool_from_optional<_Up>
908 constexpr explicit(!is_convertible_v<_Up, _Tp>)
910 noexcept(is_nothrow_constructible_v<_Tp, _Up>)
911 : _Base(std::in_place, std::
forward<_Up>(__t)) { }
913 template<
typename _Up>
914 requires (!is_same_v<_Tp, _Up>)
915 && is_constructible_v<_Tp, const _Up&>
916 && __construct_from_contained_value<_Up>
917 constexpr explicit(!is_convertible_v<const _Up&, _Tp>)
918 optional(
const optional<_Up>& __t)
919 noexcept(is_nothrow_constructible_v<_Tp, const _Up&>)
922 emplace(__t._M_fwd());
925 template<
typename _Up>
926 requires (!is_same_v<_Tp, _Up>)
927 && is_constructible_v<_Tp, _Up>
928 && __construct_from_contained_value<_Up>
929 constexpr explicit(!is_convertible_v<_Up, _Tp>)
930 optional(optional<_Up>&& __t)
931 noexcept(is_nothrow_constructible_v<_Tp, _Up>)
937 template<
typename... _Args>
938 requires is_constructible_v<_Tp, _Args...>
940 optional(in_place_t, _Args&&... __args)
941 noexcept(is_nothrow_constructible_v<_Tp, _Args...>)
942 : _Base(std::in_place, std::
forward<_Args>(__args)...)
945 template<
typename _Up,
typename... _Args>
946 requires is_constructible_v<_Tp, initializer_list<_Up>&, _Args...>
948 optional(in_place_t, initializer_list<_Up> __il, _Args&&... __args)
949 noexcept(is_nothrow_constructible_v<_Tp, initializer_list<_Up>&,
951 : _Base(std::in_place, __il, std::
forward<_Args>(__args)...)
954 template<
typename _Up = remove_cv_t<_Tp>,
955 _Requires<__not_self<_Up>, __not_tag<_Up>,
956 is_constructible<_Tp, _Up>,
957 is_convertible<_Up, _Tp>,
958 __not_constructing_
bool_from_optional<_Up>> = true>
961 noexcept(is_nothrow_constructible_v<_Tp, _Up>)
962 : _Base(std::in_place, std::
forward<_Up>(__t)) { }
964 template<
typename _Up = remove_cv_t<_Tp>,
965 _Requires<__not_self<_Up>, __not_tag<_Up>,
966 is_constructible<_Tp, _Up>,
967 __not_<is_convertible<_Up, _Tp>>,
968 __not_constructing_
bool_from_optional<_Up>> = false>
971 noexcept(is_nothrow_constructible_v<_Tp, _Up>)
972 : _Base(std::in_place, std::
forward<_Up>(__t)) { }
974 template<
typename _Up,
975 _Requires<__not_<is_same<_Tp, _Up>>,
976 is_constructible<_Tp, const _Up&>,
977 is_convertible<const _Up&, _Tp>,
978 __construct_from_contained_value<_Up>> =
true>
980 optional(
const optional<_Up>& __t)
981 noexcept(is_nothrow_constructible_v<_Tp, const _Up&>)
984 emplace(__t._M_fwd());
987 template<
typename _Up,
988 _Requires<__not_<is_same<_Tp, _Up>>,
989 is_constructible<_Tp, const _Up&>,
990 __not_<is_convertible<const _Up&, _Tp>>,
991 __construct_from_contained_value<_Up>> =
false>
993 optional(
const optional<_Up>& __t)
994 noexcept(is_nothrow_constructible_v<_Tp, const _Up&>)
997 emplace(__t._M_fwd());
1000 template<
typename _Up,
1001 _Requires<__not_<is_same<_Tp, _Up>>,
1002 is_constructible<_Tp, _Up>,
1003 is_convertible<_Up, _Tp>,
1004 __construct_from_contained_value<_Up>> =
true>
1006 optional(optional<_Up>&& __t)
1007 noexcept(is_nothrow_constructible_v<_Tp, _Up>)
1013 template<
typename _Up,
1014 _Requires<__not_<is_same<_Tp, _Up>>,
1015 is_constructible<_Tp, _Up>,
1016 __not_<is_convertible<_Up, _Tp>>,
1017 __construct_from_contained_value<_Up>> =
false>
1019 optional(optional<_Up>&& __t)
1020 noexcept(is_nothrow_constructible_v<_Tp, _Up>)
1026 template<
typename... _Args,
1027 _Requires<is_constructible<_Tp, _Args...>> =
false>
1029 optional(in_place_t, _Args&&... __args)
1030 noexcept(is_nothrow_constructible_v<_Tp, _Args...>)
1031 : _Base(std::in_place, std::
forward<_Args>(__args)...) { }
1033 template<
typename _Up,
typename... _Args,
1034 _Requires<is_constructible<_Tp,
1035 initializer_list<_Up>&,
1038 optional(in_place_t, initializer_list<_Up> __il, _Args&&... __args)
1039 noexcept(is_nothrow_constructible_v<_Tp, initializer_list<_Up>&,
1041 : _Base(std::in_place, __il, std::
forward<_Args>(__args)...) { }
1045 _GLIBCXX20_CONSTEXPR optional&
1046 operator=(nullopt_t)
noexcept
1052 template<
typename _Up = remove_cv_t<_Tp>>
1053#ifdef _GLIBCXX_USE_CONSTRAINTS_FOR_OPTIONAL
1054 requires (!is_same_v<optional, remove_cvref_t<_Up>>)
1055 && (!(is_scalar_v<_Tp> && is_same_v<_Tp,
decay_t<_Up>>))
1056 && is_constructible_v<_Tp, _Up>
1057 && is_assignable_v<_Tp&, _Up>
1061 __not_<__and_<is_scalar<_Tp>,
1062 is_same<_Tp, decay_t<_Up>>>>,
1063 is_constructible<_Tp, _Up>,
1064 is_assignable<_Tp&, _Up>>,
1067 operator=(_Up&& __u)
1068 noexcept(__and_v<is_nothrow_constructible<_Tp, _Up>,
1069 is_nothrow_assignable<_Tp&, _Up>>)
1071 if (this->_M_is_engaged())
1079 template<
typename _Up>
1080#ifdef _GLIBCXX_USE_CONSTRAINTS_FOR_OPTIONAL
1081 requires (!is_same_v<_Tp, _Up>)
1082 && is_constructible_v<_Tp, const _Up&>
1083 && is_assignable_v<_Tp&, const _Up&>
1084 && (!__converts_from_optional<_Tp, _Up>::value)
1085 && (!__assigns_from_optional<_Tp, _Up>::value)
1089 is_constructible<_Tp, const _Up&>,
1090 is_assignable<_Tp&, const _Up&>,
1091 __not_<__converts_from_optional<_Tp, _Up>>,
1092 __not_<__assigns_from_optional<_Tp, _Up>>>,
1095 operator=(
const optional<_Up>& __u)
1096 noexcept(__and_v<is_nothrow_constructible<_Tp, const _Up&>,
1097 is_nothrow_assignable<_Tp&, const _Up&>>)
1101 if (this->_M_is_engaged())
1102 this->_M_get() = __u._M_fwd();
1104 this->_M_construct(__u._M_fwd());
1113 template<
typename _Up>
1114#ifdef _GLIBCXX_USE_CONSTRAINTS_FOR_OPTIONAL
1115 requires (!is_same_v<_Tp, _Up>)
1116 && is_constructible_v<_Tp, _Up>
1117 && is_assignable_v<_Tp&, _Up>
1118 && (!__converts_from_optional<_Tp, _Up>::value)
1119 && (!__assigns_from_optional<_Tp, _Up>::value)
1123 is_constructible<_Tp, _Up>,
1124 is_assignable<_Tp&, _Up>,
1125 __not_<__converts_from_optional<_Tp, _Up>>,
1126 __not_<__assigns_from_optional<_Tp, _Up>>>,
1129 operator=(optional<_Up>&& __u)
1130 noexcept(__and_v<is_nothrow_constructible<_Tp, _Up>,
1131 is_nothrow_assignable<_Tp&, _Up>>)
1135 if (this->_M_is_engaged())
1136 this->_M_get() =
std::move(__u)._M_fwd();
1138 this->_M_construct(
std::move(__u)._M_fwd());
1148 template<
typename... _Args>
1149 _GLIBCXX20_CONSTEXPR
1150 enable_if_t<is_constructible_v<_Tp, _Args...>, _Tp&>
1151 emplace(_Args&&... __args)
1152 noexcept(is_nothrow_constructible_v<_Tp, _Args...>)
1156 return this->_M_get();
1159 template<
typename _Up,
typename... _Args>
1160 _GLIBCXX20_CONSTEXPR
1163 emplace(initializer_list<_Up> __il, _Args&&... __args)
1164 noexcept(is_nothrow_constructible_v<_Tp, initializer_list<_Up>&,
1169 return this->_M_get();
1175 _GLIBCXX20_CONSTEXPR
void
1176 swap(optional& __other)
1177 noexcept(is_nothrow_move_constructible_v<_Tp>
1178 && is_nothrow_swappable_v<_Tp>)
1182 if (this->_M_is_engaged() && __other._M_is_engaged())
1183 swap(this->_M_get(), __other._M_get());
1184 else if (this->_M_is_engaged())
1186 __other._M_construct(
std::move(this->_M_get()));
1187 this->_M_destruct();
1189 else if (__other._M_is_engaged())
1191 this->_M_construct(
std::move(__other._M_get()));
1192 __other._M_destruct();
1196#ifdef __cpp_lib_optional_range_support
1198 constexpr iterator
begin() noexcept
1205 constexpr const_iterator
begin() const noexcept
1207 return const_iterator(
1212 constexpr iterator
end() noexcept
1214 return begin() + has_value();
1217 constexpr const_iterator
end() const noexcept
1219 return begin() + has_value();
1224 constexpr const _Tp*
1225 operator->() const noexcept
1227 __glibcxx_assert(this->_M_is_engaged());
1232 operator->() noexcept
1234 __glibcxx_assert(this->_M_is_engaged());
1238 constexpr const _Tp&
1241 __glibcxx_assert(this->_M_is_engaged());
1242 return this->_M_get();
1248 __glibcxx_assert(this->_M_is_engaged());
1249 return this->_M_get();
1255 __glibcxx_assert(this->_M_is_engaged());
1259 constexpr const _Tp&&
1262 __glibcxx_assert(this->_M_is_engaged());
1266 constexpr explicit operator bool() const noexcept
1267 {
return this->_M_is_engaged(); }
1269 constexpr bool has_value() const noexcept
1270 {
return this->_M_is_engaged(); }
1272 constexpr const _Tp&
1275 if (this->_M_is_engaged())
1276 return this->_M_get();
1277 __throw_bad_optional_access();
1283 if (this->_M_is_engaged())
1284 return this->_M_get();
1285 __throw_bad_optional_access();
1291 if (this->_M_is_engaged())
1293 __throw_bad_optional_access();
1296 constexpr const _Tp&&
1299 if (this->_M_is_engaged())
1301 __throw_bad_optional_access();
1306 template<
typename _Up = remove_cv_t<_Tp>>
1307 constexpr remove_cv_t<_Tp>
1308 value_or(_Up&& __u)
const&
1310 using _Xp = remove_cv_t<_Tp>;
1311 static_assert(is_convertible_v<const _Tp&, _Xp>);
1312 static_assert(is_convertible_v<_Up, _Xp>);
1314 if (this->_M_is_engaged())
1315 return this->_M_get();
1319 template<
typename _Up = remove_cv_t<_Tp>>
1320 constexpr remove_cv_t<_Tp>
1321 value_or(_Up&& __u) &&
1323 using _Xp = remove_cv_t<_Tp>;
1324 static_assert(is_convertible_v<_Tp, _Xp>);
1325 static_assert(is_convertible_v<_Up, _Xp>);
1327 if (this->_M_is_engaged())
1332#if __cpp_lib_optional >= 202110L
1335 template<
typename _Fn>
1337 and_then(_Fn&& __f) &
1339 using _Up = remove_cvref_t<invoke_result_t<_Fn, _Tp&>>;
1340 static_assert(__is_optional_v<_Up>,
1341 "the function passed to std::optional<T>::and_then "
1342 "must return a std::optional");
1349 template<
typename _Fn>
1351 and_then(_Fn&& __f)
const &
1353 using _Up = remove_cvref_t<invoke_result_t<_Fn, const _Tp&>>;
1354 static_assert(__is_optional_v<_Up>,
1355 "the function passed to std::optional<T>::and_then "
1356 "must return a std::optional");
1363 template<
typename _Fn>
1365 and_then(_Fn&& __f) &&
1367 using _Up = remove_cvref_t<invoke_result_t<_Fn, _Tp>>;
1368 static_assert(__is_optional_v<_Up>,
1369 "the function passed to std::optional<T>::and_then "
1370 "must return a std::optional");
1377 template<
typename _Fn>
1379 and_then(_Fn&& __f)
const &&
1381 using _Up = remove_cvref_t<invoke_result_t<_Fn, const _Tp>>;
1382 static_assert(__is_optional_v<_Up>,
1383 "the function passed to std::optional<T>::and_then "
1384 "must return a std::optional");
1391 template<
typename _Fn>
1393 transform(_Fn&& __f) &
1395 using _Up = remove_cv_t<invoke_result_t<_Fn, _Tp&>>;
1397 return optional<_Up>(_Optional_func<_Fn>{__f}, _M_get());
1399 return optional<_Up>();
1402 template<
typename _Fn>
1404 transform(_Fn&& __f)
const &
1406 using _Up = remove_cv_t<invoke_result_t<_Fn, const _Tp&>>;
1408 return optional<_Up>(_Optional_func<_Fn>{__f}, _M_get());
1410 return optional<_Up>();
1413 template<
typename _Fn>
1415 transform(_Fn&& __f) &&
1417 using _Up = remove_cv_t<invoke_result_t<_Fn, _Tp>>;
1419 return optional<_Up>(_Optional_func<_Fn>{__f},
std::move(_M_get()));
1421 return optional<_Up>();
1424 template<
typename _Fn>
1426 transform(_Fn&& __f)
const &&
1428 using _Up = remove_cv_t<invoke_result_t<_Fn, const _Tp>>;
1430 return optional<_Up>(_Optional_func<_Fn>{__f},
std::move(_M_get()));
1432 return optional<_Up>();
1435 template<
typename _Fn>
requires invocable<_Fn> && copy_constructible<_Tp>
1437 or_else(_Fn&& __f)
const&
1439 using _Up = invoke_result_t<_Fn>;
1440 static_assert(is_same_v<remove_cvref_t<_Up>, optional>,
1441 "the function passed to std::optional<T>::or_else "
1442 "must return a std::optional<T>");
1450 template<
typename _Fn>
requires invocable<_Fn> && move_constructible<_Tp>
1452 or_else(_Fn&& __f) &&
1454 using _Up = invoke_result_t<_Fn>;
1455 static_assert(is_same_v<remove_cvref_t<_Up>, optional>,
1456 "the function passed to std::optional<T>::or_else "
1457 "must return a std::optional<T>");
1466 _GLIBCXX20_CONSTEXPR
void reset() noexcept { this->_M_reset(); }
1469 using _Base::_M_get;
1471 [[__gnu__::__always_inline__]]
1474 {
return _M_get(); }
1476 [[__gnu__::__always_inline__]]
1478 _M_fwd() &&
noexcept
1481 [[__gnu__::__always_inline__]]
1482 constexpr const _Tp&
1483 _M_fwd() const& noexcept
1484 {
return _M_get(); }
1486 [[__gnu__::__always_inline__]]
1487 constexpr const _Tp&&
1488 _M_fwd() const&& noexcept
1491 template<
typename _Up>
friend class optional;
1493#if __cpp_lib_optional >= 202110L
1494 template<
typename _Fn,
typename _Value>
1496 optional(_Optional_func<_Fn> __f, _Value&& __v)
1503#if __cpp_lib_optional >= 202506L
1504 template<
typename _Tp>
1505 class optional<_Tp&>;
1507 template<
typename _Tp>
1508 constexpr bool __is_optional_ref_v =
false;
1510 template<
typename _Tp>
1511 constexpr bool __is_optional_ref_v<optional<_Tp&>> =
true;
1513 template<
typename _Tp>
1514 struct __optional_ref_base
1517#ifdef __cpp_lib_optional_range_support
1518 template<
typename _Tp>
1519 struct __optional_ref_base<_Tp[]>
1522 template<
typename _Tp>
1523 requires is_object_v<_Tp>
1524 struct __optional_ref_base<_Tp>
1526 using iterator = __gnu_cxx::__normal_iterator<_Tp*, optional<_Tp&>>;
1530 template<
typename _Tp>
1531 class optional<_Tp&> :
public __optional_ref_base<_Tp>
1533 static_assert(__is_valid_contained_type_for_optional<_Tp&>);
1539 constexpr optional() noexcept = default;
1540 constexpr optional(nullopt_t) noexcept : optional() {}
1541 constexpr optional(
const optional&)
noexcept =
default;
1543 template<
typename _Arg>
1544 requires is_constructible_v<_Tp&, _Arg>
1545 && (!reference_constructs_from_temporary_v<_Tp&, _Arg>)
1547 optional(in_place_t, _Arg&& __arg)
1552 template<
typename _Up>
1553 requires (!is_same_v<remove_cvref_t<_Up>, optional>)
1554 && (!is_same_v<remove_cvref_t<_Up>, in_place_t>)
1555 && is_constructible_v<_Tp&, _Up>
1556 && (!reference_constructs_from_temporary_v<_Tp&, _Up>)
1557 explicit(!is_convertible_v<_Up, _Tp&>)
1560 noexcept(is_nothrow_constructible_v<_Tp&, _Up>)
1565 template<
typename _Up>
1566 requires (!is_same_v<remove_cvref_t<_Up>, optional>)
1567 && (!is_same_v<remove_cvref_t<_Up>, in_place_t>)
1568 && is_constructible_v<_Tp&, _Up>
1569 && reference_constructs_from_temporary_v<_Tp&, _Up>
1570 explicit(!is_convertible_v<_Up, _Tp&>)
1572 optional(_Up&& __u) =
delete;
1575 template<
typename _Up>
1576 requires (!is_same_v<remove_cv_t<_Tp>, optional<_Up>>)
1577 && (!is_same_v<_Tp&, _Up>)
1578 && is_constructible_v<_Tp&, _Up&>
1579 && (!reference_constructs_from_temporary_v<_Tp&, _Up&>)
1580 explicit(!is_convertible_v<_Up&, _Tp&>)
1582 optional(optional<_Up>& __rhs)
1583 noexcept(is_nothrow_constructible_v<_Tp&, _Up&>)
1586 __convert_ref_init_val(__rhs._M_fwd());
1589 template<
typename _Up>
1590 requires (!is_same_v<remove_cv_t<_Tp>, optional<_Up>>)
1591 && (!is_same_v<_Tp&, _Up>)
1592 && is_constructible_v<_Tp&, _Up&>
1593 && reference_constructs_from_temporary_v<_Tp&, _Up&>
1594 explicit(!is_convertible_v<_Up&, _Tp&>)
1596 optional(optional<_Up>& __rhs) =
delete;
1599 template<
typename _Up>
1600 requires (!is_same_v<remove_cv_t<_Tp>, optional<_Up>>)
1601 && (!is_same_v<_Tp&, _Up>)
1602 && is_constructible_v<_Tp&, const _Up&>
1603 && (!reference_constructs_from_temporary_v<_Tp&, const _Up&>)
1604 explicit(!is_convertible_v<const _Up&, _Tp&>)
1606 optional(
const optional<_Up>& __rhs)
1607 noexcept(is_nothrow_constructible_v<_Tp&, _Up&>)
1610 __convert_ref_init_val(__rhs._M_fwd());
1613 template<
typename _Up>
1614 requires (!is_same_v<remove_cv_t<_Tp>, optional<_Up>>)
1615 && (!is_same_v<_Tp&, _Up>)
1616 && is_constructible_v<_Tp&, const _Up&>
1617 && reference_constructs_from_temporary_v<_Tp&, const _Up&>
1618 explicit(!is_convertible_v<const _Up&, _Tp&>)
1620 optional(
const optional<_Up>& __rhs) =
delete;
1623 template<
typename _Up>
1624 requires (!is_same_v<remove_cv_t<_Tp>, optional<_Up>>)
1625 && (!is_same_v<_Tp&, _Up>)
1626 && is_constructible_v<_Tp&, _Up>
1627 && (!reference_constructs_from_temporary_v<_Tp&, _Up>)
1628 explicit(!is_convertible_v<_Up, _Tp&>)
1630 optional(optional<_Up>&& __rhs)
1631 noexcept(is_nothrow_constructible_v<_Tp&, _Up>)
1634 __convert_ref_init_val(
std::move(__rhs)._M_fwd());
1637 template<
typename _Up>
1638 requires (!is_same_v<remove_cv_t<_Tp>, optional<_Up>>)
1639 && (!is_same_v<_Tp&, _Up>)
1640 && is_constructible_v<_Tp&, _Up>
1641 && reference_constructs_from_temporary_v<_Tp&, _Up>
1642 explicit(!is_convertible_v<_Up, _Tp&>)
1644 optional(optional<_Up>&& __rhs) =
delete;
1647 template<
typename _Up>
1648 requires (!is_same_v<remove_cv_t<_Tp>, optional<_Up>>)
1649 && (!is_same_v<_Tp&, _Up>)
1650 && is_constructible_v<_Tp&, const _Up>
1651 && (!reference_constructs_from_temporary_v<_Tp&, _Up>)
1652 explicit(!is_convertible_v<const _Up, _Tp&>)
1654 optional(
const optional<_Up>&& __rhs)
1655 noexcept(is_nothrow_constructible_v<_Tp&, const _Up>)
1658 __convert_ref_init_val(
std::move(__rhs)._M_fwd());
1661 template<
typename _Up>
1662 requires (!is_same_v<remove_cv_t<_Tp>, optional<_Up>>)
1663 && (!is_same_v<_Tp&, _Up>)
1664 && is_constructible_v<_Tp&, const _Up>
1665 && reference_constructs_from_temporary_v<_Tp&, const _Up>
1666 explicit(!is_convertible_v<const _Up, _Tp&>)
1668 optional(
const optional<_Up>&& __rhs) =
delete;
1670 constexpr ~optional() =
default;
1673 constexpr optional& operator=(nullopt_t)
noexcept
1679 constexpr optional& operator=(
const optional&)
noexcept =
default;
1681 template<
typename _Up>
1682 requires is_constructible_v<_Tp&, _Up>
1683 && (!reference_constructs_from_temporary_v<_Tp&, _Up>)
1686 noexcept(is_nothrow_constructible_v<_Tp&, _Up>)
1695 constexpr void swap(optional& __rhs)
noexcept
1696 { std::swap(_M_val, __rhs._M_val); }
1698#ifdef __cpp_lib_optional_range_support
1700 constexpr auto begin() const noexcept
1701 requires is_object_v<_Tp> && (!is_unbounded_array_v<_Tp>)
1702 {
return __gnu_cxx::__normal_iterator<_Tp*, optional>(_M_val); }
1704 constexpr auto end() const noexcept
1705 requires is_object_v<_Tp> && (!is_unbounded_array_v<_Tp>)
1706 {
return begin() + has_value(); }
1710 constexpr _Tp* operator->() const noexcept
1712 __glibcxx_assert(_M_val);
1716 constexpr _Tp&
operator*() const noexcept
1718 __glibcxx_assert(_M_val);
1722 constexpr explicit operator bool() const noexcept
1727 constexpr bool has_value() const noexcept
1732 constexpr _Tp& value()
const
1736 __throw_bad_optional_access();
1741 template<
typename _Up = remove_cv_t<_Tp>>
1742 requires is_object_v<_Tp> && (!is_array_v<_Tp>)
1744 value_or(_Up&& __u)
const
1746 using _Xp = remove_cv_t<_Tp>;
1747 static_assert(is_convertible_v<_Tp&, _Xp>);
1748 static_assert(is_convertible_v<_Up, _Xp>);
1755 template<
typename _Fn>
1757 and_then(_Fn&& __f)
const
1759 using _Up = remove_cvref_t<invoke_result_t<_Fn, _Tp&>>;
1760 static_assert(__is_optional_v<_Up>,
1761 "the function passed to std::optional<T&>::and_then "
1762 "must return a std::optional");
1769 template<
typename _Fn>
1771 optional<remove_cv_t<invoke_result_t<_Fn, _Tp&>>>
1772 transform(_Fn&& __f)
const
1774 using _Up = remove_cv_t<invoke_result_t<_Fn, _Tp&>>;
1776 return optional<_Up>(_Optional_func<_Fn>{__f}, *_M_val);
1778 return optional<_Up>();
1781 template<
typename _Fn>
1785 or_else(_Fn&& __f)
const
1787 static_assert(is_same_v<remove_cvref_t<invoke_result_t<_Fn>>, optional>,
1788 "the function passed to std::optional<T&>::or_else "
1789 "must return a std::optional<T&>");
1799 constexpr void reset() noexcept
1805 _Tp *_M_val =
nullptr;
1807 [[__gnu__::__always_inline__]]
1809 _M_fwd() const noexcept
1812 template<
typename _Up>
friend class optional;
1814 template<
typename _Up>
1817 __convert_ref_init_val(_Up&& __u)
1824 template<
typename _Fn,
typename _Value>
1826 optional(_Optional_func<_Fn> __f, _Value&& __v)
1834 template<
typename _Tp>
1835 using __optional_relop_t =
1838 template<
typename _Tp,
typename _Up>
1839 using __optional_eq_t = __optional_relop_t<
1843 template<
typename _Tp,
typename _Up>
1844 using __optional_ne_t = __optional_relop_t<
1848 template<
typename _Tp,
typename _Up>
1849 using __optional_lt_t = __optional_relop_t<
1853 template<
typename _Tp,
typename _Up>
1854 using __optional_gt_t = __optional_relop_t<
1858 template<
typename _Tp,
typename _Up>
1859 using __optional_le_t = __optional_relop_t<
1863 template<
typename _Tp,
typename _Up>
1864 using __optional_ge_t = __optional_relop_t<
1869 template<
typename _Tp,
typename _Up>
1871 operator==(
const optional<_Tp>& __lhs,
const optional<_Up>& __rhs)
1872 -> __optional_eq_t<_Tp, _Up>
1874 if (__lhs.has_value() != __rhs.has_value())
1876 if (!__lhs.has_value())
1878 return *__lhs == *__rhs;
1881 template<
typename _Tp,
typename _Up>
1883 operator!=(
const optional<_Tp>& __lhs,
const optional<_Up>& __rhs)
1884 -> __optional_ne_t<_Tp, _Up>
1886 if (__lhs.has_value() != __rhs.has_value())
1888 if (!__lhs.has_value())
1890 return *__lhs != *__rhs;
1893 template<
typename _Tp,
typename _Up>
1895 operator<(
const optional<_Tp>& __lhs,
const optional<_Up>& __rhs)
1896 -> __optional_lt_t<_Tp, _Up>
1898 if (!__rhs.has_value())
1900 if (!__lhs.has_value())
1902 return *__lhs < *__rhs;
1905 template<
typename _Tp,
typename _Up>
1907 operator>(
const optional<_Tp>& __lhs,
const optional<_Up>& __rhs)
1908 -> __optional_gt_t<_Tp, _Up>
1910 if (!__lhs.has_value())
1912 if (!__rhs.has_value())
1914 return *__lhs > *__rhs;
1917 template<
typename _Tp,
typename _Up>
1919 operator<=(
const optional<_Tp>& __lhs,
const optional<_Up>& __rhs)
1920 -> __optional_le_t<_Tp, _Up>
1922 if (!__lhs.has_value())
1924 if (!__rhs.has_value())
1926 return *__lhs <= *__rhs;
1929 template<
typename _Tp,
typename _Up>
1931 operator>=(
const optional<_Tp>& __lhs,
const optional<_Up>& __rhs)
1932 -> __optional_ge_t<_Tp, _Up>
1934 if (!__rhs.has_value())
1936 if (!__lhs.has_value())
1938 return *__lhs >= *__rhs;
1941#ifdef __cpp_lib_three_way_comparison
1942 template<
typename _Tp, three_way_comparable_with<_Tp> _Up>
1945 operator<=>(
const optional<_Tp>& __x,
const optional<_Up>& __y)
1947 return __x && __y ? *__x <=> *__y : bool(__x) <=> bool(__y);
1952 template<
typename _Tp>
1955 operator==(
const optional<_Tp>& __lhs, nullopt_t)
noexcept
1958#ifdef __cpp_lib_three_way_comparison
1959 template<
typename _Tp>
1961 constexpr strong_ordering
1962 operator<=>(
const optional<_Tp>& __x, nullopt_t)
noexcept
1963 {
return bool(__x) <=>
false; }
1965 template<
typename _Tp>
1967 operator==(nullopt_t,
const optional<_Tp>& __rhs)
noexcept
1970 template<
typename _Tp>
1972 operator!=(
const optional<_Tp>& __lhs, nullopt_t)
noexcept
1973 {
return static_cast<bool>(__lhs); }
1975 template<
typename _Tp>
1977 operator!=(nullopt_t,
const optional<_Tp>& __rhs)
noexcept
1978 {
return static_cast<bool>(__rhs); }
1980 template<
typename _Tp>
1982 operator<(
const optional<_Tp>& , nullopt_t)
noexcept
1985 template<
typename _Tp>
1987 operator<(nullopt_t,
const optional<_Tp>& __rhs)
noexcept
1988 {
return static_cast<bool>(__rhs); }
1990 template<
typename _Tp>
1992 operator>(
const optional<_Tp>& __lhs, nullopt_t)
noexcept
1993 {
return static_cast<bool>(__lhs); }
1995 template<
typename _Tp>
1997 operator>(nullopt_t,
const optional<_Tp>& )
noexcept
2000 template<
typename _Tp>
2002 operator<=(
const optional<_Tp>& __lhs, nullopt_t)
noexcept
2005 template<
typename _Tp>
2007 operator<=(nullopt_t,
const optional<_Tp>& )
noexcept
2010 template<
typename _Tp>
2012 operator>=(
const optional<_Tp>& , nullopt_t)
noexcept
2015 template<
typename _Tp>
2017 operator>=(nullopt_t,
const optional<_Tp>& __rhs)
noexcept
2021#if __cpp_lib_concepts
2024# define _REQUIRES_NOT_OPTIONAL(T) requires (!__is_optional_v<T>)
2026# define _REQUIRES_NOT_OPTIONAL(T)
2030 template<
typename _Tp,
typename _Up>
2031 _REQUIRES_NOT_OPTIONAL(_Up)
2033 operator== [[nodiscard]] (
const optional<_Tp>& __lhs,
const _Up& __rhs)
2034 -> __optional_eq_t<_Tp, _Up>
2036 if (__lhs.has_value())
2037 return *__lhs == __rhs;
2041 template<
typename _Tp,
typename _Up>
2042 _REQUIRES_NOT_OPTIONAL(_Tp)
2044 operator== [[nodiscard]] (
const _Tp& __lhs,
const optional<_Up>& __rhs)
2045 -> __optional_eq_t<_Tp, _Up>
2047 if (__rhs.has_value())
2048 return __lhs == *__rhs;
2052 template<
typename _Tp,
typename _Up>
2053 _REQUIRES_NOT_OPTIONAL(_Up)
2055 operator!= [[nodiscard]] (
const optional<_Tp>& __lhs,
const _Up& __rhs)
2056 -> __optional_ne_t<_Tp, _Up>
2058 if (__lhs.has_value())
2059 return *__lhs != __rhs;
2063 template<
typename _Tp,
typename _Up>
2064 _REQUIRES_NOT_OPTIONAL(_Tp)
2066 operator!= [[nodiscard]] (
const _Tp& __lhs,
const optional<_Up>& __rhs)
2067 -> __optional_ne_t<_Tp, _Up>
2069 if (__rhs.has_value())
2070 return __lhs != *__rhs;
2074 template<
typename _Tp,
typename _Up>
2075 _REQUIRES_NOT_OPTIONAL(_Up)
2077 operator< [[nodiscard]] (
const optional<_Tp>& __lhs,
const _Up& __rhs)
2078 -> __optional_lt_t<_Tp, _Up>
2080 if (__lhs.has_value())
2081 return *__lhs < __rhs;
2085 template<
typename _Tp,
typename _Up>
2086 _REQUIRES_NOT_OPTIONAL(_Tp)
2088 operator< [[nodiscard]] (
const _Tp& __lhs,
const optional<_Up>& __rhs)
2089 -> __optional_lt_t<_Tp, _Up>
2091 if (__rhs.has_value())
2092 return __lhs < *__rhs;
2096 template<
typename _Tp,
typename _Up>
2097 _REQUIRES_NOT_OPTIONAL(_Up)
2099 operator> [[nodiscard]] (
const optional<_Tp>& __lhs,
const _Up& __rhs)
2100 -> __optional_gt_t<_Tp, _Up>
2102 if (__lhs.has_value())
2103 return *__lhs > __rhs;
2107 template<
typename _Tp,
typename _Up>
2108 _REQUIRES_NOT_OPTIONAL(_Tp)
2110 operator> [[nodiscard]] (
const _Tp& __lhs,
const optional<_Up>& __rhs)
2111 -> __optional_gt_t<_Tp, _Up>
2113 if (__rhs.has_value())
2114 return __lhs > *__rhs;
2118 template<
typename _Tp,
typename _Up>
2119 _REQUIRES_NOT_OPTIONAL(_Up)
2121 operator<= [[nodiscard]] (
const optional<_Tp>& __lhs,
const _Up& __rhs)
2122 -> __optional_le_t<_Tp, _Up>
2124 if (__lhs.has_value())
2125 return *__lhs <= __rhs;
2129 template<
typename _Tp,
typename _Up>
2130 _REQUIRES_NOT_OPTIONAL(_Tp)
2132 operator<= [[nodiscard]] (
const _Tp& __lhs,
const optional<_Up>& __rhs)
2133 -> __optional_le_t<_Tp, _Up>
2135 if (__rhs.has_value())
2136 return __lhs <= *__rhs;
2140 template<
typename _Tp,
typename _Up>
2141 _REQUIRES_NOT_OPTIONAL(_Up)
2143 operator>= [[nodiscard]] (
const optional<_Tp>& __lhs,
const _Up& __rhs)
2144 -> __optional_ge_t<_Tp, _Up>
2146 if (__lhs.has_value())
2147 return *__lhs >= __rhs;
2151 template<
typename _Tp,
typename _Up>
2152 _REQUIRES_NOT_OPTIONAL(_Tp)
2154 operator>= [[nodiscard]] (
const _Tp& __lhs,
const optional<_Up>& __rhs)
2155 -> __optional_ge_t<_Tp, _Up>
2157 if (__rhs.has_value())
2158 return __lhs >= *__rhs;
2162#ifdef __cpp_lib_three_way_comparison
2166 template<
typename _Tp>
2167 concept __is_derived_from_optional =
requires (
const _Tp& __t) {
2168 []<
typename _Up>(
const optional<_Up>&){ }(__t);
2171 template<
typename _Tp,
typename _Up>
2172 requires (!__is_derived_from_optional<_Up>)
2174 && three_way_comparable_with<_Tp, _Up>
2176 operator<=> [[nodiscard]] (
const optional<_Tp>& __x,
const _Up& __v)
2177 {
return bool(__x) ? *__x <=> __v : strong_ordering::less; }
2184 template<
typename _Tp>
2185 _GLIBCXX20_CONSTEXPR
2187 swap(optional<_Tp>& __lhs, optional<_Tp>& __rhs)
2188 noexcept(
noexcept(__lhs.swap(__rhs)))
2189 { __lhs.swap(__rhs); }
2191#if __cpp_lib_optional >= 202506L
2194 template<
typename _Tp>
2196 swap(optional<_Tp&>& __lhs, optional<_Tp&>& __rhs)
noexcept
2197 { __lhs.swap(__rhs); }
2202 template<
typename _Tp>
2203 enable_if_t<!(is_move_constructible_v<_Tp> && is_swappable_v<_Tp>)>
2204 swap(optional<_Tp>&, optional<_Tp>&) =
delete;
2206#if __cpp_lib_optional >= 202506L
2207 template<
int = 0,
typename _Tp>
2209 template<
typename _Tp>
2213 optional<decay_t<_Tp>>>
2214 make_optional(_Tp&& __t)
2215 noexcept(is_nothrow_constructible_v<optional<decay_t<_Tp>>, _Tp>)
2218 template<
typename _Tp,
typename... _Args>
2222 make_optional(_Args&&... __args)
2223 noexcept(is_nothrow_constructible_v<_Tp, _Args...>)
2226 template<
typename _Tp,
typename _Up,
typename... _Args>
2231 noexcept(is_nothrow_constructible_v<_Tp, initializer_list<_Up>&, _Args...>)
2236 template<
typename _Tp,
typename _Up = remove_const_t<_Tp>>
2237 struct __optional_hash
2238#if ! _GLIBCXX_INLINE_VERSION
2239 :
public __hash_empty_base<_Up>
2242#if __cplusplus < 202002L
2243 using result_type [[__deprecated__]] = size_t;
2244 using argument_type [[__deprecated__]] = optional<_Tp>;
2248 operator()(
const optional<_Tp>& __t)
const
2249 noexcept(
noexcept(hash<_Up>{}(*__t)))
2253 constexpr size_t __magic_disengaged_hash =
static_cast<size_t>(-3333);
2254 return __t ? hash<_Up>{}(*__t) : __magic_disengaged_hash;
2258 template<
typename _Tp>
2259 struct hash<optional<_Tp>>
2261 :
public __conditional_t<__is_hash_enabled_for<remove_const_t<_Tp>>,
2262 __optional_hash<_Tp>,
2263 __hash_not_enabled<_Tp>>
2266 template<
typename _Tp>
2272#if __cpp_deduction_guides >= 201606
2273 template <
typename _Tp> optional(_Tp) -> optional<_Tp>;
2276#ifdef __cpp_lib_optional_range_support
2277 template<
typename _Tp>
2278 inline constexpr bool
2281#if __cpp_lib_optional >= 202506L
2282 template<
typename _Tp>
2284 ranges::enable_borrowed_range<optional<_Tp&>> =
true;
2287 template<
typename _Tp>
2288 inline constexpr range_format
2289 format_kind<optional<_Tp>> = range_format::disabled;
2292#undef _GLIBCXX_USE_CONSTRAINTS_FOR_OPTIONAL
2294_GLIBCXX_END_NAMESPACE_VERSION
constexpr bool enable_view
[range.view] The ranges::enable_view boolean.
constexpr complex< _Tp > operator*(const complex< _Tp > &__x, const complex< _Tp > &__y)
Return new complex value x times y.
__bool_constant< true > true_type
The type used as a compile-time boolean with true value.
typename remove_reference< _Tp >::type remove_reference_t
Alias template for remove_reference.
typename enable_if< _Cond, _Tp >::type enable_if_t
Alias template for enable_if.
typename decay< _Tp >::type decay_t
Alias template for decay.
auto declval() noexcept -> decltype(__declval< _Tp >(0))
constexpr _Tp * addressof(_Tp &__r) noexcept
Returns the actual address of the object or function referenced by r, even in the presence of an over...
constexpr std::remove_reference< _Tp >::type && move(_Tp &&__t) noexcept
Convert a value to an rvalue.
constexpr __invoke_result< _Callable, _Args... >::type __invoke(_Callable &&__fn, _Args &&... __args) noexcept(__is_nothrow_invocable< _Callable, _Args... >::value)
Invoke a callable object.
constexpr _Tp * __addressof(_Tp &__r) noexcept
Same as C++11 std::addressof.
constexpr _Tp && forward(typename std::remove_reference< _Tp >::type &__t) noexcept
Forward an lvalue.
_Tp * end(valarray< _Tp > &__va) noexcept
Return an iterator pointing to one past the last element of the valarray.
_Tp * begin(valarray< _Tp > &__va) noexcept
Return an iterator pointing to the first element of the valarray.
constexpr nullopt_t nullopt
Tag to disengage optional objects.
ISO C++ entities toplevel namespace is std.
typename __detail::__cmp3way_res_impl< _Tp, _Up >::type compare_three_way_result_t
[cmp.result], result of three-way comparison
constexpr void _Construct(_Tp *__p, _Args &&... __args)
Primary class template hash.
Base class for all library exceptions.
[concept.invocable], concept invocable