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 defined(__clang__) && __cpp_lib_optional >= 202106L
325 if (std::is_constant_evaluated())
331#if __cplusplus >= 202002L
332 template<
typename _Fn,
typename _Up>
334 _M_apply(_Optional_func<_Fn> __f, _Up&& __x)
348 {
return this->_M_payload._M_value; }
351 _M_get() const noexcept
352 {
return this->_M_payload._M_value; }
358 if (this->_M_engaged)
361 this->_M_engaged =
false;
366 template <
typename _Tp,
368 is_trivially_destructible_v<_Tp>,
370 is_trivially_copy_assignable_v<_Tp>
371 && is_trivially_copy_constructible_v<_Tp>,
373 is_trivially_move_assignable_v<_Tp>
374 && is_trivially_move_constructible_v<_Tp>>
375 struct _Optional_payload;
378 template <
typename _Tp>
379 struct _Optional_payload<_Tp, true, true, true>
380 : _Optional_payload_base<_Tp>
382 using _Optional_payload_base<_Tp>::_Optional_payload_base;
384 _Optional_payload() =
default;
388 template <
typename _Tp>
389 struct _Optional_payload<_Tp, true, false, true>
390 : _Optional_payload_base<_Tp>
392 using _Optional_payload_base<_Tp>::_Optional_payload_base;
394 _Optional_payload() =
default;
395 ~_Optional_payload() =
default;
396 _Optional_payload(
const _Optional_payload&) =
default;
397 _Optional_payload(_Optional_payload&&) =
default;
398 _Optional_payload& operator=(_Optional_payload&&) =
default;
403 operator=(
const _Optional_payload& __other)
405 this->_M_copy_assign(__other);
411 template <
typename _Tp>
412 struct _Optional_payload<_Tp, true, true, false>
413 : _Optional_payload_base<_Tp>
415 using _Optional_payload_base<_Tp>::_Optional_payload_base;
417 _Optional_payload() =
default;
418 ~_Optional_payload() =
default;
419 _Optional_payload(
const _Optional_payload&) =
default;
420 _Optional_payload(_Optional_payload&&) =
default;
421 _Optional_payload& operator=(
const _Optional_payload&) =
default;
426 operator=(_Optional_payload&& __other)
427 noexcept(__and_v<is_nothrow_move_constructible<_Tp>,
428 is_nothrow_move_assignable<_Tp>>)
430 this->_M_move_assign(
std::move(__other));
436 template <
typename _Tp>
437 struct _Optional_payload<_Tp, true, false, false>
438 : _Optional_payload_base<_Tp>
440 using _Optional_payload_base<_Tp>::_Optional_payload_base;
442 _Optional_payload() =
default;
443 ~_Optional_payload() =
default;
444 _Optional_payload(
const _Optional_payload&) =
default;
445 _Optional_payload(_Optional_payload&&) =
default;
450 operator=(
const _Optional_payload& __other)
452 this->_M_copy_assign(__other);
459 operator=(_Optional_payload&& __other)
460 noexcept(__and_v<is_nothrow_move_constructible<_Tp>,
461 is_nothrow_move_assignable<_Tp>>)
463 this->_M_move_assign(
std::move(__other));
469 template <
typename _Tp,
bool _Copy,
bool _Move>
470 struct _Optional_payload<_Tp, false, _Copy, _Move>
471 : _Optional_payload<_Tp, true, false, false>
474 using _Optional_payload<_Tp,
true,
false,
false>::_Optional_payload;
475 _Optional_payload() =
default;
476 _Optional_payload(
const _Optional_payload&) =
default;
477 _Optional_payload(_Optional_payload&&) =
default;
478 _Optional_payload& operator=(
const _Optional_payload&) =
default;
479 _Optional_payload& operator=(_Optional_payload&&) =
default;
482 _GLIBCXX20_CONSTEXPR ~_Optional_payload() { this->_M_reset(); }
503 template<
typename _Tp,
504 bool = is_trivially_copy_constructible_v<_Tp>,
505 bool = is_trivially_move_constructible_v<_Tp>>
506 struct _Optional_base
509 constexpr _Optional_base() =
default;
512 template<
typename... _Args,
513 enable_if_t<is_constructible_v<_Tp, _Args...>,
bool> =
false>
515 _Optional_base(in_place_t, _Args&&... __args)
516 : _M_payload(in_place, std::
forward<_Args>(__args)...)
519 template<
typename _Up,
typename... _Args,
521 initializer_list<_Up>&,
522 _Args...>,
bool> =
false>
524 _Optional_base(in_place_t,
525 initializer_list<_Up> __il,
527 : _M_payload(in_place, __il, std::
forward<_Args>(__args)...)
532 _Optional_base(
const _Optional_base& __other)
533 noexcept(is_nothrow_copy_constructible_v<_Tp>)
534 : _M_payload(__other._M_payload._M_engaged, __other._M_payload)
538 _Optional_base(_Optional_base&& __other)
539 noexcept(is_nothrow_move_constructible_v<_Tp>)
540 : _M_payload(__other._M_payload._M_engaged,
541 std::move(__other._M_payload))
544#if __cpp_concepts >= 202002L
547 constexpr _Optional_base(
const _Optional_base&)
548 requires is_trivially_copy_constructible_v<_Tp> =
default;
550 constexpr _Optional_base(_Optional_base&&)
551 requires is_trivially_move_constructible_v<_Tp> = default;
555 _Optional_base& operator=(
const _Optional_base&) =
default;
556 _Optional_base& operator=(_Optional_base&&) =
default;
558 _Optional_payload<_Tp> _M_payload;
562 using _Stored_type = remove_const_t<_Tp>;
566 template<
typename... _Args>
568 _M_construct(_Args&&... __args)
569 noexcept(is_nothrow_constructible_v<_Stored_type, _Args...>)
575 _M_destruct() noexcept
576 { _M_payload._M_destroy(); }
581 { _M_payload._M_reset(); }
583 constexpr bool _M_is_engaged() const noexcept
584 {
return _M_payload._M_engaged; }
589 {
return _M_payload._M_get(); }
592 _M_get() const noexcept
593 {
return _M_payload._M_get(); }
596#if __cpp_concepts < 202002L
607 template<
typename _Tp,
typename _Dp>
608 class _Optional_base_impl
611 using _Stored_type = remove_const_t<_Tp>;
615 template<
typename... _Args>
617 _M_construct(_Args&&... __args)
618 noexcept(is_nothrow_constructible_v<_Stored_type, _Args...>)
620 static_cast<_Dp*
>(
this)->_M_payload._M_construct(
625 _M_destruct() noexcept
626 {
static_cast<_Dp*
>(
this)->_M_payload._M_destroy(); }
631 {
static_cast<_Dp*
>(
this)->_M_payload._M_reset(); }
633 constexpr bool _M_is_engaged() const noexcept
634 {
return static_cast<const _Dp*
>(
this)->_M_payload._M_engaged; }
639 {
return static_cast<_Dp*
>(
this)->_M_payload._M_get(); }
642 _M_get() const noexcept
643 {
return static_cast<const _Dp*
>(
this)->_M_payload._M_get(); }
646 template<
typename _Tp>
647 struct _Optional_base<_Tp, false, true>
648 : _Optional_base_impl<_Tp, _Optional_base<_Tp>>
651 constexpr _Optional_base() =
default;
654 template<
typename... _Args,
655 enable_if_t<is_constructible_v<_Tp, _Args...>,
bool> =
false>
657 _Optional_base(in_place_t, _Args&&... __args)
658 : _M_payload(in_place, std::
forward<_Args>(__args)...)
661 template<
typename _Up,
typename... _Args,
663 initializer_list<_Up>&,
664 _Args...>,
bool> =
false>
666 _Optional_base(in_place_t,
667 initializer_list<_Up> __il,
669 : _M_payload(in_place, __il, std::
forward<_Args>(__args)...)
673 constexpr _Optional_base(
const _Optional_base& __other)
674 : _M_payload(__other._M_payload._M_engaged, __other._M_payload)
677 constexpr _Optional_base(_Optional_base&& __other) =
default;
680 _Optional_base& operator=(
const _Optional_base&) =
default;
681 _Optional_base& operator=(_Optional_base&&) =
default;
683 _Optional_payload<_Tp> _M_payload;
686 template<
typename _Tp>
687 struct _Optional_base<_Tp, true, false>
688 : _Optional_base_impl<_Tp, _Optional_base<_Tp>>
691 constexpr _Optional_base() =
default;
694 template<
typename... _Args,
695 enable_if_t<is_constructible_v<_Tp, _Args...>,
bool> =
false>
697 _Optional_base(in_place_t, _Args&&... __args)
698 : _M_payload(in_place, std::
forward<_Args>(__args)...)
701 template<
typename _Up,
typename... _Args,
704 _Args...>,
bool> =
false>
706 _Optional_base(in_place_t,
709 : _M_payload(in_place, __il, std::
forward<_Args>(__args)...)
713 constexpr _Optional_base(
const _Optional_base& __other) =
default;
716 _Optional_base(_Optional_base&& __other)
717 noexcept(is_nothrow_move_constructible_v<_Tp>)
718 : _M_payload(__other._M_payload._M_engaged,
719 std::
move(__other._M_payload))
723 _Optional_base& operator=(
const _Optional_base&) =
default;
724 _Optional_base& operator=(_Optional_base&&) =
default;
726 _Optional_payload<_Tp> _M_payload;
729 template<
typename _Tp>
730 struct _Optional_base<_Tp, true, true>
731 : _Optional_base_impl<_Tp, _Optional_base<_Tp>>
734 constexpr _Optional_base() =
default;
737 template<
typename... _Args,
738 enable_if_t<is_constructible_v<_Tp, _Args...>,
bool> =
false>
740 _Optional_base(in_place_t, _Args&&... __args)
741 : _M_payload(in_place, std::
forward<_Args>(__args)...)
744 template<
typename _Up,
typename... _Args,
747 _Args...>,
bool> =
false>
749 _Optional_base(in_place_t,
752 : _M_payload(in_place, __il, std::
forward<_Args>(__args)...)
756 constexpr _Optional_base(
const _Optional_base& __other) =
default;
757 constexpr _Optional_base(_Optional_base&& __other) =
default;
760 _Optional_base& operator=(
const _Optional_base&) =
default;
761 _Optional_base& operator=(_Optional_base&&) =
default;
763 _Optional_payload<_Tp> _M_payload;
767 template<
typename _Tp>
768 inline constexpr bool __is_optional_v =
false;
769 template<
typename _Tp>
770 inline constexpr bool __is_optional_v<optional<_Tp>> =
true;
772 template<
typename _Tp,
typename _Wp>
773 using __converts_from_any_cvref = __or_<
780 template<
typename _Tp,
typename _Up>
781 using __converts_from_optional
782 = __converts_from_any_cvref<_Tp, optional<_Up>>;
784 template<
typename _Tp,
typename _Up>
785 using __assigns_from_optional =
786 __or_<is_assignable<_Tp&, const optional<_Up>&>,
791#if __cpp_concepts && __cpp_conditional_explicit && __glibcxx_remove_cvref
792# define _GLIBCXX_USE_CONSTRAINTS_FOR_OPTIONAL 1
795 template<
typename _Tp>
796 inline constexpr bool __is_valid_contained_type_for_optional =
798#if __cpp_lib_optional >= 202506L
799 is_lvalue_reference_v<_Tp> ||
801 (is_object_v<_Tp> && is_destructible_v<_Tp> && !is_array_v<_Tp>)
809 template<
typename _Tp>
811 :
private _Optional_base<_Tp>,
812 private _Enable_copy_move<
814 is_copy_constructible_v<_Tp>,
816 __and_v<is_copy_constructible<_Tp>, is_copy_assignable<_Tp>>,
818 is_move_constructible_v<_Tp>,
820 __and_v<is_move_constructible<_Tp>, is_move_assignable<_Tp>>,
824 static_assert(__is_valid_contained_type_for_optional<_Tp>);
827 using _Base = _Optional_base<_Tp>;
835#ifdef _GLIBCXX_USE_CONSTRAINTS_FOR_OPTIONAL
836 template<
typename _From,
typename = remove_cv_t<_Tp>>
837 static constexpr bool __not_constructing_bool_from_optional
842 template<
typename _From>
843 static constexpr bool
844 __not_constructing_bool_from_optional<_From, bool>
845 = !__is_optional_v<remove_cvref_t<_From>>;
851 template<
typename _From,
typename = remove_cv_t<_Tp>>
852 static constexpr bool __construct_from_contained_value
853 = !__converts_from_optional<_Tp, _From>::value;
857 template<
typename _From>
858 static constexpr bool __construct_from_contained_value<_From, bool>
861 template<
typename _From,
typename = remove_cv_t<_Tp>>
862 struct __not_constructing_bool_from_optional
866 template<
typename _From>
867 struct __not_constructing_bool_from_optional<_From, bool>
868 : bool_constant<!__is_optional_v<__remove_cvref_t<_From>>>
871 template<
typename _From,
typename = remove_cv_t<_Tp>>
872 struct __construct_from_contained_value
873 : __not_<__converts_from_optional<_Tp, _From>>
876 template<
typename _From>
877 struct __construct_from_contained_value<_From, bool>
881 template<
typename _Up>
882 using __not_self = __not_<is_same<optional, __remove_cvref_t<_Up>>>;
883 template<
typename _Up>
884 using __not_tag = __not_<is_same<in_place_t, __remove_cvref_t<_Up>>>;
885 template<
typename... _Cond>
886 using _Requires =
enable_if_t<__and_v<_Cond...>,
bool>;
890 using value_type = _Tp;
891#ifdef __cpp_lib_optional_range_support
892 using iterator = __gnu_cxx::__normal_iterator<_Tp*, optional>;
893 using const_iterator = __gnu_cxx::__normal_iterator<const _Tp*, optional>;
896 constexpr optional() noexcept { }
898 constexpr optional(nullopt_t)
noexcept { }
901#ifdef _GLIBCXX_USE_CONSTRAINTS_FOR_OPTIONAL
902 template<
typename _Up = remove_cv_t<_Tp>>
903 requires (!is_same_v<optional, remove_cvref_t<_Up>>)
904 && (!is_same_v<in_place_t, remove_cvref_t<_Up>>)
905 && is_constructible_v<_Tp, _Up>
906 && __not_constructing_bool_from_optional<_Up>
907 constexpr explicit(!is_convertible_v<_Up, _Tp>)
909 noexcept(is_nothrow_constructible_v<_Tp, _Up>)
910 : _Base(std::in_place, std::
forward<_Up>(__t)) { }
912 template<
typename _Up>
913 requires (!is_same_v<_Tp, _Up>)
914 && is_constructible_v<_Tp, const _Up&>
915 && __construct_from_contained_value<_Up>
916 constexpr explicit(!is_convertible_v<const _Up&, _Tp>)
917 optional(
const optional<_Up>& __t)
918 noexcept(is_nothrow_constructible_v<_Tp, const _Up&>)
921 emplace(__t._M_fwd());
924 template<
typename _Up>
925 requires (!is_same_v<_Tp, _Up>)
926 && is_constructible_v<_Tp, _Up>
927 && __construct_from_contained_value<_Up>
928 constexpr explicit(!is_convertible_v<_Up, _Tp>)
929 optional(optional<_Up>&& __t)
930 noexcept(is_nothrow_constructible_v<_Tp, _Up>)
936 template<
typename... _Args>
937 requires is_constructible_v<_Tp, _Args...>
939 optional(in_place_t, _Args&&... __args)
940 noexcept(is_nothrow_constructible_v<_Tp, _Args...>)
941 : _Base(std::in_place, std::
forward<_Args>(__args)...)
944 template<
typename _Up,
typename... _Args>
945 requires is_constructible_v<_Tp, initializer_list<_Up>&, _Args...>
947 optional(in_place_t, initializer_list<_Up> __il, _Args&&... __args)
948 noexcept(is_nothrow_constructible_v<_Tp, initializer_list<_Up>&,
950 : _Base(std::in_place, __il, std::
forward<_Args>(__args)...)
953 template<
typename _Up = remove_cv_t<_Tp>,
954 _Requires<__not_self<_Up>, __not_tag<_Up>,
955 is_constructible<_Tp, _Up>,
956 is_convertible<_Up, _Tp>,
957 __not_constructing_
bool_from_optional<_Up>> = true>
960 noexcept(is_nothrow_constructible_v<_Tp, _Up>)
961 : _Base(std::in_place, std::
forward<_Up>(__t)) { }
963 template<
typename _Up = remove_cv_t<_Tp>,
964 _Requires<__not_self<_Up>, __not_tag<_Up>,
965 is_constructible<_Tp, _Up>,
966 __not_<is_convertible<_Up, _Tp>>,
967 __not_constructing_
bool_from_optional<_Up>> = false>
970 noexcept(is_nothrow_constructible_v<_Tp, _Up>)
971 : _Base(std::in_place, std::
forward<_Up>(__t)) { }
973 template<
typename _Up,
974 _Requires<__not_<is_same<_Tp, _Up>>,
975 is_constructible<_Tp, const _Up&>,
976 is_convertible<const _Up&, _Tp>,
977 __construct_from_contained_value<_Up>> =
true>
979 optional(
const optional<_Up>& __t)
980 noexcept(is_nothrow_constructible_v<_Tp, const _Up&>)
983 emplace(__t._M_fwd());
986 template<
typename _Up,
987 _Requires<__not_<is_same<_Tp, _Up>>,
988 is_constructible<_Tp, const _Up&>,
989 __not_<is_convertible<const _Up&, _Tp>>,
990 __construct_from_contained_value<_Up>> =
false>
992 optional(
const optional<_Up>& __t)
993 noexcept(is_nothrow_constructible_v<_Tp, const _Up&>)
996 emplace(__t._M_fwd());
999 template<
typename _Up,
1000 _Requires<__not_<is_same<_Tp, _Up>>,
1001 is_constructible<_Tp, _Up>,
1002 is_convertible<_Up, _Tp>,
1003 __construct_from_contained_value<_Up>> =
true>
1005 optional(optional<_Up>&& __t)
1006 noexcept(is_nothrow_constructible_v<_Tp, _Up>)
1012 template<
typename _Up,
1013 _Requires<__not_<is_same<_Tp, _Up>>,
1014 is_constructible<_Tp, _Up>,
1015 __not_<is_convertible<_Up, _Tp>>,
1016 __construct_from_contained_value<_Up>> =
false>
1018 optional(optional<_Up>&& __t)
1019 noexcept(is_nothrow_constructible_v<_Tp, _Up>)
1025 template<
typename... _Args,
1026 _Requires<is_constructible<_Tp, _Args...>> =
false>
1028 optional(in_place_t, _Args&&... __args)
1029 noexcept(is_nothrow_constructible_v<_Tp, _Args...>)
1030 : _Base(std::in_place, std::
forward<_Args>(__args)...) { }
1032 template<
typename _Up,
typename... _Args,
1033 _Requires<is_constructible<_Tp,
1034 initializer_list<_Up>&,
1037 optional(in_place_t, initializer_list<_Up> __il, _Args&&... __args)
1038 noexcept(is_nothrow_constructible_v<_Tp, initializer_list<_Up>&,
1040 : _Base(std::in_place, __il, std::
forward<_Args>(__args)...) { }
1044 _GLIBCXX20_CONSTEXPR optional&
1045 operator=(nullopt_t)
noexcept
1051 template<
typename _Up = remove_cv_t<_Tp>>
1052#ifdef _GLIBCXX_USE_CONSTRAINTS_FOR_OPTIONAL
1053 requires (!is_same_v<optional, remove_cvref_t<_Up>>)
1054 && (!(is_scalar_v<_Tp> && is_same_v<_Tp,
decay_t<_Up>>))
1055 && is_constructible_v<_Tp, _Up>
1056 && is_assignable_v<_Tp&, _Up>
1060 __not_<__and_<is_scalar<_Tp>,
1061 is_same<_Tp, decay_t<_Up>>>>,
1062 is_constructible<_Tp, _Up>,
1063 is_assignable<_Tp&, _Up>>,
1066 operator=(_Up&& __u)
1067 noexcept(__and_v<is_nothrow_constructible<_Tp, _Up>,
1068 is_nothrow_assignable<_Tp&, _Up>>)
1070 if (this->_M_is_engaged())
1078 template<
typename _Up>
1079#ifdef _GLIBCXX_USE_CONSTRAINTS_FOR_OPTIONAL
1080 requires (!is_same_v<_Tp, _Up>)
1081 && is_constructible_v<_Tp, const _Up&>
1082 && is_assignable_v<_Tp&, const _Up&>
1083 && (!__converts_from_optional<_Tp, _Up>::value)
1084 && (!__assigns_from_optional<_Tp, _Up>::value)
1088 is_constructible<_Tp, const _Up&>,
1089 is_assignable<_Tp&, const _Up&>,
1090 __not_<__converts_from_optional<_Tp, _Up>>,
1091 __not_<__assigns_from_optional<_Tp, _Up>>>,
1094 operator=(
const optional<_Up>& __u)
1095 noexcept(__and_v<is_nothrow_constructible<_Tp, const _Up&>,
1096 is_nothrow_assignable<_Tp&, const _Up&>>)
1100 if (this->_M_is_engaged())
1101 this->_M_get() = __u._M_fwd();
1103 this->_M_construct(__u._M_fwd());
1112 template<
typename _Up>
1113#ifdef _GLIBCXX_USE_CONSTRAINTS_FOR_OPTIONAL
1114 requires (!is_same_v<_Tp, _Up>)
1115 && is_constructible_v<_Tp, _Up>
1116 && is_assignable_v<_Tp&, _Up>
1117 && (!__converts_from_optional<_Tp, _Up>::value)
1118 && (!__assigns_from_optional<_Tp, _Up>::value)
1122 is_constructible<_Tp, _Up>,
1123 is_assignable<_Tp&, _Up>,
1124 __not_<__converts_from_optional<_Tp, _Up>>,
1125 __not_<__assigns_from_optional<_Tp, _Up>>>,
1128 operator=(optional<_Up>&& __u)
1129 noexcept(__and_v<is_nothrow_constructible<_Tp, _Up>,
1130 is_nothrow_assignable<_Tp&, _Up>>)
1134 if (this->_M_is_engaged())
1135 this->_M_get() =
std::move(__u)._M_fwd();
1137 this->_M_construct(
std::move(__u)._M_fwd());
1147 template<
typename... _Args>
1148 _GLIBCXX20_CONSTEXPR
1149 enable_if_t<is_constructible_v<_Tp, _Args...>, _Tp&>
1150 emplace(_Args&&... __args)
1151 noexcept(is_nothrow_constructible_v<_Tp, _Args...>)
1155 return this->_M_get();
1158 template<
typename _Up,
typename... _Args>
1159 _GLIBCXX20_CONSTEXPR
1162 emplace(initializer_list<_Up> __il, _Args&&... __args)
1163 noexcept(is_nothrow_constructible_v<_Tp, initializer_list<_Up>&,
1168 return this->_M_get();
1174 _GLIBCXX20_CONSTEXPR
void
1175 swap(optional& __other)
1176 noexcept(is_nothrow_move_constructible_v<_Tp>
1177 && is_nothrow_swappable_v<_Tp>)
1181 if (this->_M_is_engaged() && __other._M_is_engaged())
1182 swap(this->_M_get(), __other._M_get());
1183 else if (this->_M_is_engaged())
1185 __other._M_construct(
std::move(this->_M_get()));
1186 this->_M_destruct();
1188 else if (__other._M_is_engaged())
1190 this->_M_construct(
std::move(__other._M_get()));
1191 __other._M_destruct();
1195#ifdef __cpp_lib_optional_range_support
1197 constexpr iterator
begin() noexcept
1204 constexpr const_iterator
begin() const noexcept
1206 return const_iterator(
1211 constexpr iterator
end() noexcept
1213 return begin() + has_value();
1216 constexpr const_iterator
end() const noexcept
1218 return begin() + has_value();
1223 constexpr const _Tp*
1224 operator->() const noexcept
1226 __glibcxx_assert(this->_M_is_engaged());
1231 operator->() noexcept
1233 __glibcxx_assert(this->_M_is_engaged());
1237 constexpr const _Tp&
1240 __glibcxx_assert(this->_M_is_engaged());
1241 return this->_M_get();
1247 __glibcxx_assert(this->_M_is_engaged());
1248 return this->_M_get();
1254 __glibcxx_assert(this->_M_is_engaged());
1258 constexpr const _Tp&&
1261 __glibcxx_assert(this->_M_is_engaged());
1265 constexpr explicit operator bool() const noexcept
1266 {
return this->_M_is_engaged(); }
1268 constexpr bool has_value() const noexcept
1269 {
return this->_M_is_engaged(); }
1271 constexpr const _Tp&
1274 if (this->_M_is_engaged())
1275 return this->_M_get();
1276 __throw_bad_optional_access();
1282 if (this->_M_is_engaged())
1283 return this->_M_get();
1284 __throw_bad_optional_access();
1290 if (this->_M_is_engaged())
1292 __throw_bad_optional_access();
1295 constexpr const _Tp&&
1298 if (this->_M_is_engaged())
1300 __throw_bad_optional_access();
1305 template<
typename _Up = remove_cv_t<_Tp>>
1306 constexpr remove_cv_t<_Tp>
1307 value_or(_Up&& __u)
const&
1309 using _Xp = remove_cv_t<_Tp>;
1310 static_assert(is_convertible_v<const _Tp&, _Xp>);
1311 static_assert(is_convertible_v<_Up, _Xp>);
1313 if (this->_M_is_engaged())
1314 return this->_M_get();
1318 template<
typename _Up = remove_cv_t<_Tp>>
1319 constexpr remove_cv_t<_Tp>
1320 value_or(_Up&& __u) &&
1322 using _Xp = remove_cv_t<_Tp>;
1323 static_assert(is_convertible_v<_Tp, _Xp>);
1324 static_assert(is_convertible_v<_Up, _Xp>);
1326 if (this->_M_is_engaged())
1331#if __cpp_lib_optional >= 202110L
1334 template<
typename _Fn>
1336 and_then(_Fn&& __f) &
1338 using _Up = remove_cvref_t<invoke_result_t<_Fn, _Tp&>>;
1339 static_assert(__is_optional_v<_Up>,
1340 "the function passed to std::optional<T>::and_then "
1341 "must return a std::optional");
1348 template<
typename _Fn>
1350 and_then(_Fn&& __f)
const &
1352 using _Up = remove_cvref_t<invoke_result_t<_Fn, const _Tp&>>;
1353 static_assert(__is_optional_v<_Up>,
1354 "the function passed to std::optional<T>::and_then "
1355 "must return a std::optional");
1362 template<
typename _Fn>
1364 and_then(_Fn&& __f) &&
1366 using _Up = remove_cvref_t<invoke_result_t<_Fn, _Tp>>;
1367 static_assert(__is_optional_v<_Up>,
1368 "the function passed to std::optional<T>::and_then "
1369 "must return a std::optional");
1376 template<
typename _Fn>
1378 and_then(_Fn&& __f)
const &&
1380 using _Up = remove_cvref_t<invoke_result_t<_Fn, const _Tp>>;
1381 static_assert(__is_optional_v<_Up>,
1382 "the function passed to std::optional<T>::and_then "
1383 "must return a std::optional");
1390 template<
typename _Fn>
1392 transform(_Fn&& __f) &
1394 using _Up = remove_cv_t<invoke_result_t<_Fn, _Tp&>>;
1396 return optional<_Up>(_Optional_func<_Fn>{__f}, _M_get());
1398 return optional<_Up>();
1401 template<
typename _Fn>
1403 transform(_Fn&& __f)
const &
1405 using _Up = remove_cv_t<invoke_result_t<_Fn, const _Tp&>>;
1407 return optional<_Up>(_Optional_func<_Fn>{__f}, _M_get());
1409 return optional<_Up>();
1412 template<
typename _Fn>
1414 transform(_Fn&& __f) &&
1416 using _Up = remove_cv_t<invoke_result_t<_Fn, _Tp>>;
1418 return optional<_Up>(_Optional_func<_Fn>{__f},
std::move(_M_get()));
1420 return optional<_Up>();
1423 template<
typename _Fn>
1425 transform(_Fn&& __f)
const &&
1427 using _Up = remove_cv_t<invoke_result_t<_Fn, const _Tp>>;
1429 return optional<_Up>(_Optional_func<_Fn>{__f},
std::move(_M_get()));
1431 return optional<_Up>();
1434 template<
typename _Fn>
requires invocable<_Fn> && copy_constructible<_Tp>
1436 or_else(_Fn&& __f)
const&
1438 using _Up = invoke_result_t<_Fn>;
1439 static_assert(is_same_v<remove_cvref_t<_Up>, optional>,
1440 "the function passed to std::optional<T>::or_else "
1441 "must return a std::optional<T>");
1449 template<
typename _Fn>
requires invocable<_Fn> && move_constructible<_Tp>
1451 or_else(_Fn&& __f) &&
1453 using _Up = invoke_result_t<_Fn>;
1454 static_assert(is_same_v<remove_cvref_t<_Up>, optional>,
1455 "the function passed to std::optional<T>::or_else "
1456 "must return a std::optional<T>");
1465 _GLIBCXX20_CONSTEXPR
void reset() noexcept { this->_M_reset(); }
1468 using _Base::_M_get;
1470 [[__gnu__::__always_inline__]]
1473 {
return _M_get(); }
1475 [[__gnu__::__always_inline__]]
1477 _M_fwd() &&
noexcept
1480 [[__gnu__::__always_inline__]]
1481 constexpr const _Tp&
1482 _M_fwd() const& noexcept
1483 {
return _M_get(); }
1485 [[__gnu__::__always_inline__]]
1486 constexpr const _Tp&&
1487 _M_fwd() const&& noexcept
1490 template<
typename _Up>
friend class optional;
1492#if __cpp_lib_optional >= 202110L
1493 template<
typename _Fn,
typename _Value>
1495 optional(_Optional_func<_Fn> __f, _Value&& __v)
1502#if __cpp_lib_optional >= 202506L
1503 template<
typename _Tp>
1504 class optional<_Tp&>;
1506 template<
typename _Tp>
1507 constexpr bool __is_optional_ref_v =
false;
1509 template<
typename _Tp>
1510 constexpr bool __is_optional_ref_v<optional<_Tp&>> =
true;
1512 template<
typename _Tp>
1513 struct __optional_ref_base
1516#ifdef __cpp_lib_optional_range_support
1517 template<
typename _Tp>
1518 struct __optional_ref_base<_Tp[]>
1521 template<
typename _Tp>
1522 requires is_object_v<_Tp>
1523 struct __optional_ref_base<_Tp>
1525 using iterator = __gnu_cxx::__normal_iterator<_Tp*, optional<_Tp&>>;
1529 template<
typename _Tp>
1530 class optional<_Tp&> :
public __optional_ref_base<_Tp>
1532 static_assert(__is_valid_contained_type_for_optional<_Tp&>);
1538 constexpr optional() noexcept = default;
1539 constexpr optional(nullopt_t) noexcept : optional() {}
1540 constexpr optional(
const optional&)
noexcept =
default;
1542 template<
typename _Arg>
1543 requires is_constructible_v<_Tp&, _Arg>
1544 && (!reference_constructs_from_temporary_v<_Tp&, _Arg>)
1546 optional(in_place_t, _Arg&& __arg)
1551 template<
typename _Up>
1552 requires (!is_same_v<remove_cvref_t<_Up>, optional>)
1553 && (!is_same_v<remove_cvref_t<_Up>, in_place_t>)
1554 && is_constructible_v<_Tp&, _Up>
1555 && (!reference_constructs_from_temporary_v<_Tp&, _Up>)
1556 explicit(!is_convertible_v<_Up, _Tp&>)
1559 noexcept(is_nothrow_constructible_v<_Tp&, _Up>)
1564 template<
typename _Up>
1565 requires (!is_same_v<remove_cvref_t<_Up>, optional>)
1566 && (!is_same_v<remove_cvref_t<_Up>, in_place_t>)
1567 && is_constructible_v<_Tp&, _Up>
1568 && reference_constructs_from_temporary_v<_Tp&, _Up>
1569 explicit(!is_convertible_v<_Up, _Tp&>)
1571 optional(_Up&& __u) =
delete;
1574 template<
typename _Up>
1575 requires (!is_same_v<remove_cv_t<_Tp>, optional<_Up>>)
1576 && (!is_same_v<_Tp&, _Up>)
1577 && is_constructible_v<_Tp&, _Up&>
1578 && (!reference_constructs_from_temporary_v<_Tp&, _Up&>)
1579 explicit(!is_convertible_v<_Up&, _Tp&>)
1581 optional(optional<_Up>& __rhs)
1582 noexcept(is_nothrow_constructible_v<_Tp&, _Up&>)
1585 __convert_ref_init_val(__rhs._M_fwd());
1588 template<
typename _Up>
1589 requires (!is_same_v<remove_cv_t<_Tp>, optional<_Up>>)
1590 && (!is_same_v<_Tp&, _Up>)
1591 && is_constructible_v<_Tp&, _Up&>
1592 && reference_constructs_from_temporary_v<_Tp&, _Up&>
1593 explicit(!is_convertible_v<_Up&, _Tp&>)
1595 optional(optional<_Up>& __rhs) =
delete;
1598 template<
typename _Up>
1599 requires (!is_same_v<remove_cv_t<_Tp>, optional<_Up>>)
1600 && (!is_same_v<_Tp&, _Up>)
1601 && is_constructible_v<_Tp&, const _Up&>
1602 && (!reference_constructs_from_temporary_v<_Tp&, const _Up&>)
1603 explicit(!is_convertible_v<const _Up&, _Tp&>)
1605 optional(
const optional<_Up>& __rhs)
1606 noexcept(is_nothrow_constructible_v<_Tp&, _Up&>)
1609 __convert_ref_init_val(__rhs._M_fwd());
1612 template<
typename _Up>
1613 requires (!is_same_v<remove_cv_t<_Tp>, optional<_Up>>)
1614 && (!is_same_v<_Tp&, _Up>)
1615 && is_constructible_v<_Tp&, const _Up&>
1616 && reference_constructs_from_temporary_v<_Tp&, const _Up&>
1617 explicit(!is_convertible_v<const _Up&, _Tp&>)
1619 optional(
const optional<_Up>& __rhs) =
delete;
1622 template<
typename _Up>
1623 requires (!is_same_v<remove_cv_t<_Tp>, optional<_Up>>)
1624 && (!is_same_v<_Tp&, _Up>)
1625 && is_constructible_v<_Tp&, _Up>
1626 && (!reference_constructs_from_temporary_v<_Tp&, _Up>)
1627 explicit(!is_convertible_v<_Up, _Tp&>)
1629 optional(optional<_Up>&& __rhs)
1630 noexcept(is_nothrow_constructible_v<_Tp&, _Up>)
1633 __convert_ref_init_val(
std::move(__rhs)._M_fwd());
1636 template<
typename _Up>
1637 requires (!is_same_v<remove_cv_t<_Tp>, optional<_Up>>)
1638 && (!is_same_v<_Tp&, _Up>)
1639 && is_constructible_v<_Tp&, _Up>
1640 && reference_constructs_from_temporary_v<_Tp&, _Up>
1641 explicit(!is_convertible_v<_Up, _Tp&>)
1643 optional(optional<_Up>&& __rhs) =
delete;
1646 template<
typename _Up>
1647 requires (!is_same_v<remove_cv_t<_Tp>, optional<_Up>>)
1648 && (!is_same_v<_Tp&, _Up>)
1649 && is_constructible_v<_Tp&, const _Up>
1650 && (!reference_constructs_from_temporary_v<_Tp&, _Up>)
1651 explicit(!is_convertible_v<const _Up, _Tp&>)
1653 optional(
const optional<_Up>&& __rhs)
1654 noexcept(is_nothrow_constructible_v<_Tp&, const _Up>)
1657 __convert_ref_init_val(
std::move(__rhs)._M_fwd());
1660 template<
typename _Up>
1661 requires (!is_same_v<remove_cv_t<_Tp>, optional<_Up>>)
1662 && (!is_same_v<_Tp&, _Up>)
1663 && is_constructible_v<_Tp&, const _Up>
1664 && reference_constructs_from_temporary_v<_Tp&, const _Up>
1665 explicit(!is_convertible_v<const _Up, _Tp&>)
1667 optional(
const optional<_Up>&& __rhs) =
delete;
1669 constexpr ~optional() =
default;
1672 constexpr optional& operator=(nullopt_t)
noexcept
1678 constexpr optional& operator=(
const optional&)
noexcept =
default;
1680 template<
typename _Up>
1681 requires is_constructible_v<_Tp&, _Up>
1682 && (!reference_constructs_from_temporary_v<_Tp&, _Up>)
1685 noexcept(is_nothrow_constructible_v<_Tp&, _Up>)
1694 constexpr void swap(optional& __rhs)
noexcept
1695 { std::swap(_M_val, __rhs._M_val); }
1697#ifdef __cpp_lib_optional_range_support
1699 constexpr auto begin() const noexcept
1700 requires is_object_v<_Tp> && (!is_unbounded_array_v<_Tp>)
1701 {
return __gnu_cxx::__normal_iterator<_Tp*, optional>(_M_val); }
1703 constexpr auto end() const noexcept
1704 requires is_object_v<_Tp> && (!is_unbounded_array_v<_Tp>)
1705 {
return begin() + has_value(); }
1709 constexpr _Tp* operator->() const noexcept
1711 __glibcxx_assert(_M_val);
1715 constexpr _Tp&
operator*() const noexcept
1717 __glibcxx_assert(_M_val);
1721 constexpr explicit operator bool() const noexcept
1726 constexpr bool has_value() const noexcept
1731 constexpr _Tp& value()
const
1735 __throw_bad_optional_access();
1740 template<
typename _Up = remove_cv_t<_Tp>>
1741 requires is_object_v<_Tp> && (!is_array_v<_Tp>)
1743 value_or(_Up&& __u)
const
1745 using _Xp = remove_cv_t<_Tp>;
1746 static_assert(is_convertible_v<_Tp&, _Xp>);
1747 static_assert(is_convertible_v<_Up, _Xp>);
1754 template<
typename _Fn>
1756 and_then(_Fn&& __f)
const
1758 using _Up = remove_cvref_t<invoke_result_t<_Fn, _Tp&>>;
1759 static_assert(__is_optional_v<_Up>,
1760 "the function passed to std::optional<T&>::and_then "
1761 "must return a std::optional");
1768 template<
typename _Fn>
1770 optional<remove_cv_t<invoke_result_t<_Fn, _Tp&>>>
1771 transform(_Fn&& __f)
const
1773 using _Up = remove_cv_t<invoke_result_t<_Fn, _Tp&>>;
1775 return optional<_Up>(_Optional_func<_Fn>{__f}, *_M_val);
1777 return optional<_Up>();
1780 template<
typename _Fn>
1784 or_else(_Fn&& __f)
const
1786 static_assert(is_same_v<remove_cvref_t<invoke_result_t<_Fn>>, optional>,
1787 "the function passed to std::optional<T&>::or_else "
1788 "must return a std::optional<T&>");
1798 constexpr void reset() noexcept
1804 _Tp *_M_val =
nullptr;
1806 [[__gnu__::__always_inline__]]
1808 _M_fwd() const noexcept
1811 template<
typename _Up>
friend class optional;
1813 template<
typename _Up>
1816 __convert_ref_init_val(_Up&& __u)
1823 template<
typename _Fn,
typename _Value>
1825 optional(_Optional_func<_Fn> __f, _Value&& __v)
1833 template<
typename _Tp>
1834 using __optional_relop_t =
1837 template<
typename _Tp,
typename _Up>
1838 using __optional_eq_t = __optional_relop_t<
1842 template<
typename _Tp,
typename _Up>
1843 using __optional_ne_t = __optional_relop_t<
1847 template<
typename _Tp,
typename _Up>
1848 using __optional_lt_t = __optional_relop_t<
1852 template<
typename _Tp,
typename _Up>
1853 using __optional_gt_t = __optional_relop_t<
1857 template<
typename _Tp,
typename _Up>
1858 using __optional_le_t = __optional_relop_t<
1862 template<
typename _Tp,
typename _Up>
1863 using __optional_ge_t = __optional_relop_t<
1868 template<
typename _Tp,
typename _Up>
1870 operator==(
const optional<_Tp>& __lhs,
const optional<_Up>& __rhs)
1871 -> __optional_eq_t<_Tp, _Up>
1873 if (__lhs.has_value() != __rhs.has_value())
1875 if (!__lhs.has_value())
1877 return *__lhs == *__rhs;
1880 template<
typename _Tp,
typename _Up>
1882 operator!=(
const optional<_Tp>& __lhs,
const optional<_Up>& __rhs)
1883 -> __optional_ne_t<_Tp, _Up>
1885 if (__lhs.has_value() != __rhs.has_value())
1887 if (!__lhs.has_value())
1889 return *__lhs != *__rhs;
1892 template<
typename _Tp,
typename _Up>
1894 operator<(
const optional<_Tp>& __lhs,
const optional<_Up>& __rhs)
1895 -> __optional_lt_t<_Tp, _Up>
1897 if (!__rhs.has_value())
1899 if (!__lhs.has_value())
1901 return *__lhs < *__rhs;
1904 template<
typename _Tp,
typename _Up>
1906 operator>(
const optional<_Tp>& __lhs,
const optional<_Up>& __rhs)
1907 -> __optional_gt_t<_Tp, _Up>
1909 if (!__lhs.has_value())
1911 if (!__rhs.has_value())
1913 return *__lhs > *__rhs;
1916 template<
typename _Tp,
typename _Up>
1918 operator<=(
const optional<_Tp>& __lhs,
const optional<_Up>& __rhs)
1919 -> __optional_le_t<_Tp, _Up>
1921 if (!__lhs.has_value())
1923 if (!__rhs.has_value())
1925 return *__lhs <= *__rhs;
1928 template<
typename _Tp,
typename _Up>
1930 operator>=(
const optional<_Tp>& __lhs,
const optional<_Up>& __rhs)
1931 -> __optional_ge_t<_Tp, _Up>
1933 if (!__rhs.has_value())
1935 if (!__lhs.has_value())
1937 return *__lhs >= *__rhs;
1940#ifdef __cpp_lib_three_way_comparison
1941 template<
typename _Tp, three_way_comparable_with<_Tp> _Up>
1944 operator<=>(
const optional<_Tp>& __x,
const optional<_Up>& __y)
1946 return __x && __y ? *__x <=> *__y : bool(__x) <=> bool(__y);
1951 template<
typename _Tp>
1954 operator==(
const optional<_Tp>& __lhs, nullopt_t)
noexcept
1957#ifdef __cpp_lib_three_way_comparison
1958 template<
typename _Tp>
1960 constexpr strong_ordering
1961 operator<=>(
const optional<_Tp>& __x, nullopt_t)
noexcept
1962 {
return bool(__x) <=>
false; }
1964 template<
typename _Tp>
1966 operator==(nullopt_t,
const optional<_Tp>& __rhs)
noexcept
1969 template<
typename _Tp>
1971 operator!=(
const optional<_Tp>& __lhs, nullopt_t)
noexcept
1972 {
return static_cast<bool>(__lhs); }
1974 template<
typename _Tp>
1976 operator!=(nullopt_t,
const optional<_Tp>& __rhs)
noexcept
1977 {
return static_cast<bool>(__rhs); }
1979 template<
typename _Tp>
1981 operator<(
const optional<_Tp>& , nullopt_t)
noexcept
1984 template<
typename _Tp>
1986 operator<(nullopt_t,
const optional<_Tp>& __rhs)
noexcept
1987 {
return static_cast<bool>(__rhs); }
1989 template<
typename _Tp>
1991 operator>(
const optional<_Tp>& __lhs, nullopt_t)
noexcept
1992 {
return static_cast<bool>(__lhs); }
1994 template<
typename _Tp>
1996 operator>(nullopt_t,
const optional<_Tp>& )
noexcept
1999 template<
typename _Tp>
2001 operator<=(
const optional<_Tp>& __lhs, nullopt_t)
noexcept
2004 template<
typename _Tp>
2006 operator<=(nullopt_t,
const optional<_Tp>& )
noexcept
2009 template<
typename _Tp>
2011 operator>=(
const optional<_Tp>& , nullopt_t)
noexcept
2014 template<
typename _Tp>
2016 operator>=(nullopt_t,
const optional<_Tp>& __rhs)
noexcept
2020#if __cpp_lib_concepts
2023# define _REQUIRES_NOT_OPTIONAL(T) requires (!__is_optional_v<T>)
2025# define _REQUIRES_NOT_OPTIONAL(T)
2029 template<
typename _Tp,
typename _Up>
2030 _REQUIRES_NOT_OPTIONAL(_Up)
2032 operator== [[nodiscard]] (
const optional<_Tp>& __lhs,
const _Up& __rhs)
2033 -> __optional_eq_t<_Tp, _Up>
2035 if (__lhs.has_value())
2036 return *__lhs == __rhs;
2040 template<
typename _Tp,
typename _Up>
2041 _REQUIRES_NOT_OPTIONAL(_Tp)
2043 operator== [[nodiscard]] (
const _Tp& __lhs,
const optional<_Up>& __rhs)
2044 -> __optional_eq_t<_Tp, _Up>
2046 if (__rhs.has_value())
2047 return __lhs == *__rhs;
2051 template<
typename _Tp,
typename _Up>
2052 _REQUIRES_NOT_OPTIONAL(_Up)
2054 operator!= [[nodiscard]] (
const optional<_Tp>& __lhs,
const _Up& __rhs)
2055 -> __optional_ne_t<_Tp, _Up>
2057 if (__lhs.has_value())
2058 return *__lhs != __rhs;
2062 template<
typename _Tp,
typename _Up>
2063 _REQUIRES_NOT_OPTIONAL(_Tp)
2065 operator!= [[nodiscard]] (
const _Tp& __lhs,
const optional<_Up>& __rhs)
2066 -> __optional_ne_t<_Tp, _Up>
2068 if (__rhs.has_value())
2069 return __lhs != *__rhs;
2073 template<
typename _Tp,
typename _Up>
2074 _REQUIRES_NOT_OPTIONAL(_Up)
2076 operator< [[nodiscard]] (
const optional<_Tp>& __lhs,
const _Up& __rhs)
2077 -> __optional_lt_t<_Tp, _Up>
2079 if (__lhs.has_value())
2080 return *__lhs < __rhs;
2084 template<
typename _Tp,
typename _Up>
2085 _REQUIRES_NOT_OPTIONAL(_Tp)
2087 operator< [[nodiscard]] (
const _Tp& __lhs,
const optional<_Up>& __rhs)
2088 -> __optional_lt_t<_Tp, _Up>
2090 if (__rhs.has_value())
2091 return __lhs < *__rhs;
2095 template<
typename _Tp,
typename _Up>
2096 _REQUIRES_NOT_OPTIONAL(_Up)
2098 operator> [[nodiscard]] (
const optional<_Tp>& __lhs,
const _Up& __rhs)
2099 -> __optional_gt_t<_Tp, _Up>
2101 if (__lhs.has_value())
2102 return *__lhs > __rhs;
2106 template<
typename _Tp,
typename _Up>
2107 _REQUIRES_NOT_OPTIONAL(_Tp)
2109 operator> [[nodiscard]] (
const _Tp& __lhs,
const optional<_Up>& __rhs)
2110 -> __optional_gt_t<_Tp, _Up>
2112 if (__rhs.has_value())
2113 return __lhs > *__rhs;
2117 template<
typename _Tp,
typename _Up>
2118 _REQUIRES_NOT_OPTIONAL(_Up)
2120 operator<= [[nodiscard]] (
const optional<_Tp>& __lhs,
const _Up& __rhs)
2121 -> __optional_le_t<_Tp, _Up>
2123 if (__lhs.has_value())
2124 return *__lhs <= __rhs;
2128 template<
typename _Tp,
typename _Up>
2129 _REQUIRES_NOT_OPTIONAL(_Tp)
2131 operator<= [[nodiscard]] (
const _Tp& __lhs,
const optional<_Up>& __rhs)
2132 -> __optional_le_t<_Tp, _Up>
2134 if (__rhs.has_value())
2135 return __lhs <= *__rhs;
2139 template<
typename _Tp,
typename _Up>
2140 _REQUIRES_NOT_OPTIONAL(_Up)
2142 operator>= [[nodiscard]] (
const optional<_Tp>& __lhs,
const _Up& __rhs)
2143 -> __optional_ge_t<_Tp, _Up>
2145 if (__lhs.has_value())
2146 return *__lhs >= __rhs;
2150 template<
typename _Tp,
typename _Up>
2151 _REQUIRES_NOT_OPTIONAL(_Tp)
2153 operator>= [[nodiscard]] (
const _Tp& __lhs,
const optional<_Up>& __rhs)
2154 -> __optional_ge_t<_Tp, _Up>
2156 if (__rhs.has_value())
2157 return __lhs >= *__rhs;
2161#ifdef __cpp_lib_three_way_comparison
2165 template<
typename _Tp>
2166 concept __is_derived_from_optional =
requires (
const _Tp& __t) {
2167 []<
typename _Up>(
const optional<_Up>&){ }(__t);
2170 template<
typename _Tp,
typename _Up>
2171 requires (!__is_derived_from_optional<_Up>)
2173 && three_way_comparable_with<_Tp, _Up>
2175 operator<=> [[nodiscard]] (
const optional<_Tp>& __x,
const _Up& __v)
2176 {
return bool(__x) ? *__x <=> __v : strong_ordering::less; }
2183 template<
typename _Tp>
2184 _GLIBCXX20_CONSTEXPR
2186 swap(optional<_Tp>& __lhs, optional<_Tp>& __rhs)
2187 noexcept(
noexcept(__lhs.swap(__rhs)))
2188 { __lhs.swap(__rhs); }
2190#if __cpp_lib_optional >= 202506L
2193 template<
typename _Tp>
2195 swap(optional<_Tp&>& __lhs, optional<_Tp&>& __rhs)
noexcept
2196 { __lhs.swap(__rhs); }
2201 template<
typename _Tp>
2202 enable_if_t<!(is_move_constructible_v<_Tp> && is_swappable_v<_Tp>)>
2203 swap(optional<_Tp>&, optional<_Tp>&) =
delete;
2205#if __cpp_lib_optional >= 202506L
2206 template<
int = 0,
typename _Tp>
2208 template<
typename _Tp>
2212 optional<decay_t<_Tp>>>
2213 make_optional(_Tp&& __t)
2214 noexcept(is_nothrow_constructible_v<optional<decay_t<_Tp>>, _Tp>)
2217 template<
typename _Tp,
typename... _Args>
2221 make_optional(_Args&&... __args)
2222 noexcept(is_nothrow_constructible_v<_Tp, _Args...>)
2225 template<
typename _Tp,
typename _Up,
typename... _Args>
2230 noexcept(is_nothrow_constructible_v<_Tp, initializer_list<_Up>&, _Args...>)
2235 template<
typename _Tp,
typename _Up = remove_const_t<_Tp>>
2236 struct __optional_hash
2237#if ! _GLIBCXX_INLINE_VERSION
2238 :
public __hash_empty_base<_Up>
2241#if __cplusplus < 202002L
2242 using result_type [[__deprecated__]] = size_t;
2243 using argument_type [[__deprecated__]] = optional<_Tp>;
2247 operator()(
const optional<_Tp>& __t)
const
2248 noexcept(
noexcept(hash<_Up>{}(*__t)))
2252 constexpr size_t __magic_disengaged_hash =
static_cast<size_t>(-3333);
2253 return __t ? hash<_Up>{}(*__t) : __magic_disengaged_hash;
2257 template<
typename _Tp>
2258 struct hash<optional<_Tp>>
2260 :
public __conditional_t<__is_hash_enabled_for<remove_const_t<_Tp>>,
2261 __optional_hash<_Tp>,
2262 __hash_not_enabled<_Tp>>
2265 template<
typename _Tp>
2271#if __cpp_deduction_guides >= 201606
2272 template <
typename _Tp> optional(_Tp) -> optional<_Tp>;
2275#ifdef __cpp_lib_optional_range_support
2276 template<
typename _Tp>
2277 inline constexpr bool
2280#if __cpp_lib_optional >= 202506L
2281 template<
typename _Tp>
2283 ranges::enable_borrowed_range<optional<_Tp&>> =
true;
2286 template<
typename _Tp>
2287 inline constexpr range_format
2288 format_kind<optional<_Tp>> = range_format::disabled;
2291#undef _GLIBCXX_USE_CONSTRAINTS_FOR_OPTIONAL
2293_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