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());
1149 template<
typename... _Args>
1150 _GLIBCXX20_CONSTEXPR
1151 enable_if_t<is_constructible_v<_Tp, _Args...>, _Tp&>
1152 emplace(_Args&&... __args)
1153 noexcept(is_nothrow_constructible_v<_Tp, _Args...>)
1157 return this->_M_get();
1160 template<
typename _Up,
typename... _Args>
1161 _GLIBCXX20_CONSTEXPR
1164 emplace(initializer_list<_Up> __il, _Args&&... __args)
1165 noexcept(is_nothrow_constructible_v<_Tp, initializer_list<_Up>&,
1170 return this->_M_get();
1176 _GLIBCXX20_CONSTEXPR
void
1177 swap(optional& __other)
1178 noexcept(is_nothrow_move_constructible_v<_Tp>
1179 && is_nothrow_swappable_v<_Tp>)
1183 if (this->_M_is_engaged() && __other._M_is_engaged())
1184 swap(this->_M_get(), __other._M_get());
1185 else if (this->_M_is_engaged())
1187 __other._M_construct(
std::move(this->_M_get()));
1188 this->_M_destruct();
1190 else if (__other._M_is_engaged())
1192 this->_M_construct(
std::move(__other._M_get()));
1193 __other._M_destruct();
1197#ifdef __cpp_lib_optional_range_support
1199 constexpr iterator
begin() noexcept
1206 constexpr const_iterator
begin() const noexcept
1208 return const_iterator(
1213 constexpr iterator
end() noexcept
1215 return begin() + has_value();
1218 constexpr const_iterator
end() const noexcept
1220 return begin() + has_value();
1225 constexpr const _Tp*
1226 operator->() const noexcept
1228 __glibcxx_assert(this->_M_is_engaged());
1233 operator->() noexcept
1235 __glibcxx_assert(this->_M_is_engaged());
1239 constexpr const _Tp&
1242 __glibcxx_assert(this->_M_is_engaged());
1243 return this->_M_get();
1249 __glibcxx_assert(this->_M_is_engaged());
1250 return this->_M_get();
1256 __glibcxx_assert(this->_M_is_engaged());
1260 constexpr const _Tp&&
1263 __glibcxx_assert(this->_M_is_engaged());
1267 constexpr explicit operator bool() const noexcept
1268 {
return this->_M_is_engaged(); }
1270 constexpr bool has_value() const noexcept
1271 {
return this->_M_is_engaged(); }
1273 constexpr const _Tp&
1276 if (this->_M_is_engaged())
1277 return this->_M_get();
1278 __throw_bad_optional_access();
1284 if (this->_M_is_engaged())
1285 return this->_M_get();
1286 __throw_bad_optional_access();
1292 if (this->_M_is_engaged())
1294 __throw_bad_optional_access();
1297 constexpr const _Tp&&
1300 if (this->_M_is_engaged())
1302 __throw_bad_optional_access();
1307 template<
typename _Up = remove_cv_t<_Tp>>
1308 constexpr remove_cv_t<_Tp>
1309 value_or(_Up&& __u)
const&
1311 using _Xp = remove_cv_t<_Tp>;
1312 static_assert(is_convertible_v<const _Tp&, _Xp>);
1313 static_assert(is_convertible_v<_Up, _Xp>);
1315 if (this->_M_is_engaged())
1316 return this->_M_get();
1320 template<
typename _Up = remove_cv_t<_Tp>>
1321 constexpr remove_cv_t<_Tp>
1322 value_or(_Up&& __u) &&
1324 using _Xp = remove_cv_t<_Tp>;
1325 static_assert(is_convertible_v<_Tp, _Xp>);
1326 static_assert(is_convertible_v<_Up, _Xp>);
1328 if (this->_M_is_engaged())
1333#if __cpp_lib_optional >= 202110L
1336 template<
typename _Fn>
1338 and_then(_Fn&& __f) &
1340 using _Up = remove_cvref_t<invoke_result_t<_Fn, _Tp&>>;
1341 static_assert(__is_optional_v<_Up>,
1342 "the function passed to std::optional<T>::and_then "
1343 "must return a std::optional");
1350 template<
typename _Fn>
1352 and_then(_Fn&& __f)
const &
1354 using _Up = remove_cvref_t<invoke_result_t<_Fn, const _Tp&>>;
1355 static_assert(__is_optional_v<_Up>,
1356 "the function passed to std::optional<T>::and_then "
1357 "must return a std::optional");
1364 template<
typename _Fn>
1366 and_then(_Fn&& __f) &&
1368 using _Up = remove_cvref_t<invoke_result_t<_Fn, _Tp>>;
1369 static_assert(__is_optional_v<_Up>,
1370 "the function passed to std::optional<T>::and_then "
1371 "must return a std::optional");
1378 template<
typename _Fn>
1380 and_then(_Fn&& __f)
const &&
1382 using _Up = remove_cvref_t<invoke_result_t<_Fn, const _Tp>>;
1383 static_assert(__is_optional_v<_Up>,
1384 "the function passed to std::optional<T>::and_then "
1385 "must return a std::optional");
1392 template<
typename _Fn>
1394 transform(_Fn&& __f) &
1396 using _Up = remove_cv_t<invoke_result_t<_Fn, _Tp&>>;
1398 return optional<_Up>(_Optional_func<_Fn>{__f}, _M_get());
1400 return optional<_Up>();
1403 template<
typename _Fn>
1405 transform(_Fn&& __f)
const &
1407 using _Up = remove_cv_t<invoke_result_t<_Fn, const _Tp&>>;
1409 return optional<_Up>(_Optional_func<_Fn>{__f}, _M_get());
1411 return optional<_Up>();
1414 template<
typename _Fn>
1416 transform(_Fn&& __f) &&
1418 using _Up = remove_cv_t<invoke_result_t<_Fn, _Tp>>;
1420 return optional<_Up>(_Optional_func<_Fn>{__f},
std::move(_M_get()));
1422 return optional<_Up>();
1425 template<
typename _Fn>
1427 transform(_Fn&& __f)
const &&
1429 using _Up = remove_cv_t<invoke_result_t<_Fn, const _Tp>>;
1431 return optional<_Up>(_Optional_func<_Fn>{__f},
std::move(_M_get()));
1433 return optional<_Up>();
1436 template<
typename _Fn>
requires invocable<_Fn> && copy_constructible<_Tp>
1438 or_else(_Fn&& __f)
const&
1440 using _Up = invoke_result_t<_Fn>;
1441 static_assert(is_same_v<remove_cvref_t<_Up>, optional>,
1442 "the function passed to std::optional<T>::or_else "
1443 "must return a std::optional<T>");
1451 template<
typename _Fn>
requires invocable<_Fn> && move_constructible<_Tp>
1453 or_else(_Fn&& __f) &&
1455 using _Up = invoke_result_t<_Fn>;
1456 static_assert(is_same_v<remove_cvref_t<_Up>, optional>,
1457 "the function passed to std::optional<T>::or_else "
1458 "must return a std::optional<T>");
1467 _GLIBCXX20_CONSTEXPR
void reset() noexcept { this->_M_reset(); }
1470 using _Base::_M_get;
1472 [[__gnu__::__always_inline__]]
1475 {
return _M_get(); }
1477 [[__gnu__::__always_inline__]]
1479 _M_fwd() &&
noexcept
1482 [[__gnu__::__always_inline__]]
1483 constexpr const _Tp&
1484 _M_fwd() const& noexcept
1485 {
return _M_get(); }
1487 [[__gnu__::__always_inline__]]
1488 constexpr const _Tp&&
1489 _M_fwd() const&& noexcept
1492 template<
typename _Up>
friend class optional;
1494#if __cpp_lib_optional >= 202110L
1495 template<
typename _Fn,
typename _Value>
1497 optional(_Optional_func<_Fn> __f, _Value&& __v)
1504#if __cpp_lib_optional >= 202506L
1505 template<
typename _Tp>
1506 class optional<_Tp&>;
1508 template<
typename _Tp>
1509 constexpr bool __is_optional_ref_v =
false;
1511 template<
typename _Tp>
1512 constexpr bool __is_optional_ref_v<optional<_Tp&>> =
true;
1514 template<
typename _Tp>
1515 struct __optional_ref_base
1518#ifdef __cpp_lib_optional_range_support
1519 template<
typename _Tp>
1520 struct __optional_ref_base<_Tp[]>
1523 template<
typename _Tp>
1524 requires is_object_v<_Tp>
1525 struct __optional_ref_base<_Tp>
1527 using iterator = __gnu_cxx::__normal_iterator<_Tp*, optional<_Tp&>>;
1531 template<
typename _Tp>
1532 class optional<_Tp&> :
public __optional_ref_base<_Tp>
1534 static_assert(__is_valid_contained_type_for_optional<_Tp&>);
1540 constexpr optional() noexcept = default;
1541 constexpr optional(nullopt_t) noexcept : optional() {}
1542 constexpr optional(
const optional&)
noexcept =
default;
1544 template<
typename _Arg>
1545 requires is_constructible_v<_Tp&, _Arg>
1546 && (!reference_constructs_from_temporary_v<_Tp&, _Arg>)
1548 optional(in_place_t, _Arg&& __arg)
1553 template<
typename _Up>
1554 requires (!is_same_v<remove_cvref_t<_Up>, optional>)
1555 && (!is_same_v<remove_cvref_t<_Up>, in_place_t>)
1556 && is_constructible_v<_Tp&, _Up>
1557 && (!reference_constructs_from_temporary_v<_Tp&, _Up>)
1558 explicit(!is_convertible_v<_Up, _Tp&>)
1561 noexcept(is_nothrow_constructible_v<_Tp&, _Up>)
1566 template<
typename _Up>
1567 requires (!is_same_v<remove_cvref_t<_Up>, optional>)
1568 && (!is_same_v<remove_cvref_t<_Up>, in_place_t>)
1569 && is_constructible_v<_Tp&, _Up>
1570 && reference_constructs_from_temporary_v<_Tp&, _Up>
1571 explicit(!is_convertible_v<_Up, _Tp&>)
1573 optional(_Up&& __u) =
delete;
1576 template<
typename _Up>
1577 requires (!is_same_v<remove_cv_t<_Tp>, optional<_Up>>)
1578 && (!is_same_v<_Tp&, _Up>)
1579 && is_constructible_v<_Tp&, _Up&>
1580 && (!reference_constructs_from_temporary_v<_Tp&, _Up&>)
1581 explicit(!is_convertible_v<_Up&, _Tp&>)
1583 optional(optional<_Up>& __rhs)
1584 noexcept(is_nothrow_constructible_v<_Tp&, _Up&>)
1587 __convert_ref_init_val(__rhs._M_fwd());
1590 template<
typename _Up>
1591 requires (!is_same_v<remove_cv_t<_Tp>, optional<_Up>>)
1592 && (!is_same_v<_Tp&, _Up>)
1593 && is_constructible_v<_Tp&, _Up&>
1594 && reference_constructs_from_temporary_v<_Tp&, _Up&>
1595 explicit(!is_convertible_v<_Up&, _Tp&>)
1597 optional(optional<_Up>& __rhs) =
delete;
1600 template<
typename _Up>
1601 requires (!is_same_v<remove_cv_t<_Tp>, optional<_Up>>)
1602 && (!is_same_v<_Tp&, _Up>)
1603 && is_constructible_v<_Tp&, const _Up&>
1604 && (!reference_constructs_from_temporary_v<_Tp&, const _Up&>)
1605 explicit(!is_convertible_v<const _Up&, _Tp&>)
1607 optional(
const optional<_Up>& __rhs)
1608 noexcept(is_nothrow_constructible_v<_Tp&, _Up&>)
1611 __convert_ref_init_val(__rhs._M_fwd());
1614 template<
typename _Up>
1615 requires (!is_same_v<remove_cv_t<_Tp>, optional<_Up>>)
1616 && (!is_same_v<_Tp&, _Up>)
1617 && is_constructible_v<_Tp&, const _Up&>
1618 && reference_constructs_from_temporary_v<_Tp&, const _Up&>
1619 explicit(!is_convertible_v<const _Up&, _Tp&>)
1621 optional(
const optional<_Up>& __rhs) =
delete;
1624 template<
typename _Up>
1625 requires (!is_same_v<remove_cv_t<_Tp>, optional<_Up>>)
1626 && (!is_same_v<_Tp&, _Up>)
1627 && is_constructible_v<_Tp&, _Up>
1628 && (!reference_constructs_from_temporary_v<_Tp&, _Up>)
1629 explicit(!is_convertible_v<_Up, _Tp&>)
1631 optional(optional<_Up>&& __rhs)
1632 noexcept(is_nothrow_constructible_v<_Tp&, _Up>)
1635 __convert_ref_init_val(
std::move(__rhs)._M_fwd());
1638 template<
typename _Up>
1639 requires (!is_same_v<remove_cv_t<_Tp>, optional<_Up>>)
1640 && (!is_same_v<_Tp&, _Up>)
1641 && is_constructible_v<_Tp&, _Up>
1642 && reference_constructs_from_temporary_v<_Tp&, _Up>
1643 explicit(!is_convertible_v<_Up, _Tp&>)
1645 optional(optional<_Up>&& __rhs) =
delete;
1648 template<
typename _Up>
1649 requires (!is_same_v<remove_cv_t<_Tp>, optional<_Up>>)
1650 && (!is_same_v<_Tp&, _Up>)
1651 && is_constructible_v<_Tp&, const _Up>
1652 && (!reference_constructs_from_temporary_v<_Tp&, _Up>)
1653 explicit(!is_convertible_v<const _Up, _Tp&>)
1655 optional(
const optional<_Up>&& __rhs)
1656 noexcept(is_nothrow_constructible_v<_Tp&, const _Up>)
1659 __convert_ref_init_val(
std::move(__rhs)._M_fwd());
1662 template<
typename _Up>
1663 requires (!is_same_v<remove_cv_t<_Tp>, optional<_Up>>)
1664 && (!is_same_v<_Tp&, _Up>)
1665 && is_constructible_v<_Tp&, const _Up>
1666 && reference_constructs_from_temporary_v<_Tp&, const _Up>
1667 explicit(!is_convertible_v<const _Up, _Tp&>)
1669 optional(
const optional<_Up>&& __rhs) =
delete;
1671 constexpr ~optional() =
default;
1674 constexpr optional& operator=(nullopt_t)
noexcept
1680 constexpr optional& operator=(
const optional&)
noexcept =
default;
1682 template<
typename _Up>
1683 requires is_constructible_v<_Tp&, _Up>
1684 && (!reference_constructs_from_temporary_v<_Tp&, _Up>)
1687 noexcept(is_nothrow_constructible_v<_Tp&, _Up>)
1696 constexpr void swap(optional& __rhs)
noexcept
1697 { std::swap(_M_val, __rhs._M_val); }
1699#ifdef __cpp_lib_optional_range_support
1701 constexpr auto begin() const noexcept
1702 requires is_object_v<_Tp> && (!is_unbounded_array_v<_Tp>)
1703 {
return __gnu_cxx::__normal_iterator<_Tp*, optional>(_M_val); }
1705 constexpr auto end() const noexcept
1706 requires is_object_v<_Tp> && (!is_unbounded_array_v<_Tp>)
1707 {
return begin() + has_value(); }
1711 constexpr _Tp* operator->() const noexcept
1713 __glibcxx_assert(_M_val);
1717 constexpr _Tp&
operator*() const noexcept
1719 __glibcxx_assert(_M_val);
1723 constexpr explicit operator bool() const noexcept
1728 constexpr bool has_value() const noexcept
1733 constexpr _Tp& value()
const
1737 __throw_bad_optional_access();
1742 template<
typename _Up = remove_cv_t<_Tp>>
1743 requires is_object_v<_Tp> && (!is_array_v<_Tp>)
1745 value_or(_Up&& __u)
const
1747 using _Xp = remove_cv_t<_Tp>;
1748 static_assert(is_convertible_v<_Tp&, _Xp>);
1749 static_assert(is_convertible_v<_Up, _Xp>);
1756 template<
typename _Fn>
1758 and_then(_Fn&& __f)
const
1760 using _Up = remove_cvref_t<invoke_result_t<_Fn, _Tp&>>;
1761 static_assert(__is_optional_v<_Up>,
1762 "the function passed to std::optional<T&>::and_then "
1763 "must return a std::optional");
1770 template<
typename _Fn>
1772 optional<remove_cv_t<invoke_result_t<_Fn, _Tp&>>>
1773 transform(_Fn&& __f)
const
1775 using _Up = remove_cv_t<invoke_result_t<_Fn, _Tp&>>;
1777 return optional<_Up>(_Optional_func<_Fn>{__f}, *_M_val);
1779 return optional<_Up>();
1782 template<
typename _Fn>
1786 or_else(_Fn&& __f)
const
1788 static_assert(is_same_v<remove_cvref_t<invoke_result_t<_Fn>>, optional>,
1789 "the function passed to std::optional<T&>::or_else "
1790 "must return a std::optional<T&>");
1800 constexpr void reset() noexcept
1806 _Tp *_M_val =
nullptr;
1808 [[__gnu__::__always_inline__]]
1810 _M_fwd() const noexcept
1813 template<
typename _Up>
friend class optional;
1815 template<
typename _Up>
1818 __convert_ref_init_val(_Up&& __u)
1825 template<
typename _Fn,
typename _Value>
1827 optional(_Optional_func<_Fn> __f, _Value&& __v)
1835 template<
typename _Tp>
1836 using __optional_relop_t =
1839 template<
typename _Tp,
typename _Up>
1840 using __optional_eq_t = __optional_relop_t<
1844 template<
typename _Tp,
typename _Up>
1845 using __optional_ne_t = __optional_relop_t<
1849 template<
typename _Tp,
typename _Up>
1850 using __optional_lt_t = __optional_relop_t<
1854 template<
typename _Tp,
typename _Up>
1855 using __optional_gt_t = __optional_relop_t<
1859 template<
typename _Tp,
typename _Up>
1860 using __optional_le_t = __optional_relop_t<
1864 template<
typename _Tp,
typename _Up>
1865 using __optional_ge_t = __optional_relop_t<
1870 template<
typename _Tp,
typename _Up>
1872 operator==(
const optional<_Tp>& __lhs,
const optional<_Up>& __rhs)
1873 -> __optional_eq_t<_Tp, _Up>
1875 if (__lhs.has_value() != __rhs.has_value())
1877 if (!__lhs.has_value())
1879 return *__lhs == *__rhs;
1882 template<
typename _Tp,
typename _Up>
1884 operator!=(
const optional<_Tp>& __lhs,
const optional<_Up>& __rhs)
1885 -> __optional_ne_t<_Tp, _Up>
1887 if (__lhs.has_value() != __rhs.has_value())
1889 if (!__lhs.has_value())
1891 return *__lhs != *__rhs;
1894 template<
typename _Tp,
typename _Up>
1896 operator<(
const optional<_Tp>& __lhs,
const optional<_Up>& __rhs)
1897 -> __optional_lt_t<_Tp, _Up>
1899 if (!__rhs.has_value())
1901 if (!__lhs.has_value())
1903 return *__lhs < *__rhs;
1906 template<
typename _Tp,
typename _Up>
1908 operator>(
const optional<_Tp>& __lhs,
const optional<_Up>& __rhs)
1909 -> __optional_gt_t<_Tp, _Up>
1911 if (!__lhs.has_value())
1913 if (!__rhs.has_value())
1915 return *__lhs > *__rhs;
1918 template<
typename _Tp,
typename _Up>
1920 operator<=(
const optional<_Tp>& __lhs,
const optional<_Up>& __rhs)
1921 -> __optional_le_t<_Tp, _Up>
1923 if (!__lhs.has_value())
1925 if (!__rhs.has_value())
1927 return *__lhs <= *__rhs;
1930 template<
typename _Tp,
typename _Up>
1932 operator>=(
const optional<_Tp>& __lhs,
const optional<_Up>& __rhs)
1933 -> __optional_ge_t<_Tp, _Up>
1935 if (!__rhs.has_value())
1937 if (!__lhs.has_value())
1939 return *__lhs >= *__rhs;
1942#ifdef __cpp_lib_three_way_comparison
1943 template<
typename _Tp, three_way_comparable_with<_Tp> _Up>
1946 operator<=>(
const optional<_Tp>& __x,
const optional<_Up>& __y)
1948 return __x && __y ? *__x <=> *__y : bool(__x) <=> bool(__y);
1953 template<
typename _Tp>
1956 operator==(
const optional<_Tp>& __lhs, nullopt_t)
noexcept
1959#ifdef __cpp_lib_three_way_comparison
1960 template<
typename _Tp>
1962 constexpr strong_ordering
1963 operator<=>(
const optional<_Tp>& __x, nullopt_t)
noexcept
1964 {
return bool(__x) <=>
false; }
1966 template<
typename _Tp>
1968 operator==(nullopt_t,
const optional<_Tp>& __rhs)
noexcept
1971 template<
typename _Tp>
1973 operator!=(
const optional<_Tp>& __lhs, nullopt_t)
noexcept
1974 {
return static_cast<bool>(__lhs); }
1976 template<
typename _Tp>
1978 operator!=(nullopt_t,
const optional<_Tp>& __rhs)
noexcept
1979 {
return static_cast<bool>(__rhs); }
1981 template<
typename _Tp>
1983 operator<(
const optional<_Tp>& , nullopt_t)
noexcept
1986 template<
typename _Tp>
1988 operator<(nullopt_t,
const optional<_Tp>& __rhs)
noexcept
1989 {
return static_cast<bool>(__rhs); }
1991 template<
typename _Tp>
1993 operator>(
const optional<_Tp>& __lhs, nullopt_t)
noexcept
1994 {
return static_cast<bool>(__lhs); }
1996 template<
typename _Tp>
1998 operator>(nullopt_t,
const optional<_Tp>& )
noexcept
2001 template<
typename _Tp>
2003 operator<=(
const optional<_Tp>& __lhs, nullopt_t)
noexcept
2006 template<
typename _Tp>
2008 operator<=(nullopt_t,
const optional<_Tp>& )
noexcept
2011 template<
typename _Tp>
2013 operator>=(
const optional<_Tp>& , nullopt_t)
noexcept
2016 template<
typename _Tp>
2018 operator>=(nullopt_t,
const optional<_Tp>& __rhs)
noexcept
2022#if __cpp_lib_concepts
2025# define _REQUIRES_NOT_OPTIONAL(T) requires (!__is_optional_v<T>)
2027# define _REQUIRES_NOT_OPTIONAL(T)
2031 template<
typename _Tp,
typename _Up>
2032 _REQUIRES_NOT_OPTIONAL(_Up)
2034 operator== [[nodiscard]] (
const optional<_Tp>& __lhs,
const _Up& __rhs)
2035 -> __optional_eq_t<_Tp, _Up>
2037 if (__lhs.has_value())
2038 return *__lhs == __rhs;
2042 template<
typename _Tp,
typename _Up>
2043 _REQUIRES_NOT_OPTIONAL(_Tp)
2045 operator== [[nodiscard]] (
const _Tp& __lhs,
const optional<_Up>& __rhs)
2046 -> __optional_eq_t<_Tp, _Up>
2048 if (__rhs.has_value())
2049 return __lhs == *__rhs;
2053 template<
typename _Tp,
typename _Up>
2054 _REQUIRES_NOT_OPTIONAL(_Up)
2056 operator!= [[nodiscard]] (
const optional<_Tp>& __lhs,
const _Up& __rhs)
2057 -> __optional_ne_t<_Tp, _Up>
2059 if (__lhs.has_value())
2060 return *__lhs != __rhs;
2064 template<
typename _Tp,
typename _Up>
2065 _REQUIRES_NOT_OPTIONAL(_Tp)
2067 operator!= [[nodiscard]] (
const _Tp& __lhs,
const optional<_Up>& __rhs)
2068 -> __optional_ne_t<_Tp, _Up>
2070 if (__rhs.has_value())
2071 return __lhs != *__rhs;
2075 template<
typename _Tp,
typename _Up>
2076 _REQUIRES_NOT_OPTIONAL(_Up)
2078 operator< [[nodiscard]] (
const optional<_Tp>& __lhs,
const _Up& __rhs)
2079 -> __optional_lt_t<_Tp, _Up>
2081 if (__lhs.has_value())
2082 return *__lhs < __rhs;
2086 template<
typename _Tp,
typename _Up>
2087 _REQUIRES_NOT_OPTIONAL(_Tp)
2089 operator< [[nodiscard]] (
const _Tp& __lhs,
const optional<_Up>& __rhs)
2090 -> __optional_lt_t<_Tp, _Up>
2092 if (__rhs.has_value())
2093 return __lhs < *__rhs;
2097 template<
typename _Tp,
typename _Up>
2098 _REQUIRES_NOT_OPTIONAL(_Up)
2100 operator> [[nodiscard]] (
const optional<_Tp>& __lhs,
const _Up& __rhs)
2101 -> __optional_gt_t<_Tp, _Up>
2103 if (__lhs.has_value())
2104 return *__lhs > __rhs;
2108 template<
typename _Tp,
typename _Up>
2109 _REQUIRES_NOT_OPTIONAL(_Tp)
2111 operator> [[nodiscard]] (
const _Tp& __lhs,
const optional<_Up>& __rhs)
2112 -> __optional_gt_t<_Tp, _Up>
2114 if (__rhs.has_value())
2115 return __lhs > *__rhs;
2119 template<
typename _Tp,
typename _Up>
2120 _REQUIRES_NOT_OPTIONAL(_Up)
2122 operator<= [[nodiscard]] (
const optional<_Tp>& __lhs,
const _Up& __rhs)
2123 -> __optional_le_t<_Tp, _Up>
2125 if (__lhs.has_value())
2126 return *__lhs <= __rhs;
2130 template<
typename _Tp,
typename _Up>
2131 _REQUIRES_NOT_OPTIONAL(_Tp)
2133 operator<= [[nodiscard]] (
const _Tp& __lhs,
const optional<_Up>& __rhs)
2134 -> __optional_le_t<_Tp, _Up>
2136 if (__rhs.has_value())
2137 return __lhs <= *__rhs;
2141 template<
typename _Tp,
typename _Up>
2142 _REQUIRES_NOT_OPTIONAL(_Up)
2144 operator>= [[nodiscard]] (
const optional<_Tp>& __lhs,
const _Up& __rhs)
2145 -> __optional_ge_t<_Tp, _Up>
2147 if (__lhs.has_value())
2148 return *__lhs >= __rhs;
2152 template<
typename _Tp,
typename _Up>
2153 _REQUIRES_NOT_OPTIONAL(_Tp)
2155 operator>= [[nodiscard]] (
const _Tp& __lhs,
const optional<_Up>& __rhs)
2156 -> __optional_ge_t<_Tp, _Up>
2158 if (__rhs.has_value())
2159 return __lhs >= *__rhs;
2163#ifdef __cpp_lib_three_way_comparison
2167 template<
typename _Tp>
2168 concept __is_derived_from_optional =
requires (
const _Tp& __t) {
2169 []<
typename _Up>(
const optional<_Up>&){ }(__t);
2172 template<
typename _Tp,
typename _Up>
2173 requires (!__is_derived_from_optional<_Up>)
2175 && three_way_comparable_with<_Tp, _Up>
2177 operator<=> [[nodiscard]] (
const optional<_Tp>& __x,
const _Up& __v)
2178 {
return bool(__x) ? *__x <=> __v : strong_ordering::less; }
2185 template<
typename _Tp>
2186 _GLIBCXX20_CONSTEXPR
2188 swap(optional<_Tp>& __lhs, optional<_Tp>& __rhs)
2189 noexcept(
noexcept(__lhs.swap(__rhs)))
2190 { __lhs.swap(__rhs); }
2192#if __cpp_lib_optional >= 202506L
2195 template<
typename _Tp>
2197 swap(optional<_Tp&>& __lhs, optional<_Tp&>& __rhs)
noexcept
2198 { __lhs.swap(__rhs); }
2203 template<
typename _Tp>
2204 enable_if_t<!(is_move_constructible_v<_Tp> && is_swappable_v<_Tp>)>
2205 swap(optional<_Tp>&, optional<_Tp>&) =
delete;
2207#if __cpp_lib_optional >= 202506L
2208 template<
int = 0,
typename _Tp>
2210 template<
typename _Tp>
2214 optional<decay_t<_Tp>>>
2215 make_optional(_Tp&& __t)
2216 noexcept(is_nothrow_constructible_v<optional<decay_t<_Tp>>, _Tp>)
2219 template<
typename _Tp,
typename... _Args>
2223 make_optional(_Args&&... __args)
2224 noexcept(is_nothrow_constructible_v<_Tp, _Args...>)
2227 template<
typename _Tp,
typename _Up,
typename... _Args>
2232 noexcept(is_nothrow_constructible_v<_Tp, initializer_list<_Up>&, _Args...>)
2237 template<
typename _Tp,
typename _Up = remove_const_t<_Tp>>
2238 struct __optional_hash
2239#if ! _GLIBCXX_INLINE_VERSION
2240 :
public __hash_empty_base<_Up>
2243#if __cplusplus < 202002L
2244 using result_type [[__deprecated__]] = size_t;
2245 using argument_type [[__deprecated__]] = optional<_Tp>;
2249 operator()(
const optional<_Tp>& __t)
const
2250 noexcept(
noexcept(hash<_Up>{}(*__t)))
2254 constexpr size_t __magic_disengaged_hash =
static_cast<size_t>(-3333);
2255 return __t ? hash<_Up>{}(*__t) : __magic_disengaged_hash;
2259 template<
typename _Tp>
2260 struct hash<optional<_Tp>>
2262 :
public __conditional_t<__is_hash_enabled_for<remove_const_t<_Tp>>,
2263 __optional_hash<_Tp>,
2264 __hash_not_enabled<_Tp>>
2267 template<
typename _Tp>
2273#if __cpp_deduction_guides >= 201606
2274 template <
typename _Tp> optional(_Tp) -> optional<_Tp>;
2277#ifdef __cpp_lib_optional_range_support
2278 template<
typename _Tp>
2279 inline constexpr bool
2282#if __cpp_lib_optional >= 202506L
2283 template<
typename _Tp>
2285 ranges::enable_borrowed_range<optional<_Tp&>> =
true;
2288 template<
typename _Tp>
2289 inline constexpr range_format
2290 format_kind<optional<_Tp>> = range_format::disabled;
2293#undef _GLIBCXX_USE_CONSTRAINTS_FOR_OPTIONAL
2295_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