31#ifndef _GLIBCXX_OPTIONAL_REF
32#define _GLIBCXX_OPTIONAL_REF 1
35#pragma GCC system_header
38#ifdef __glibcxx_optional
44namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
46_GLIBCXX_BEGIN_NAMESPACE_VERSION
48 template<
typename _Iterator,
typename _Container>
49 class __normal_iterator;
51_GLIBCXX_END_NAMESPACE_VERSION
54namespace std _GLIBCXX_VISIBILITY(default)
56_GLIBCXX_BEGIN_NAMESPACE_VERSION
63 template<
typename _Tp>
77 explicit constexpr nullopt_t(_Construct)
noexcept { }
81 inline constexpr nullopt_t
nullopt { nullopt_t::_Construct::_Token };
83 template<
typename _Fn>
struct _Optional_func { _Fn& _M_f; };
85 template<
typename _Tp>
86 inline constexpr bool __is_valid_contained_type_for_optional =
88#if __glibcxx_optional >= 202506L
89 is_lvalue_reference_v<_Tp> ||
91 (is_object_v<_Tp> && is_destructible_v<_Tp> && !is_array_v<_Tp>)
96#if __glibcxx_optional >= 202506L
97 template<
typename _Tp>
100 template<
typename _Tp>
101 constexpr bool __is_optional_ref_v =
false;
103 template<
typename _Tp>
104 constexpr bool __is_optional_ref_v<optional<_Tp&>> =
true;
106 template<
typename _Tp>
107 struct __optional_ref_base
110#ifdef __glibcxx_optional_range_support
111 template<
typename _Tp>
112 struct __optional_ref_base<_Tp[]>
115 template<
typename _Tp>
116 requires is_object_v<_Tp>
117 struct __optional_ref_base<_Tp>
119 using iterator = __gnu_cxx::__normal_iterator<_Tp*, optional<_Tp&>>;
123 template<
typename _Tp>
124 class optional<_Tp&> :
public __optional_ref_base<_Tp>
126 static_assert(__is_valid_contained_type_for_optional<_Tp&>);
131 constexpr static optional
132 _S_from_ptr(_Tp* __ptr)
135 __res._M_val = __ptr;
140 constexpr optional() noexcept = default;
141 constexpr optional(nullopt_t) noexcept : optional() {}
142 constexpr optional(
const optional&)
noexcept =
default;
144 template<
typename _Arg>
145 requires is_constructible_v<_Tp&, _Arg>
146 && (!reference_constructs_from_temporary_v<_Tp&, _Arg>)
148 optional(in_place_t, _Arg&& __arg)
153 template<
typename _Up>
154 requires (!is_same_v<remove_cvref_t<_Up>, optional>)
155 && (!is_same_v<remove_cvref_t<_Up>, in_place_t>)
156 && is_constructible_v<_Tp&, _Up>
157 && (!reference_constructs_from_temporary_v<_Tp&, _Up>)
158 explicit(!is_convertible_v<_Up, _Tp&>)
161 noexcept(is_nothrow_constructible_v<_Tp&, _Up>)
166 template<
typename _Up>
167 requires (!is_same_v<remove_cvref_t<_Up>, optional>)
168 && (!is_same_v<remove_cvref_t<_Up>, in_place_t>)
169 && is_constructible_v<_Tp&, _Up>
170 && reference_constructs_from_temporary_v<_Tp&, _Up>
171 explicit(!is_convertible_v<_Up, _Tp&>)
173 optional(_Up&& __u) =
delete;
176 template<
typename _Up>
177 requires (!is_same_v<remove_cv_t<_Tp>, optional<_Up>>)
178 && (!is_same_v<_Tp&, _Up>)
179 && is_constructible_v<_Tp&, _Up&>
180 && (!reference_constructs_from_temporary_v<_Tp&, _Up&>)
181 explicit(!is_convertible_v<_Up&, _Tp&>)
183 optional(optional<_Up>& __rhs)
184 noexcept(is_nothrow_constructible_v<_Tp&, _Up&>)
187 __convert_ref_init_val(__rhs._M_fwd());
190 template<
typename _Up>
191 requires (!is_same_v<remove_cv_t<_Tp>, optional<_Up>>)
192 && (!is_same_v<_Tp&, _Up>)
193 && is_constructible_v<_Tp&, _Up&>
194 && reference_constructs_from_temporary_v<_Tp&, _Up&>
195 explicit(!is_convertible_v<_Up&, _Tp&>)
197 optional(optional<_Up>& __rhs) =
delete;
200 template<
typename _Up>
201 requires (!is_same_v<remove_cv_t<_Tp>, optional<_Up>>)
202 && (!is_same_v<_Tp&, _Up>)
203 && is_constructible_v<_Tp&, const _Up&>
204 && (!reference_constructs_from_temporary_v<_Tp&, const _Up&>)
205 explicit(!is_convertible_v<const _Up&, _Tp&>)
207 optional(
const optional<_Up>& __rhs)
208 noexcept(is_nothrow_constructible_v<_Tp&, _Up&>)
211 __convert_ref_init_val(__rhs._M_fwd());
214 template<
typename _Up>
215 requires (!is_same_v<remove_cv_t<_Tp>, optional<_Up>>)
216 && (!is_same_v<_Tp&, _Up>)
217 && is_constructible_v<_Tp&, const _Up&>
218 && reference_constructs_from_temporary_v<_Tp&, const _Up&>
219 explicit(!is_convertible_v<const _Up&, _Tp&>)
221 optional(
const optional<_Up>& __rhs) =
delete;
224 template<
typename _Up>
225 requires (!is_same_v<remove_cv_t<_Tp>, optional<_Up>>)
226 && (!is_same_v<_Tp&, _Up>)
227 && is_constructible_v<_Tp&, _Up>
228 && (!reference_constructs_from_temporary_v<_Tp&, _Up>)
229 explicit(!is_convertible_v<_Up, _Tp&>)
231 optional(optional<_Up>&& __rhs)
232 noexcept(is_nothrow_constructible_v<_Tp&, _Up>)
235 __convert_ref_init_val(
std::move(__rhs)._M_fwd());
238 template<
typename _Up>
239 requires (!is_same_v<remove_cv_t<_Tp>, optional<_Up>>)
240 && (!is_same_v<_Tp&, _Up>)
241 && is_constructible_v<_Tp&, _Up>
242 && reference_constructs_from_temporary_v<_Tp&, _Up>
243 explicit(!is_convertible_v<_Up, _Tp&>)
245 optional(optional<_Up>&& __rhs) =
delete;
248 template<
typename _Up>
249 requires (!is_same_v<remove_cv_t<_Tp>, optional<_Up>>)
250 && (!is_same_v<_Tp&, _Up>)
251 && is_constructible_v<_Tp&, const _Up>
252 && (!reference_constructs_from_temporary_v<_Tp&, _Up>)
253 explicit(!is_convertible_v<const _Up, _Tp&>)
255 optional(
const optional<_Up>&& __rhs)
256 noexcept(is_nothrow_constructible_v<_Tp&, const _Up>)
259 __convert_ref_init_val(
std::move(__rhs)._M_fwd());
262 template<
typename _Up>
263 requires (!is_same_v<remove_cv_t<_Tp>, optional<_Up>>)
264 && (!is_same_v<_Tp&, _Up>)
265 && is_constructible_v<_Tp&, const _Up>
266 && reference_constructs_from_temporary_v<_Tp&, const _Up>
267 explicit(!is_convertible_v<const _Up, _Tp&>)
269 optional(
const optional<_Up>&& __rhs) =
delete;
271 constexpr ~optional() =
default;
274 constexpr optional& operator=(nullopt_t)
noexcept
280 constexpr optional& operator=(
const optional&)
noexcept =
default;
282 template<
typename _Up>
283 requires is_constructible_v<_Tp&, _Up>
284 && (!reference_constructs_from_temporary_v<_Tp&, _Up>)
287 noexcept(is_nothrow_constructible_v<_Tp&, _Up>)
296 constexpr void swap(optional& __rhs)
noexcept
297 { std::swap(_M_val, __rhs._M_val); }
299#ifdef __glibcxx_optional_range_support
301 constexpr auto begin() const noexcept
302 requires is_object_v<_Tp> && (!is_unbounded_array_v<_Tp>);
304 constexpr auto
end() const noexcept
305 requires is_object_v<_Tp> && (!is_unbounded_array_v<_Tp>);
309 constexpr _Tp* operator->() const noexcept
311 __glibcxx_assert(_M_val);
315 constexpr _Tp&
operator*() const noexcept
317 __glibcxx_assert(_M_val);
321 constexpr explicit operator bool() const noexcept
326 constexpr bool has_value() const noexcept
331 constexpr _Tp& value()
const;
335 template<
typename _Up = remove_cv_t<_Tp>>
336 requires is_object_v<_Tp> && (!is_array_v<_Tp>)
338 value_or(_Up&& __u)
const;
341 template<
typename _Fn>
343 and_then(_Fn&& __f)
const;
345 template<
typename _Fn>
347 optional<remove_cv_t<invoke_result_t<_Fn, _Tp&>>>
348 transform(_Fn&& __f)
const;
350 template<
typename _Fn>
351 requires is_invocable_v<_Fn>
354 or_else(_Fn&& __f)
const;
357 constexpr void reset() noexcept
363 _Tp *_M_val =
nullptr;
365 [[__gnu__::__always_inline__]]
367 _M_fwd() const noexcept
370 template<
typename _Up>
friend class optional;
372 template<
typename _Up>
375 __convert_ref_init_val(_Up&& __u)
382 template<
typename _Fn,
typename _Value>
384 optional(_Optional_func<_Fn> __f, _Value&& __v);
388_GLIBCXX_END_NAMESPACE_VERSION
constexpr complex< _Tp > operator*(const complex< _Tp > &__x, const complex< _Tp > &__y)
Return new complex value x times y.
typename remove_reference< _Tp >::type remove_reference_t
Alias template for remove_reference.
typename decay< _Tp >::type decay_t
Alias template for decay.
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 _Tp && forward(typename std::remove_reference< _Tp >::type &__t) noexcept
Forward an lvalue.
constexpr nullopt_t nullopt
Tag to disengage optional objects.
ISO C++ entities toplevel namespace is std.
constexpr auto end(_Container &__cont) noexcept(noexcept(__cont.end())) -> decltype(__cont.end())
Return an iterator pointing to one past the last element of the container.
constexpr void _Construct(_Tp *__p, _Args &&... __args)
constexpr auto begin(_Container &__cont) noexcept(noexcept(__cont.begin())) -> decltype(__cont.begin())
Return an iterator pointing to the first element of the container.
GNU extensions for public use.