xref: /aosp_15_r20/external/libcxx/include/optional (revision 58b9f456b02922dfdb1fad8a988d5fd8765ecb80)
1*58b9f456SAndroid Build Coastguard Worker// -*- C++ -*-
2*58b9f456SAndroid Build Coastguard Worker//===-------------------------- optional ----------------------------------===//
3*58b9f456SAndroid Build Coastguard Worker//
4*58b9f456SAndroid Build Coastguard Worker//                     The LLVM Compiler Infrastructure
5*58b9f456SAndroid Build Coastguard Worker//
6*58b9f456SAndroid Build Coastguard Worker// This file is dual licensed under the MIT and the University of Illinois Open
7*58b9f456SAndroid Build Coastguard Worker// Source Licenses. See LICENSE.TXT for details.
8*58b9f456SAndroid Build Coastguard Worker//
9*58b9f456SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
10*58b9f456SAndroid Build Coastguard Worker
11*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_OPTIONAL
12*58b9f456SAndroid Build Coastguard Worker#define _LIBCPP_OPTIONAL
13*58b9f456SAndroid Build Coastguard Worker
14*58b9f456SAndroid Build Coastguard Worker/*
15*58b9f456SAndroid Build Coastguard Worker    optional synopsis
16*58b9f456SAndroid Build Coastguard Worker
17*58b9f456SAndroid Build Coastguard Worker// C++1z
18*58b9f456SAndroid Build Coastguard Worker
19*58b9f456SAndroid Build Coastguard Workernamespace std {
20*58b9f456SAndroid Build Coastguard Worker  // 23.6.3, optional for object types
21*58b9f456SAndroid Build Coastguard Worker  template <class T> class optional;
22*58b9f456SAndroid Build Coastguard Worker
23*58b9f456SAndroid Build Coastguard Worker  // 23.6.4, no-value state indicator
24*58b9f456SAndroid Build Coastguard Worker  struct nullopt_t{see below };
25*58b9f456SAndroid Build Coastguard Worker  inline constexpr nullopt_t nullopt(unspecified );
26*58b9f456SAndroid Build Coastguard Worker
27*58b9f456SAndroid Build Coastguard Worker  // 23.6.5, class bad_optional_access
28*58b9f456SAndroid Build Coastguard Worker  class bad_optional_access;
29*58b9f456SAndroid Build Coastguard Worker
30*58b9f456SAndroid Build Coastguard Worker  // 23.6.6, relational operators
31*58b9f456SAndroid Build Coastguard Worker  template <class T, class U>
32*58b9f456SAndroid Build Coastguard Worker  constexpr bool operator==(const optional<T>&, const optional<U>&);
33*58b9f456SAndroid Build Coastguard Worker  template <class T, class U>
34*58b9f456SAndroid Build Coastguard Worker  constexpr bool operator!=(const optional<T>&, const optional<U>&);
35*58b9f456SAndroid Build Coastguard Worker  template <class T, class U>
36*58b9f456SAndroid Build Coastguard Worker  constexpr bool operator<(const optional<T>&, const optional<U>&);
37*58b9f456SAndroid Build Coastguard Worker  template <class T, class U>
38*58b9f456SAndroid Build Coastguard Worker  constexpr bool operator>(const optional<T>&, const optional<U>&);
39*58b9f456SAndroid Build Coastguard Worker  template <class T, class U>
40*58b9f456SAndroid Build Coastguard Worker  constexpr bool operator<=(const optional<T>&, const optional<U>&);
41*58b9f456SAndroid Build Coastguard Worker  template <class T, class U>
42*58b9f456SAndroid Build Coastguard Worker  constexpr bool operator>=(const optional<T>&, const optional<U>&);
43*58b9f456SAndroid Build Coastguard Worker
44*58b9f456SAndroid Build Coastguard Worker  // 23.6.7 comparison with nullopt
45*58b9f456SAndroid Build Coastguard Worker  template <class T> constexpr bool operator==(const optional<T>&, nullopt_t) noexcept;
46*58b9f456SAndroid Build Coastguard Worker  template <class T> constexpr bool operator==(nullopt_t, const optional<T>&) noexcept;
47*58b9f456SAndroid Build Coastguard Worker  template <class T> constexpr bool operator!=(const optional<T>&, nullopt_t) noexcept;
48*58b9f456SAndroid Build Coastguard Worker  template <class T> constexpr bool operator!=(nullopt_t, const optional<T>&) noexcept;
49*58b9f456SAndroid Build Coastguard Worker  template <class T> constexpr bool operator<(const optional<T>&, nullopt_t) noexcept;
50*58b9f456SAndroid Build Coastguard Worker  template <class T> constexpr bool operator<(nullopt_t, const optional<T>&) noexcept;
51*58b9f456SAndroid Build Coastguard Worker  template <class T> constexpr bool operator<=(const optional<T>&, nullopt_t) noexcept;
52*58b9f456SAndroid Build Coastguard Worker  template <class T> constexpr bool operator<=(nullopt_t, const optional<T>&) noexcept;
53*58b9f456SAndroid Build Coastguard Worker  template <class T> constexpr bool operator>(const optional<T>&, nullopt_t) noexcept;
54*58b9f456SAndroid Build Coastguard Worker  template <class T> constexpr bool operator>(nullopt_t, const optional<T>&) noexcept;
55*58b9f456SAndroid Build Coastguard Worker  template <class T> constexpr bool operator>=(const optional<T>&, nullopt_t) noexcept;
56*58b9f456SAndroid Build Coastguard Worker  template <class T> constexpr bool operator>=(nullopt_t, const optional<T>&) noexcept;
57*58b9f456SAndroid Build Coastguard Worker
58*58b9f456SAndroid Build Coastguard Worker  // 23.6.8, comparison with T
59*58b9f456SAndroid Build Coastguard Worker  template <class T, class U> constexpr bool operator==(const optional<T>&, const U&);
60*58b9f456SAndroid Build Coastguard Worker  template <class T, class U> constexpr bool operator==(const T&, const optional<U>&);
61*58b9f456SAndroid Build Coastguard Worker  template <class T, class U> constexpr bool operator!=(const optional<T>&, const U&);
62*58b9f456SAndroid Build Coastguard Worker  template <class T, class U> constexpr bool operator!=(const T&, const optional<U>&);
63*58b9f456SAndroid Build Coastguard Worker  template <class T, class U> constexpr bool operator<(const optional<T>&, const U&);
64*58b9f456SAndroid Build Coastguard Worker  template <class T, class U> constexpr bool operator<(const T&, const optional<U>&);
65*58b9f456SAndroid Build Coastguard Worker  template <class T, class U> constexpr bool operator<=(const optional<T>&, const U&);
66*58b9f456SAndroid Build Coastguard Worker  template <class T, class U> constexpr bool operator<=(const T&, const optional<U>&);
67*58b9f456SAndroid Build Coastguard Worker  template <class T, class U> constexpr bool operator>(const optional<T>&, const U&);
68*58b9f456SAndroid Build Coastguard Worker  template <class T, class U> constexpr bool operator>(const T&, const optional<U>&);
69*58b9f456SAndroid Build Coastguard Worker  template <class T, class U> constexpr bool operator>=(const optional<T>&, const U&);
70*58b9f456SAndroid Build Coastguard Worker  template <class T, class U> constexpr bool operator>=(const T&, const optional<U>&);
71*58b9f456SAndroid Build Coastguard Worker
72*58b9f456SAndroid Build Coastguard Worker  // 23.6.9, specialized algorithms
73*58b9f456SAndroid Build Coastguard Worker  template <class T> void swap(optional<T>&, optional<T>&) noexcept(see below );
74*58b9f456SAndroid Build Coastguard Worker  template <class T> constexpr optional<see below > make_optional(T&&);
75*58b9f456SAndroid Build Coastguard Worker  template <class T, class... Args>
76*58b9f456SAndroid Build Coastguard Worker    constexpr optional<T> make_optional(Args&&... args);
77*58b9f456SAndroid Build Coastguard Worker  template <class T, class U, class... Args>
78*58b9f456SAndroid Build Coastguard Worker    constexpr optional<T> make_optional(initializer_list<U> il, Args&&... args);
79*58b9f456SAndroid Build Coastguard Worker
80*58b9f456SAndroid Build Coastguard Worker  // 23.6.10, hash support
81*58b9f456SAndroid Build Coastguard Worker  template <class T> struct hash;
82*58b9f456SAndroid Build Coastguard Worker  template <class T> struct hash<optional<T>>;
83*58b9f456SAndroid Build Coastguard Worker
84*58b9f456SAndroid Build Coastguard Worker  template <class T> class optional {
85*58b9f456SAndroid Build Coastguard Worker  public:
86*58b9f456SAndroid Build Coastguard Worker    using value_type = T;
87*58b9f456SAndroid Build Coastguard Worker
88*58b9f456SAndroid Build Coastguard Worker    // 23.6.3.1, constructors
89*58b9f456SAndroid Build Coastguard Worker    constexpr optional() noexcept;
90*58b9f456SAndroid Build Coastguard Worker    constexpr optional(nullopt_t) noexcept;
91*58b9f456SAndroid Build Coastguard Worker    optional(const optional &);
92*58b9f456SAndroid Build Coastguard Worker    optional(optional &&) noexcept(see below);
93*58b9f456SAndroid Build Coastguard Worker    template <class... Args> constexpr explicit optional(in_place_t, Args &&...);
94*58b9f456SAndroid Build Coastguard Worker    template <class U, class... Args>
95*58b9f456SAndroid Build Coastguard Worker      constexpr explicit optional(in_place_t, initializer_list<U>, Args &&...);
96*58b9f456SAndroid Build Coastguard Worker    template <class U = T>
97*58b9f456SAndroid Build Coastguard Worker      constexpr EXPLICIT optional(U &&);
98*58b9f456SAndroid Build Coastguard Worker    template <class U>
99*58b9f456SAndroid Build Coastguard Worker      constexpr EXPLICIT optional(const optional<U> &);
100*58b9f456SAndroid Build Coastguard Worker    template <class U>
101*58b9f456SAndroid Build Coastguard Worker      constexpr EXPLICIT optional(optional<U> &&);
102*58b9f456SAndroid Build Coastguard Worker
103*58b9f456SAndroid Build Coastguard Worker    // 23.6.3.2, destructor
104*58b9f456SAndroid Build Coastguard Worker    ~optional();
105*58b9f456SAndroid Build Coastguard Worker
106*58b9f456SAndroid Build Coastguard Worker    // 23.6.3.3, assignment
107*58b9f456SAndroid Build Coastguard Worker    optional &operator=(nullopt_t) noexcept;
108*58b9f456SAndroid Build Coastguard Worker    optional &operator=(const optional &);                // constexpr in C++20
109*58b9f456SAndroid Build Coastguard Worker    optional &operator=(optional &&) noexcept(see below); // constexpr in C++20
110*58b9f456SAndroid Build Coastguard Worker    template <class U = T> optional &operator=(U &&);
111*58b9f456SAndroid Build Coastguard Worker    template <class U> optional &operator=(const optional<U> &);
112*58b9f456SAndroid Build Coastguard Worker    template <class U> optional &operator=(optional<U> &&);
113*58b9f456SAndroid Build Coastguard Worker    template <class... Args> T& emplace(Args &&...);
114*58b9f456SAndroid Build Coastguard Worker    template <class U, class... Args>
115*58b9f456SAndroid Build Coastguard Worker      T& emplace(initializer_list<U>, Args &&...);
116*58b9f456SAndroid Build Coastguard Worker
117*58b9f456SAndroid Build Coastguard Worker    // 23.6.3.4, swap
118*58b9f456SAndroid Build Coastguard Worker    void swap(optional &) noexcept(see below );
119*58b9f456SAndroid Build Coastguard Worker
120*58b9f456SAndroid Build Coastguard Worker    // 23.6.3.5, observers
121*58b9f456SAndroid Build Coastguard Worker    constexpr T const *operator->() const;
122*58b9f456SAndroid Build Coastguard Worker    constexpr T *operator->();
123*58b9f456SAndroid Build Coastguard Worker    constexpr T const &operator*() const &;
124*58b9f456SAndroid Build Coastguard Worker    constexpr T &operator*() &;
125*58b9f456SAndroid Build Coastguard Worker    constexpr T &&operator*() &&;
126*58b9f456SAndroid Build Coastguard Worker    constexpr const T &&operator*() const &&;
127*58b9f456SAndroid Build Coastguard Worker    constexpr explicit operator bool() const noexcept;
128*58b9f456SAndroid Build Coastguard Worker    constexpr bool has_value() const noexcept;
129*58b9f456SAndroid Build Coastguard Worker    constexpr T const &value() const &;
130*58b9f456SAndroid Build Coastguard Worker    constexpr T &value() &;
131*58b9f456SAndroid Build Coastguard Worker    constexpr T &&value() &&;
132*58b9f456SAndroid Build Coastguard Worker    constexpr const T &&value() const &&;
133*58b9f456SAndroid Build Coastguard Worker    template <class U> constexpr T value_or(U &&) const &;
134*58b9f456SAndroid Build Coastguard Worker    template <class U> constexpr T value_or(U &&) &&;
135*58b9f456SAndroid Build Coastguard Worker
136*58b9f456SAndroid Build Coastguard Worker    // 23.6.3.6, modifiers
137*58b9f456SAndroid Build Coastguard Worker    void reset() noexcept;
138*58b9f456SAndroid Build Coastguard Worker
139*58b9f456SAndroid Build Coastguard Worker  private:
140*58b9f456SAndroid Build Coastguard Worker    T *val; // exposition only
141*58b9f456SAndroid Build Coastguard Worker  };
142*58b9f456SAndroid Build Coastguard Worker
143*58b9f456SAndroid Build Coastguard Workertemplate<class T>
144*58b9f456SAndroid Build Coastguard Worker  optional(T) -> optional<T>;
145*58b9f456SAndroid Build Coastguard Worker
146*58b9f456SAndroid Build Coastguard Worker} // namespace std
147*58b9f456SAndroid Build Coastguard Worker
148*58b9f456SAndroid Build Coastguard Worker*/
149*58b9f456SAndroid Build Coastguard Worker
150*58b9f456SAndroid Build Coastguard Worker#include <__config>
151*58b9f456SAndroid Build Coastguard Worker#include <__debug>
152*58b9f456SAndroid Build Coastguard Worker#include <__functional_base>
153*58b9f456SAndroid Build Coastguard Worker#include <functional>
154*58b9f456SAndroid Build Coastguard Worker#include <initializer_list>
155*58b9f456SAndroid Build Coastguard Worker#include <new>
156*58b9f456SAndroid Build Coastguard Worker#include <stdexcept>
157*58b9f456SAndroid Build Coastguard Worker#include <type_traits>
158*58b9f456SAndroid Build Coastguard Worker#include <utility>
159*58b9f456SAndroid Build Coastguard Worker#include <version>
160*58b9f456SAndroid Build Coastguard Worker
161*58b9f456SAndroid Build Coastguard Worker#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
162*58b9f456SAndroid Build Coastguard Worker#pragma GCC system_header
163*58b9f456SAndroid Build Coastguard Worker#endif
164*58b9f456SAndroid Build Coastguard Worker
165*58b9f456SAndroid Build Coastguard Worker_LIBCPP_PUSH_MACROS
166*58b9f456SAndroid Build Coastguard Worker#include <__undef_macros>
167*58b9f456SAndroid Build Coastguard Worker
168*58b9f456SAndroid Build Coastguard Worker
169*58b9f456SAndroid Build Coastguard Workernamespace std  // purposefully not using versioning namespace
170*58b9f456SAndroid Build Coastguard Worker{
171*58b9f456SAndroid Build Coastguard Worker
172*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_EXCEPTION_ABI _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS bad_optional_access
173*58b9f456SAndroid Build Coastguard Worker    : public exception
174*58b9f456SAndroid Build Coastguard Worker{
175*58b9f456SAndroid Build Coastguard Workerpublic:
176*58b9f456SAndroid Build Coastguard Worker    // Get the key function ~bad_optional_access() into the dylib
177*58b9f456SAndroid Build Coastguard Worker    virtual ~bad_optional_access() _NOEXCEPT;
178*58b9f456SAndroid Build Coastguard Worker    virtual const char* what() const _NOEXCEPT;
179*58b9f456SAndroid Build Coastguard Worker};
180*58b9f456SAndroid Build Coastguard Worker
181*58b9f456SAndroid Build Coastguard Worker}  // std
182*58b9f456SAndroid Build Coastguard Worker
183*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 14
184*58b9f456SAndroid Build Coastguard Worker
185*58b9f456SAndroid Build Coastguard Worker_LIBCPP_BEGIN_NAMESPACE_STD
186*58b9f456SAndroid Build Coastguard Worker
187*58b9f456SAndroid Build Coastguard Worker_LIBCPP_NORETURN
188*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
189*58b9f456SAndroid Build Coastguard Worker_LIBCPP_AVAILABILITY_THROW_BAD_OPTIONAL_ACCESS
190*58b9f456SAndroid Build Coastguard Workervoid __throw_bad_optional_access() {
191*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_NO_EXCEPTIONS
192*58b9f456SAndroid Build Coastguard Worker        throw bad_optional_access();
193*58b9f456SAndroid Build Coastguard Worker#else
194*58b9f456SAndroid Build Coastguard Worker        _VSTD::abort();
195*58b9f456SAndroid Build Coastguard Worker#endif
196*58b9f456SAndroid Build Coastguard Worker}
197*58b9f456SAndroid Build Coastguard Worker
198*58b9f456SAndroid Build Coastguard Workerstruct nullopt_t
199*58b9f456SAndroid Build Coastguard Worker{
200*58b9f456SAndroid Build Coastguard Worker    struct __secret_tag { _LIBCPP_INLINE_VISIBILITY explicit __secret_tag() = default; };
201*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY constexpr explicit nullopt_t(__secret_tag, __secret_tag) noexcept {}
202*58b9f456SAndroid Build Coastguard Worker};
203*58b9f456SAndroid Build Coastguard Worker
204*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VAR constexpr nullopt_t nullopt{nullopt_t::__secret_tag{}, nullopt_t::__secret_tag{}};
205*58b9f456SAndroid Build Coastguard Worker
206*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, bool = is_trivially_destructible<_Tp>::value>
207*58b9f456SAndroid Build Coastguard Workerstruct __optional_destruct_base;
208*58b9f456SAndroid Build Coastguard Worker
209*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
210*58b9f456SAndroid Build Coastguard Workerstruct __optional_destruct_base<_Tp, false>
211*58b9f456SAndroid Build Coastguard Worker{
212*58b9f456SAndroid Build Coastguard Worker    typedef _Tp value_type;
213*58b9f456SAndroid Build Coastguard Worker    static_assert(is_object_v<value_type>,
214*58b9f456SAndroid Build Coastguard Worker        "instantiation of optional with a non-object type is undefined behavior");
215*58b9f456SAndroid Build Coastguard Worker    union
216*58b9f456SAndroid Build Coastguard Worker    {
217*58b9f456SAndroid Build Coastguard Worker        char __null_state_;
218*58b9f456SAndroid Build Coastguard Worker        value_type __val_;
219*58b9f456SAndroid Build Coastguard Worker    };
220*58b9f456SAndroid Build Coastguard Worker    bool __engaged_;
221*58b9f456SAndroid Build Coastguard Worker
222*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
223*58b9f456SAndroid Build Coastguard Worker    ~__optional_destruct_base()
224*58b9f456SAndroid Build Coastguard Worker    {
225*58b9f456SAndroid Build Coastguard Worker        if (__engaged_)
226*58b9f456SAndroid Build Coastguard Worker            __val_.~value_type();
227*58b9f456SAndroid Build Coastguard Worker    }
228*58b9f456SAndroid Build Coastguard Worker
229*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
230*58b9f456SAndroid Build Coastguard Worker    constexpr __optional_destruct_base() noexcept
231*58b9f456SAndroid Build Coastguard Worker        :  __null_state_(),
232*58b9f456SAndroid Build Coastguard Worker           __engaged_(false) {}
233*58b9f456SAndroid Build Coastguard Worker
234*58b9f456SAndroid Build Coastguard Worker    template <class... _Args>
235*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
236*58b9f456SAndroid Build Coastguard Worker    constexpr explicit __optional_destruct_base(in_place_t, _Args&&... __args)
237*58b9f456SAndroid Build Coastguard Worker        :  __val_(_VSTD::forward<_Args>(__args)...),
238*58b9f456SAndroid Build Coastguard Worker           __engaged_(true) {}
239*58b9f456SAndroid Build Coastguard Worker
240*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
241*58b9f456SAndroid Build Coastguard Worker    void reset() noexcept
242*58b9f456SAndroid Build Coastguard Worker    {
243*58b9f456SAndroid Build Coastguard Worker        if (__engaged_)
244*58b9f456SAndroid Build Coastguard Worker        {
245*58b9f456SAndroid Build Coastguard Worker            __val_.~value_type();
246*58b9f456SAndroid Build Coastguard Worker            __engaged_ = false;
247*58b9f456SAndroid Build Coastguard Worker        }
248*58b9f456SAndroid Build Coastguard Worker    }
249*58b9f456SAndroid Build Coastguard Worker};
250*58b9f456SAndroid Build Coastguard Worker
251*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
252*58b9f456SAndroid Build Coastguard Workerstruct __optional_destruct_base<_Tp, true>
253*58b9f456SAndroid Build Coastguard Worker{
254*58b9f456SAndroid Build Coastguard Worker    typedef _Tp value_type;
255*58b9f456SAndroid Build Coastguard Worker    static_assert(is_object_v<value_type>,
256*58b9f456SAndroid Build Coastguard Worker        "instantiation of optional with a non-object type is undefined behavior");
257*58b9f456SAndroid Build Coastguard Worker    union
258*58b9f456SAndroid Build Coastguard Worker    {
259*58b9f456SAndroid Build Coastguard Worker        char __null_state_;
260*58b9f456SAndroid Build Coastguard Worker        value_type __val_;
261*58b9f456SAndroid Build Coastguard Worker    };
262*58b9f456SAndroid Build Coastguard Worker    bool __engaged_;
263*58b9f456SAndroid Build Coastguard Worker
264*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
265*58b9f456SAndroid Build Coastguard Worker    constexpr __optional_destruct_base() noexcept
266*58b9f456SAndroid Build Coastguard Worker        :  __null_state_(),
267*58b9f456SAndroid Build Coastguard Worker           __engaged_(false) {}
268*58b9f456SAndroid Build Coastguard Worker
269*58b9f456SAndroid Build Coastguard Worker    template <class... _Args>
270*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
271*58b9f456SAndroid Build Coastguard Worker    constexpr explicit __optional_destruct_base(in_place_t, _Args&&... __args)
272*58b9f456SAndroid Build Coastguard Worker        :  __val_(_VSTD::forward<_Args>(__args)...),
273*58b9f456SAndroid Build Coastguard Worker           __engaged_(true) {}
274*58b9f456SAndroid Build Coastguard Worker
275*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
276*58b9f456SAndroid Build Coastguard Worker    void reset() noexcept
277*58b9f456SAndroid Build Coastguard Worker    {
278*58b9f456SAndroid Build Coastguard Worker        if (__engaged_)
279*58b9f456SAndroid Build Coastguard Worker        {
280*58b9f456SAndroid Build Coastguard Worker            __engaged_ = false;
281*58b9f456SAndroid Build Coastguard Worker        }
282*58b9f456SAndroid Build Coastguard Worker    }
283*58b9f456SAndroid Build Coastguard Worker};
284*58b9f456SAndroid Build Coastguard Worker
285*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, bool = is_reference<_Tp>::value>
286*58b9f456SAndroid Build Coastguard Workerstruct __optional_storage_base : __optional_destruct_base<_Tp>
287*58b9f456SAndroid Build Coastguard Worker{
288*58b9f456SAndroid Build Coastguard Worker    using __base = __optional_destruct_base<_Tp>;
289*58b9f456SAndroid Build Coastguard Worker    using value_type = _Tp;
290*58b9f456SAndroid Build Coastguard Worker    using __base::__base;
291*58b9f456SAndroid Build Coastguard Worker
292*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
293*58b9f456SAndroid Build Coastguard Worker    constexpr bool has_value() const noexcept
294*58b9f456SAndroid Build Coastguard Worker    {
295*58b9f456SAndroid Build Coastguard Worker        return this->__engaged_;
296*58b9f456SAndroid Build Coastguard Worker    }
297*58b9f456SAndroid Build Coastguard Worker
298*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
299*58b9f456SAndroid Build Coastguard Worker    constexpr value_type& __get() & noexcept
300*58b9f456SAndroid Build Coastguard Worker    {
301*58b9f456SAndroid Build Coastguard Worker        return this->__val_;
302*58b9f456SAndroid Build Coastguard Worker    }
303*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
304*58b9f456SAndroid Build Coastguard Worker    constexpr const value_type& __get() const& noexcept
305*58b9f456SAndroid Build Coastguard Worker    {
306*58b9f456SAndroid Build Coastguard Worker        return this->__val_;
307*58b9f456SAndroid Build Coastguard Worker    }
308*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
309*58b9f456SAndroid Build Coastguard Worker    constexpr value_type&& __get() && noexcept
310*58b9f456SAndroid Build Coastguard Worker    {
311*58b9f456SAndroid Build Coastguard Worker        return _VSTD::move(this->__val_);
312*58b9f456SAndroid Build Coastguard Worker    }
313*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
314*58b9f456SAndroid Build Coastguard Worker    constexpr const value_type&& __get() const&& noexcept
315*58b9f456SAndroid Build Coastguard Worker    {
316*58b9f456SAndroid Build Coastguard Worker        return _VSTD::move(this->__val_);
317*58b9f456SAndroid Build Coastguard Worker    }
318*58b9f456SAndroid Build Coastguard Worker
319*58b9f456SAndroid Build Coastguard Worker    template <class... _Args>
320*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
321*58b9f456SAndroid Build Coastguard Worker    void __construct(_Args&&... __args)
322*58b9f456SAndroid Build Coastguard Worker    {
323*58b9f456SAndroid Build Coastguard Worker        _LIBCPP_ASSERT(!has_value(), "__construct called for engaged __optional_storage");
324*58b9f456SAndroid Build Coastguard Worker        ::new((void*)_VSTD::addressof(this->__val_)) value_type(_VSTD::forward<_Args>(__args)...);
325*58b9f456SAndroid Build Coastguard Worker        this->__engaged_ = true;
326*58b9f456SAndroid Build Coastguard Worker    }
327*58b9f456SAndroid Build Coastguard Worker
328*58b9f456SAndroid Build Coastguard Worker    template <class _That>
329*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
330*58b9f456SAndroid Build Coastguard Worker    void __construct_from(_That&& __opt)
331*58b9f456SAndroid Build Coastguard Worker    {
332*58b9f456SAndroid Build Coastguard Worker        if (__opt.has_value())
333*58b9f456SAndroid Build Coastguard Worker            __construct(_VSTD::forward<_That>(__opt).__get());
334*58b9f456SAndroid Build Coastguard Worker    }
335*58b9f456SAndroid Build Coastguard Worker
336*58b9f456SAndroid Build Coastguard Worker    template <class _That>
337*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
338*58b9f456SAndroid Build Coastguard Worker    void __assign_from(_That&& __opt)
339*58b9f456SAndroid Build Coastguard Worker    {
340*58b9f456SAndroid Build Coastguard Worker        if (this->__engaged_ == __opt.has_value())
341*58b9f456SAndroid Build Coastguard Worker        {
342*58b9f456SAndroid Build Coastguard Worker            if (this->__engaged_)
343*58b9f456SAndroid Build Coastguard Worker                this->__val_ = _VSTD::forward<_That>(__opt).__get();
344*58b9f456SAndroid Build Coastguard Worker        }
345*58b9f456SAndroid Build Coastguard Worker        else
346*58b9f456SAndroid Build Coastguard Worker        {
347*58b9f456SAndroid Build Coastguard Worker            if (this->__engaged_)
348*58b9f456SAndroid Build Coastguard Worker                this->reset();
349*58b9f456SAndroid Build Coastguard Worker            else
350*58b9f456SAndroid Build Coastguard Worker                __construct(_VSTD::forward<_That>(__opt).__get());
351*58b9f456SAndroid Build Coastguard Worker        }
352*58b9f456SAndroid Build Coastguard Worker    }
353*58b9f456SAndroid Build Coastguard Worker};
354*58b9f456SAndroid Build Coastguard Worker
355*58b9f456SAndroid Build Coastguard Worker// optional<T&> is currently required ill-formed, however it may to be in the
356*58b9f456SAndroid Build Coastguard Worker// future. For this reason it has already been implemented to ensure we can
357*58b9f456SAndroid Build Coastguard Worker// make the change in an ABI compatible manner.
358*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
359*58b9f456SAndroid Build Coastguard Workerstruct __optional_storage_base<_Tp, true>
360*58b9f456SAndroid Build Coastguard Worker{
361*58b9f456SAndroid Build Coastguard Worker    using value_type = _Tp;
362*58b9f456SAndroid Build Coastguard Worker    using __raw_type = remove_reference_t<_Tp>;
363*58b9f456SAndroid Build Coastguard Worker    __raw_type* __value_;
364*58b9f456SAndroid Build Coastguard Worker
365*58b9f456SAndroid Build Coastguard Worker    template <class _Up>
366*58b9f456SAndroid Build Coastguard Worker    static constexpr bool __can_bind_reference() {
367*58b9f456SAndroid Build Coastguard Worker        using _RawUp = typename remove_reference<_Up>::type;
368*58b9f456SAndroid Build Coastguard Worker        using _UpPtr = _RawUp*;
369*58b9f456SAndroid Build Coastguard Worker        using _RawTp = typename remove_reference<_Tp>::type;
370*58b9f456SAndroid Build Coastguard Worker        using _TpPtr = _RawTp*;
371*58b9f456SAndroid Build Coastguard Worker        using _CheckLValueArg = integral_constant<bool,
372*58b9f456SAndroid Build Coastguard Worker            (is_lvalue_reference<_Up>::value && is_convertible<_UpPtr, _TpPtr>::value)
373*58b9f456SAndroid Build Coastguard Worker        ||  is_same<_RawUp, reference_wrapper<_RawTp>>::value
374*58b9f456SAndroid Build Coastguard Worker        ||  is_same<_RawUp, reference_wrapper<typename remove_const<_RawTp>::type>>::value
375*58b9f456SAndroid Build Coastguard Worker        >;
376*58b9f456SAndroid Build Coastguard Worker        return (is_lvalue_reference<_Tp>::value && _CheckLValueArg::value)
377*58b9f456SAndroid Build Coastguard Worker            || (is_rvalue_reference<_Tp>::value && !is_lvalue_reference<_Up>::value &&
378*58b9f456SAndroid Build Coastguard Worker                is_convertible<_UpPtr, _TpPtr>::value);
379*58b9f456SAndroid Build Coastguard Worker    }
380*58b9f456SAndroid Build Coastguard Worker
381*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
382*58b9f456SAndroid Build Coastguard Worker    constexpr __optional_storage_base() noexcept
383*58b9f456SAndroid Build Coastguard Worker        :  __value_(nullptr) {}
384*58b9f456SAndroid Build Coastguard Worker
385*58b9f456SAndroid Build Coastguard Worker    template <class _UArg>
386*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
387*58b9f456SAndroid Build Coastguard Worker    constexpr explicit __optional_storage_base(in_place_t, _UArg&& __uarg)
388*58b9f456SAndroid Build Coastguard Worker        :  __value_(_VSTD::addressof(__uarg))
389*58b9f456SAndroid Build Coastguard Worker    {
390*58b9f456SAndroid Build Coastguard Worker      static_assert(__can_bind_reference<_UArg>(),
391*58b9f456SAndroid Build Coastguard Worker        "Attempted to construct a reference element in tuple from a "
392*58b9f456SAndroid Build Coastguard Worker        "possible temporary");
393*58b9f456SAndroid Build Coastguard Worker    }
394*58b9f456SAndroid Build Coastguard Worker
395*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
396*58b9f456SAndroid Build Coastguard Worker    void reset() noexcept { __value_ = nullptr; }
397*58b9f456SAndroid Build Coastguard Worker
398*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
399*58b9f456SAndroid Build Coastguard Worker    constexpr bool has_value() const noexcept
400*58b9f456SAndroid Build Coastguard Worker      { return __value_ != nullptr; }
401*58b9f456SAndroid Build Coastguard Worker
402*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
403*58b9f456SAndroid Build Coastguard Worker    constexpr value_type& __get() const& noexcept
404*58b9f456SAndroid Build Coastguard Worker      { return *__value_; }
405*58b9f456SAndroid Build Coastguard Worker
406*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
407*58b9f456SAndroid Build Coastguard Worker    constexpr value_type&& __get() const&& noexcept
408*58b9f456SAndroid Build Coastguard Worker      { return _VSTD::forward<value_type>(*__value_); }
409*58b9f456SAndroid Build Coastguard Worker
410*58b9f456SAndroid Build Coastguard Worker    template <class _UArg>
411*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
412*58b9f456SAndroid Build Coastguard Worker    void __construct(_UArg&& __val)
413*58b9f456SAndroid Build Coastguard Worker    {
414*58b9f456SAndroid Build Coastguard Worker        _LIBCPP_ASSERT(!has_value(), "__construct called for engaged __optional_storage");
415*58b9f456SAndroid Build Coastguard Worker        static_assert(__can_bind_reference<_UArg>(),
416*58b9f456SAndroid Build Coastguard Worker            "Attempted to construct a reference element in tuple from a "
417*58b9f456SAndroid Build Coastguard Worker            "possible temporary");
418*58b9f456SAndroid Build Coastguard Worker        __value_ = _VSTD::addressof(__val);
419*58b9f456SAndroid Build Coastguard Worker    }
420*58b9f456SAndroid Build Coastguard Worker
421*58b9f456SAndroid Build Coastguard Worker    template <class _That>
422*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
423*58b9f456SAndroid Build Coastguard Worker    void __construct_from(_That&& __opt)
424*58b9f456SAndroid Build Coastguard Worker    {
425*58b9f456SAndroid Build Coastguard Worker        if (__opt.has_value())
426*58b9f456SAndroid Build Coastguard Worker            __construct(_VSTD::forward<_That>(__opt).__get());
427*58b9f456SAndroid Build Coastguard Worker    }
428*58b9f456SAndroid Build Coastguard Worker
429*58b9f456SAndroid Build Coastguard Worker    template <class _That>
430*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
431*58b9f456SAndroid Build Coastguard Worker    void __assign_from(_That&& __opt)
432*58b9f456SAndroid Build Coastguard Worker    {
433*58b9f456SAndroid Build Coastguard Worker        if (has_value() == __opt.has_value())
434*58b9f456SAndroid Build Coastguard Worker        {
435*58b9f456SAndroid Build Coastguard Worker            if (has_value())
436*58b9f456SAndroid Build Coastguard Worker                *__value_ = _VSTD::forward<_That>(__opt).__get();
437*58b9f456SAndroid Build Coastguard Worker        }
438*58b9f456SAndroid Build Coastguard Worker        else
439*58b9f456SAndroid Build Coastguard Worker        {
440*58b9f456SAndroid Build Coastguard Worker            if (has_value())
441*58b9f456SAndroid Build Coastguard Worker                reset();
442*58b9f456SAndroid Build Coastguard Worker            else
443*58b9f456SAndroid Build Coastguard Worker                __construct(_VSTD::forward<_That>(__opt).__get());
444*58b9f456SAndroid Build Coastguard Worker        }
445*58b9f456SAndroid Build Coastguard Worker    }
446*58b9f456SAndroid Build Coastguard Worker};
447*58b9f456SAndroid Build Coastguard Worker
448*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, bool = is_trivially_copy_constructible<_Tp>::value>
449*58b9f456SAndroid Build Coastguard Workerstruct __optional_copy_base : __optional_storage_base<_Tp>
450*58b9f456SAndroid Build Coastguard Worker{
451*58b9f456SAndroid Build Coastguard Worker    using __optional_storage_base<_Tp>::__optional_storage_base;
452*58b9f456SAndroid Build Coastguard Worker};
453*58b9f456SAndroid Build Coastguard Worker
454*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
455*58b9f456SAndroid Build Coastguard Workerstruct __optional_copy_base<_Tp, false> : __optional_storage_base<_Tp>
456*58b9f456SAndroid Build Coastguard Worker{
457*58b9f456SAndroid Build Coastguard Worker    using __optional_storage_base<_Tp>::__optional_storage_base;
458*58b9f456SAndroid Build Coastguard Worker
459*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
460*58b9f456SAndroid Build Coastguard Worker    __optional_copy_base() = default;
461*58b9f456SAndroid Build Coastguard Worker
462*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
463*58b9f456SAndroid Build Coastguard Worker    __optional_copy_base(const __optional_copy_base& __opt)
464*58b9f456SAndroid Build Coastguard Worker    {
465*58b9f456SAndroid Build Coastguard Worker        this->__construct_from(__opt);
466*58b9f456SAndroid Build Coastguard Worker    }
467*58b9f456SAndroid Build Coastguard Worker
468*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
469*58b9f456SAndroid Build Coastguard Worker    __optional_copy_base(__optional_copy_base&&) = default;
470*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
471*58b9f456SAndroid Build Coastguard Worker    __optional_copy_base& operator=(const __optional_copy_base&) = default;
472*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
473*58b9f456SAndroid Build Coastguard Worker    __optional_copy_base& operator=(__optional_copy_base&&) = default;
474*58b9f456SAndroid Build Coastguard Worker};
475*58b9f456SAndroid Build Coastguard Worker
476*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, bool = is_trivially_move_constructible<_Tp>::value>
477*58b9f456SAndroid Build Coastguard Workerstruct __optional_move_base : __optional_copy_base<_Tp>
478*58b9f456SAndroid Build Coastguard Worker{
479*58b9f456SAndroid Build Coastguard Worker    using __optional_copy_base<_Tp>::__optional_copy_base;
480*58b9f456SAndroid Build Coastguard Worker};
481*58b9f456SAndroid Build Coastguard Worker
482*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
483*58b9f456SAndroid Build Coastguard Workerstruct __optional_move_base<_Tp, false> : __optional_copy_base<_Tp>
484*58b9f456SAndroid Build Coastguard Worker{
485*58b9f456SAndroid Build Coastguard Worker    using value_type = _Tp;
486*58b9f456SAndroid Build Coastguard Worker    using __optional_copy_base<_Tp>::__optional_copy_base;
487*58b9f456SAndroid Build Coastguard Worker
488*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
489*58b9f456SAndroid Build Coastguard Worker    __optional_move_base() = default;
490*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
491*58b9f456SAndroid Build Coastguard Worker    __optional_move_base(const __optional_move_base&) = default;
492*58b9f456SAndroid Build Coastguard Worker
493*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
494*58b9f456SAndroid Build Coastguard Worker    __optional_move_base(__optional_move_base&& __opt)
495*58b9f456SAndroid Build Coastguard Worker        noexcept(is_nothrow_move_constructible_v<value_type>)
496*58b9f456SAndroid Build Coastguard Worker    {
497*58b9f456SAndroid Build Coastguard Worker        this->__construct_from(_VSTD::move(__opt));
498*58b9f456SAndroid Build Coastguard Worker    }
499*58b9f456SAndroid Build Coastguard Worker
500*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
501*58b9f456SAndroid Build Coastguard Worker    __optional_move_base& operator=(const __optional_move_base&) = default;
502*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
503*58b9f456SAndroid Build Coastguard Worker    __optional_move_base& operator=(__optional_move_base&&) = default;
504*58b9f456SAndroid Build Coastguard Worker};
505*58b9f456SAndroid Build Coastguard Worker
506*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, bool =
507*58b9f456SAndroid Build Coastguard Worker    is_trivially_destructible<_Tp>::value &&
508*58b9f456SAndroid Build Coastguard Worker    is_trivially_copy_constructible<_Tp>::value &&
509*58b9f456SAndroid Build Coastguard Worker    is_trivially_copy_assignable<_Tp>::value>
510*58b9f456SAndroid Build Coastguard Workerstruct __optional_copy_assign_base : __optional_move_base<_Tp>
511*58b9f456SAndroid Build Coastguard Worker{
512*58b9f456SAndroid Build Coastguard Worker    using __optional_move_base<_Tp>::__optional_move_base;
513*58b9f456SAndroid Build Coastguard Worker};
514*58b9f456SAndroid Build Coastguard Worker
515*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
516*58b9f456SAndroid Build Coastguard Workerstruct __optional_copy_assign_base<_Tp, false> : __optional_move_base<_Tp>
517*58b9f456SAndroid Build Coastguard Worker{
518*58b9f456SAndroid Build Coastguard Worker    using __optional_move_base<_Tp>::__optional_move_base;
519*58b9f456SAndroid Build Coastguard Worker
520*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
521*58b9f456SAndroid Build Coastguard Worker    __optional_copy_assign_base() = default;
522*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
523*58b9f456SAndroid Build Coastguard Worker    __optional_copy_assign_base(const __optional_copy_assign_base&) = default;
524*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
525*58b9f456SAndroid Build Coastguard Worker    __optional_copy_assign_base(__optional_copy_assign_base&&) = default;
526*58b9f456SAndroid Build Coastguard Worker
527*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
528*58b9f456SAndroid Build Coastguard Worker    __optional_copy_assign_base& operator=(const __optional_copy_assign_base& __opt)
529*58b9f456SAndroid Build Coastguard Worker    {
530*58b9f456SAndroid Build Coastguard Worker        this->__assign_from(__opt);
531*58b9f456SAndroid Build Coastguard Worker        return *this;
532*58b9f456SAndroid Build Coastguard Worker    }
533*58b9f456SAndroid Build Coastguard Worker
534*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
535*58b9f456SAndroid Build Coastguard Worker    __optional_copy_assign_base& operator=(__optional_copy_assign_base&&) = default;
536*58b9f456SAndroid Build Coastguard Worker};
537*58b9f456SAndroid Build Coastguard Worker
538*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, bool =
539*58b9f456SAndroid Build Coastguard Worker    is_trivially_destructible<_Tp>::value &&
540*58b9f456SAndroid Build Coastguard Worker    is_trivially_move_constructible<_Tp>::value &&
541*58b9f456SAndroid Build Coastguard Worker    is_trivially_move_assignable<_Tp>::value>
542*58b9f456SAndroid Build Coastguard Workerstruct __optional_move_assign_base : __optional_copy_assign_base<_Tp>
543*58b9f456SAndroid Build Coastguard Worker{
544*58b9f456SAndroid Build Coastguard Worker    using __optional_copy_assign_base<_Tp>::__optional_copy_assign_base;
545*58b9f456SAndroid Build Coastguard Worker};
546*58b9f456SAndroid Build Coastguard Worker
547*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
548*58b9f456SAndroid Build Coastguard Workerstruct __optional_move_assign_base<_Tp, false> : __optional_copy_assign_base<_Tp>
549*58b9f456SAndroid Build Coastguard Worker{
550*58b9f456SAndroid Build Coastguard Worker    using value_type = _Tp;
551*58b9f456SAndroid Build Coastguard Worker    using __optional_copy_assign_base<_Tp>::__optional_copy_assign_base;
552*58b9f456SAndroid Build Coastguard Worker
553*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
554*58b9f456SAndroid Build Coastguard Worker    __optional_move_assign_base() = default;
555*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
556*58b9f456SAndroid Build Coastguard Worker    __optional_move_assign_base(const __optional_move_assign_base& __opt) = default;
557*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
558*58b9f456SAndroid Build Coastguard Worker    __optional_move_assign_base(__optional_move_assign_base&&) = default;
559*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
560*58b9f456SAndroid Build Coastguard Worker    __optional_move_assign_base& operator=(const __optional_move_assign_base&) = default;
561*58b9f456SAndroid Build Coastguard Worker
562*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
563*58b9f456SAndroid Build Coastguard Worker    __optional_move_assign_base& operator=(__optional_move_assign_base&& __opt)
564*58b9f456SAndroid Build Coastguard Worker        noexcept(is_nothrow_move_assignable_v<value_type> &&
565*58b9f456SAndroid Build Coastguard Worker                 is_nothrow_move_constructible_v<value_type>)
566*58b9f456SAndroid Build Coastguard Worker    {
567*58b9f456SAndroid Build Coastguard Worker        this->__assign_from(_VSTD::move(__opt));
568*58b9f456SAndroid Build Coastguard Worker        return *this;
569*58b9f456SAndroid Build Coastguard Worker    }
570*58b9f456SAndroid Build Coastguard Worker};
571*58b9f456SAndroid Build Coastguard Worker
572*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
573*58b9f456SAndroid Build Coastguard Workerusing __optional_sfinae_ctor_base_t = __sfinae_ctor_base<
574*58b9f456SAndroid Build Coastguard Worker    is_copy_constructible<_Tp>::value,
575*58b9f456SAndroid Build Coastguard Worker    is_move_constructible<_Tp>::value
576*58b9f456SAndroid Build Coastguard Worker>;
577*58b9f456SAndroid Build Coastguard Worker
578*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
579*58b9f456SAndroid Build Coastguard Workerusing __optional_sfinae_assign_base_t = __sfinae_assign_base<
580*58b9f456SAndroid Build Coastguard Worker    (is_copy_constructible<_Tp>::value && is_copy_assignable<_Tp>::value),
581*58b9f456SAndroid Build Coastguard Worker    (is_move_constructible<_Tp>::value && is_move_assignable<_Tp>::value)
582*58b9f456SAndroid Build Coastguard Worker>;
583*58b9f456SAndroid Build Coastguard Worker
584*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
585*58b9f456SAndroid Build Coastguard Workerclass optional
586*58b9f456SAndroid Build Coastguard Worker    : private __optional_move_assign_base<_Tp>
587*58b9f456SAndroid Build Coastguard Worker    , private __optional_sfinae_ctor_base_t<_Tp>
588*58b9f456SAndroid Build Coastguard Worker    , private __optional_sfinae_assign_base_t<_Tp>
589*58b9f456SAndroid Build Coastguard Worker{
590*58b9f456SAndroid Build Coastguard Worker    using __base = __optional_move_assign_base<_Tp>;
591*58b9f456SAndroid Build Coastguard Workerpublic:
592*58b9f456SAndroid Build Coastguard Worker    using value_type = _Tp;
593*58b9f456SAndroid Build Coastguard Worker
594*58b9f456SAndroid Build Coastguard Workerprivate:
595*58b9f456SAndroid Build Coastguard Worker     // Disable the reference extension using this static assert.
596*58b9f456SAndroid Build Coastguard Worker    static_assert(!is_same_v<value_type, in_place_t>,
597*58b9f456SAndroid Build Coastguard Worker        "instantiation of optional with in_place_t is ill-formed");
598*58b9f456SAndroid Build Coastguard Worker    static_assert(!is_same_v<__uncvref_t<value_type>, nullopt_t>,
599*58b9f456SAndroid Build Coastguard Worker        "instantiation of optional with nullopt_t is ill-formed");
600*58b9f456SAndroid Build Coastguard Worker    static_assert(!is_reference_v<value_type>,
601*58b9f456SAndroid Build Coastguard Worker        "instantiation of optional with a reference type is ill-formed");
602*58b9f456SAndroid Build Coastguard Worker    static_assert(is_destructible_v<value_type>,
603*58b9f456SAndroid Build Coastguard Worker        "instantiation of optional with a non-destructible type is ill-formed");
604*58b9f456SAndroid Build Coastguard Worker
605*58b9f456SAndroid Build Coastguard Worker    // LWG2756: conditionally explicit conversion from _Up
606*58b9f456SAndroid Build Coastguard Worker    struct _CheckOptionalArgsConstructor {
607*58b9f456SAndroid Build Coastguard Worker      template <class _Up>
608*58b9f456SAndroid Build Coastguard Worker      static constexpr bool __enable_implicit() {
609*58b9f456SAndroid Build Coastguard Worker          return is_constructible_v<_Tp, _Up&&> &&
610*58b9f456SAndroid Build Coastguard Worker                 is_convertible_v<_Up&&, _Tp>;
611*58b9f456SAndroid Build Coastguard Worker      }
612*58b9f456SAndroid Build Coastguard Worker
613*58b9f456SAndroid Build Coastguard Worker      template <class _Up>
614*58b9f456SAndroid Build Coastguard Worker      static constexpr bool __enable_explicit() {
615*58b9f456SAndroid Build Coastguard Worker          return is_constructible_v<_Tp, _Up&&> &&
616*58b9f456SAndroid Build Coastguard Worker                 !is_convertible_v<_Up&&, _Tp>;
617*58b9f456SAndroid Build Coastguard Worker      }
618*58b9f456SAndroid Build Coastguard Worker    };
619*58b9f456SAndroid Build Coastguard Worker    template <class _Up>
620*58b9f456SAndroid Build Coastguard Worker    using _CheckOptionalArgsCtor = conditional_t<
621*58b9f456SAndroid Build Coastguard Worker        !is_same_v<__uncvref_t<_Up>, in_place_t> &&
622*58b9f456SAndroid Build Coastguard Worker        !is_same_v<__uncvref_t<_Up>, optional>,
623*58b9f456SAndroid Build Coastguard Worker        _CheckOptionalArgsConstructor,
624*58b9f456SAndroid Build Coastguard Worker        __check_tuple_constructor_fail
625*58b9f456SAndroid Build Coastguard Worker    >;
626*58b9f456SAndroid Build Coastguard Worker    template <class _QualUp>
627*58b9f456SAndroid Build Coastguard Worker    struct _CheckOptionalLikeConstructor {
628*58b9f456SAndroid Build Coastguard Worker      template <class _Up, class _Opt = optional<_Up>>
629*58b9f456SAndroid Build Coastguard Worker      using __check_constructible_from_opt = __lazy_or<
630*58b9f456SAndroid Build Coastguard Worker          is_constructible<_Tp, _Opt&>,
631*58b9f456SAndroid Build Coastguard Worker          is_constructible<_Tp, _Opt const&>,
632*58b9f456SAndroid Build Coastguard Worker          is_constructible<_Tp, _Opt&&>,
633*58b9f456SAndroid Build Coastguard Worker          is_constructible<_Tp, _Opt const&&>,
634*58b9f456SAndroid Build Coastguard Worker          is_convertible<_Opt&, _Tp>,
635*58b9f456SAndroid Build Coastguard Worker          is_convertible<_Opt const&, _Tp>,
636*58b9f456SAndroid Build Coastguard Worker          is_convertible<_Opt&&, _Tp>,
637*58b9f456SAndroid Build Coastguard Worker          is_convertible<_Opt const&&, _Tp>
638*58b9f456SAndroid Build Coastguard Worker      >;
639*58b9f456SAndroid Build Coastguard Worker      template <class _Up, class _Opt = optional<_Up>>
640*58b9f456SAndroid Build Coastguard Worker      using __check_assignable_from_opt = __lazy_or<
641*58b9f456SAndroid Build Coastguard Worker          is_assignable<_Tp&, _Opt&>,
642*58b9f456SAndroid Build Coastguard Worker          is_assignable<_Tp&, _Opt const&>,
643*58b9f456SAndroid Build Coastguard Worker          is_assignable<_Tp&, _Opt&&>,
644*58b9f456SAndroid Build Coastguard Worker          is_assignable<_Tp&, _Opt const&&>
645*58b9f456SAndroid Build Coastguard Worker      >;
646*58b9f456SAndroid Build Coastguard Worker      template <class _Up, class _QUp = _QualUp>
647*58b9f456SAndroid Build Coastguard Worker      static constexpr bool __enable_implicit() {
648*58b9f456SAndroid Build Coastguard Worker          return is_convertible<_QUp, _Tp>::value &&
649*58b9f456SAndroid Build Coastguard Worker              !__check_constructible_from_opt<_Up>::value;
650*58b9f456SAndroid Build Coastguard Worker      }
651*58b9f456SAndroid Build Coastguard Worker      template <class _Up, class _QUp = _QualUp>
652*58b9f456SAndroid Build Coastguard Worker      static constexpr bool __enable_explicit() {
653*58b9f456SAndroid Build Coastguard Worker          return !is_convertible<_QUp, _Tp>::value &&
654*58b9f456SAndroid Build Coastguard Worker              !__check_constructible_from_opt<_Up>::value;
655*58b9f456SAndroid Build Coastguard Worker      }
656*58b9f456SAndroid Build Coastguard Worker      template <class _Up, class _QUp = _QualUp>
657*58b9f456SAndroid Build Coastguard Worker      static constexpr bool __enable_assign() {
658*58b9f456SAndroid Build Coastguard Worker          // Construction and assignability of _Qup to _Tp has already been
659*58b9f456SAndroid Build Coastguard Worker          // checked.
660*58b9f456SAndroid Build Coastguard Worker          return !__check_constructible_from_opt<_Up>::value &&
661*58b9f456SAndroid Build Coastguard Worker              !__check_assignable_from_opt<_Up>::value;
662*58b9f456SAndroid Build Coastguard Worker      }
663*58b9f456SAndroid Build Coastguard Worker    };
664*58b9f456SAndroid Build Coastguard Worker
665*58b9f456SAndroid Build Coastguard Worker    template <class _Up, class _QualUp>
666*58b9f456SAndroid Build Coastguard Worker    using _CheckOptionalLikeCtor = conditional_t<
667*58b9f456SAndroid Build Coastguard Worker      __lazy_and<
668*58b9f456SAndroid Build Coastguard Worker          __lazy_not<is_same<_Up, _Tp>>,
669*58b9f456SAndroid Build Coastguard Worker          is_constructible<_Tp, _QualUp>
670*58b9f456SAndroid Build Coastguard Worker      >::value,
671*58b9f456SAndroid Build Coastguard Worker      _CheckOptionalLikeConstructor<_QualUp>,
672*58b9f456SAndroid Build Coastguard Worker      __check_tuple_constructor_fail
673*58b9f456SAndroid Build Coastguard Worker    >;
674*58b9f456SAndroid Build Coastguard Worker    template <class _Up, class _QualUp>
675*58b9f456SAndroid Build Coastguard Worker    using _CheckOptionalLikeAssign = conditional_t<
676*58b9f456SAndroid Build Coastguard Worker      __lazy_and<
677*58b9f456SAndroid Build Coastguard Worker          __lazy_not<is_same<_Up, _Tp>>,
678*58b9f456SAndroid Build Coastguard Worker          is_constructible<_Tp, _QualUp>,
679*58b9f456SAndroid Build Coastguard Worker          is_assignable<_Tp&, _QualUp>
680*58b9f456SAndroid Build Coastguard Worker      >::value,
681*58b9f456SAndroid Build Coastguard Worker      _CheckOptionalLikeConstructor<_QualUp>,
682*58b9f456SAndroid Build Coastguard Worker      __check_tuple_constructor_fail
683*58b9f456SAndroid Build Coastguard Worker    >;
684*58b9f456SAndroid Build Coastguard Workerpublic:
685*58b9f456SAndroid Build Coastguard Worker
686*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY constexpr optional() noexcept {}
687*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY constexpr optional(const optional&) = default;
688*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY constexpr optional(optional&&) = default;
689*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY constexpr optional(nullopt_t) noexcept {}
690*58b9f456SAndroid Build Coastguard Worker
691*58b9f456SAndroid Build Coastguard Worker    template <class... _Args, class = enable_if_t<
692*58b9f456SAndroid Build Coastguard Worker        is_constructible_v<value_type, _Args...>>
693*58b9f456SAndroid Build Coastguard Worker    >
694*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
695*58b9f456SAndroid Build Coastguard Worker    constexpr explicit optional(in_place_t, _Args&&... __args)
696*58b9f456SAndroid Build Coastguard Worker        : __base(in_place, _VSTD::forward<_Args>(__args)...) {}
697*58b9f456SAndroid Build Coastguard Worker
698*58b9f456SAndroid Build Coastguard Worker    template <class _Up, class... _Args, class = enable_if_t<
699*58b9f456SAndroid Build Coastguard Worker        is_constructible_v<value_type, initializer_list<_Up>&, _Args...>>
700*58b9f456SAndroid Build Coastguard Worker    >
701*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
702*58b9f456SAndroid Build Coastguard Worker    constexpr explicit optional(in_place_t, initializer_list<_Up> __il, _Args&&... __args)
703*58b9f456SAndroid Build Coastguard Worker        : __base(in_place, __il, _VSTD::forward<_Args>(__args)...) {}
704*58b9f456SAndroid Build Coastguard Worker
705*58b9f456SAndroid Build Coastguard Worker    template <class _Up = value_type, enable_if_t<
706*58b9f456SAndroid Build Coastguard Worker        _CheckOptionalArgsCtor<_Up>::template __enable_implicit<_Up>()
707*58b9f456SAndroid Build Coastguard Worker    , int> = 0>
708*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
709*58b9f456SAndroid Build Coastguard Worker    constexpr optional(_Up&& __v)
710*58b9f456SAndroid Build Coastguard Worker        : __base(in_place, _VSTD::forward<_Up>(__v)) {}
711*58b9f456SAndroid Build Coastguard Worker
712*58b9f456SAndroid Build Coastguard Worker    template <class _Up, enable_if_t<
713*58b9f456SAndroid Build Coastguard Worker        _CheckOptionalArgsCtor<_Up>::template __enable_explicit<_Up>()
714*58b9f456SAndroid Build Coastguard Worker    , int> = 0>
715*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
716*58b9f456SAndroid Build Coastguard Worker    constexpr explicit optional(_Up&& __v)
717*58b9f456SAndroid Build Coastguard Worker        : __base(in_place, _VSTD::forward<_Up>(__v)) {}
718*58b9f456SAndroid Build Coastguard Worker
719*58b9f456SAndroid Build Coastguard Worker    // LWG2756: conditionally explicit conversion from const optional<_Up>&
720*58b9f456SAndroid Build Coastguard Worker    template <class _Up, enable_if_t<
721*58b9f456SAndroid Build Coastguard Worker        _CheckOptionalLikeCtor<_Up, _Up const&>::template __enable_implicit<_Up>()
722*58b9f456SAndroid Build Coastguard Worker    , int> = 0>
723*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
724*58b9f456SAndroid Build Coastguard Worker    optional(const optional<_Up>& __v)
725*58b9f456SAndroid Build Coastguard Worker    {
726*58b9f456SAndroid Build Coastguard Worker        this->__construct_from(__v);
727*58b9f456SAndroid Build Coastguard Worker    }
728*58b9f456SAndroid Build Coastguard Worker    template <class _Up, enable_if_t<
729*58b9f456SAndroid Build Coastguard Worker        _CheckOptionalLikeCtor<_Up, _Up const&>::template __enable_explicit<_Up>()
730*58b9f456SAndroid Build Coastguard Worker    , int> = 0>
731*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
732*58b9f456SAndroid Build Coastguard Worker    explicit optional(const optional<_Up>& __v)
733*58b9f456SAndroid Build Coastguard Worker    {
734*58b9f456SAndroid Build Coastguard Worker        this->__construct_from(__v);
735*58b9f456SAndroid Build Coastguard Worker    }
736*58b9f456SAndroid Build Coastguard Worker
737*58b9f456SAndroid Build Coastguard Worker    // LWG2756: conditionally explicit conversion from optional<_Up>&&
738*58b9f456SAndroid Build Coastguard Worker    template <class _Up, enable_if_t<
739*58b9f456SAndroid Build Coastguard Worker        _CheckOptionalLikeCtor<_Up, _Up &&>::template __enable_implicit<_Up>()
740*58b9f456SAndroid Build Coastguard Worker    , int> = 0>
741*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
742*58b9f456SAndroid Build Coastguard Worker    optional(optional<_Up>&& __v)
743*58b9f456SAndroid Build Coastguard Worker    {
744*58b9f456SAndroid Build Coastguard Worker        this->__construct_from(_VSTD::move(__v));
745*58b9f456SAndroid Build Coastguard Worker    }
746*58b9f456SAndroid Build Coastguard Worker    template <class _Up, enable_if_t<
747*58b9f456SAndroid Build Coastguard Worker        _CheckOptionalLikeCtor<_Up, _Up &&>::template __enable_explicit<_Up>()
748*58b9f456SAndroid Build Coastguard Worker    , int> = 0>
749*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
750*58b9f456SAndroid Build Coastguard Worker    explicit optional(optional<_Up>&& __v)
751*58b9f456SAndroid Build Coastguard Worker    {
752*58b9f456SAndroid Build Coastguard Worker        this->__construct_from(_VSTD::move(__v));
753*58b9f456SAndroid Build Coastguard Worker    }
754*58b9f456SAndroid Build Coastguard Worker
755*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
756*58b9f456SAndroid Build Coastguard Worker    optional& operator=(nullopt_t) noexcept
757*58b9f456SAndroid Build Coastguard Worker    {
758*58b9f456SAndroid Build Coastguard Worker        reset();
759*58b9f456SAndroid Build Coastguard Worker        return *this;
760*58b9f456SAndroid Build Coastguard Worker    }
761*58b9f456SAndroid Build Coastguard Worker
762*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY optional& operator=(const optional&) = default;
763*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY optional& operator=(optional&&) = default;
764*58b9f456SAndroid Build Coastguard Worker
765*58b9f456SAndroid Build Coastguard Worker    // LWG2756
766*58b9f456SAndroid Build Coastguard Worker    template <class _Up = value_type,
767*58b9f456SAndroid Build Coastguard Worker              class = enable_if_t
768*58b9f456SAndroid Build Coastguard Worker                      <__lazy_and<
769*58b9f456SAndroid Build Coastguard Worker                          integral_constant<bool,
770*58b9f456SAndroid Build Coastguard Worker                              !is_same_v<__uncvref_t<_Up>, optional> &&
771*58b9f456SAndroid Build Coastguard Worker                              !(is_same_v<_Up, value_type> && is_scalar_v<value_type>)
772*58b9f456SAndroid Build Coastguard Worker                          >,
773*58b9f456SAndroid Build Coastguard Worker                          is_constructible<value_type, _Up>,
774*58b9f456SAndroid Build Coastguard Worker                          is_assignable<value_type&, _Up>
775*58b9f456SAndroid Build Coastguard Worker                      >::value>
776*58b9f456SAndroid Build Coastguard Worker             >
777*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
778*58b9f456SAndroid Build Coastguard Worker    optional&
779*58b9f456SAndroid Build Coastguard Worker    operator=(_Up&& __v)
780*58b9f456SAndroid Build Coastguard Worker    {
781*58b9f456SAndroid Build Coastguard Worker        if (this->has_value())
782*58b9f456SAndroid Build Coastguard Worker            this->__get() = _VSTD::forward<_Up>(__v);
783*58b9f456SAndroid Build Coastguard Worker        else
784*58b9f456SAndroid Build Coastguard Worker            this->__construct(_VSTD::forward<_Up>(__v));
785*58b9f456SAndroid Build Coastguard Worker        return *this;
786*58b9f456SAndroid Build Coastguard Worker    }
787*58b9f456SAndroid Build Coastguard Worker
788*58b9f456SAndroid Build Coastguard Worker    // LWG2756
789*58b9f456SAndroid Build Coastguard Worker    template <class _Up, enable_if_t<
790*58b9f456SAndroid Build Coastguard Worker        _CheckOptionalLikeAssign<_Up, _Up const&>::template __enable_assign<_Up>()
791*58b9f456SAndroid Build Coastguard Worker    , int> = 0>
792*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
793*58b9f456SAndroid Build Coastguard Worker    optional&
794*58b9f456SAndroid Build Coastguard Worker    operator=(const optional<_Up>& __v)
795*58b9f456SAndroid Build Coastguard Worker    {
796*58b9f456SAndroid Build Coastguard Worker        this->__assign_from(__v);
797*58b9f456SAndroid Build Coastguard Worker        return *this;
798*58b9f456SAndroid Build Coastguard Worker    }
799*58b9f456SAndroid Build Coastguard Worker
800*58b9f456SAndroid Build Coastguard Worker    // LWG2756
801*58b9f456SAndroid Build Coastguard Worker    template <class _Up, enable_if_t<
802*58b9f456SAndroid Build Coastguard Worker        _CheckOptionalLikeCtor<_Up, _Up &&>::template __enable_assign<_Up>()
803*58b9f456SAndroid Build Coastguard Worker    , int> = 0>
804*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
805*58b9f456SAndroid Build Coastguard Worker    optional&
806*58b9f456SAndroid Build Coastguard Worker    operator=(optional<_Up>&& __v)
807*58b9f456SAndroid Build Coastguard Worker    {
808*58b9f456SAndroid Build Coastguard Worker        this->__assign_from(_VSTD::move(__v));
809*58b9f456SAndroid Build Coastguard Worker        return *this;
810*58b9f456SAndroid Build Coastguard Worker    }
811*58b9f456SAndroid Build Coastguard Worker
812*58b9f456SAndroid Build Coastguard Worker    template <class... _Args,
813*58b9f456SAndroid Build Coastguard Worker              class = enable_if_t
814*58b9f456SAndroid Build Coastguard Worker                      <
815*58b9f456SAndroid Build Coastguard Worker                          is_constructible_v<value_type, _Args...>
816*58b9f456SAndroid Build Coastguard Worker                      >
817*58b9f456SAndroid Build Coastguard Worker             >
818*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
819*58b9f456SAndroid Build Coastguard Worker    _Tp &
820*58b9f456SAndroid Build Coastguard Worker    emplace(_Args&&... __args)
821*58b9f456SAndroid Build Coastguard Worker    {
822*58b9f456SAndroid Build Coastguard Worker        reset();
823*58b9f456SAndroid Build Coastguard Worker        this->__construct(_VSTD::forward<_Args>(__args)...);
824*58b9f456SAndroid Build Coastguard Worker        return this->__get();
825*58b9f456SAndroid Build Coastguard Worker    }
826*58b9f456SAndroid Build Coastguard Worker
827*58b9f456SAndroid Build Coastguard Worker    template <class _Up, class... _Args,
828*58b9f456SAndroid Build Coastguard Worker              class = enable_if_t
829*58b9f456SAndroid Build Coastguard Worker                      <
830*58b9f456SAndroid Build Coastguard Worker                          is_constructible_v<value_type, initializer_list<_Up>&, _Args...>
831*58b9f456SAndroid Build Coastguard Worker                      >
832*58b9f456SAndroid Build Coastguard Worker             >
833*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
834*58b9f456SAndroid Build Coastguard Worker    _Tp &
835*58b9f456SAndroid Build Coastguard Worker    emplace(initializer_list<_Up> __il, _Args&&... __args)
836*58b9f456SAndroid Build Coastguard Worker    {
837*58b9f456SAndroid Build Coastguard Worker        reset();
838*58b9f456SAndroid Build Coastguard Worker        this->__construct(__il, _VSTD::forward<_Args>(__args)...);
839*58b9f456SAndroid Build Coastguard Worker        return this->__get();
840*58b9f456SAndroid Build Coastguard Worker    }
841*58b9f456SAndroid Build Coastguard Worker
842*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
843*58b9f456SAndroid Build Coastguard Worker    void swap(optional& __opt)
844*58b9f456SAndroid Build Coastguard Worker        noexcept(is_nothrow_move_constructible_v<value_type> &&
845*58b9f456SAndroid Build Coastguard Worker                 is_nothrow_swappable_v<value_type>)
846*58b9f456SAndroid Build Coastguard Worker    {
847*58b9f456SAndroid Build Coastguard Worker        if (this->has_value() == __opt.has_value())
848*58b9f456SAndroid Build Coastguard Worker        {
849*58b9f456SAndroid Build Coastguard Worker            using _VSTD::swap;
850*58b9f456SAndroid Build Coastguard Worker            if (this->has_value())
851*58b9f456SAndroid Build Coastguard Worker                swap(this->__get(), __opt.__get());
852*58b9f456SAndroid Build Coastguard Worker        }
853*58b9f456SAndroid Build Coastguard Worker        else
854*58b9f456SAndroid Build Coastguard Worker        {
855*58b9f456SAndroid Build Coastguard Worker            if (this->has_value())
856*58b9f456SAndroid Build Coastguard Worker            {
857*58b9f456SAndroid Build Coastguard Worker                __opt.__construct(_VSTD::move(this->__get()));
858*58b9f456SAndroid Build Coastguard Worker                reset();
859*58b9f456SAndroid Build Coastguard Worker            }
860*58b9f456SAndroid Build Coastguard Worker            else
861*58b9f456SAndroid Build Coastguard Worker            {
862*58b9f456SAndroid Build Coastguard Worker                this->__construct(_VSTD::move(__opt.__get()));
863*58b9f456SAndroid Build Coastguard Worker                __opt.reset();
864*58b9f456SAndroid Build Coastguard Worker            }
865*58b9f456SAndroid Build Coastguard Worker        }
866*58b9f456SAndroid Build Coastguard Worker    }
867*58b9f456SAndroid Build Coastguard Worker
868*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
869*58b9f456SAndroid Build Coastguard Worker    constexpr
870*58b9f456SAndroid Build Coastguard Worker    add_pointer_t<value_type const>
871*58b9f456SAndroid Build Coastguard Worker    operator->() const
872*58b9f456SAndroid Build Coastguard Worker    {
873*58b9f456SAndroid Build Coastguard Worker        _LIBCPP_ASSERT(this->has_value(), "optional operator-> called for disengaged value");
874*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_HAS_NO_BUILTIN_ADDRESSOF
875*58b9f456SAndroid Build Coastguard Worker        return _VSTD::addressof(this->__get());
876*58b9f456SAndroid Build Coastguard Worker#else
877*58b9f456SAndroid Build Coastguard Worker        return __operator_arrow(__has_operator_addressof<value_type>{}, this->__get());
878*58b9f456SAndroid Build Coastguard Worker#endif
879*58b9f456SAndroid Build Coastguard Worker    }
880*58b9f456SAndroid Build Coastguard Worker
881*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
882*58b9f456SAndroid Build Coastguard Worker    constexpr
883*58b9f456SAndroid Build Coastguard Worker    add_pointer_t<value_type>
884*58b9f456SAndroid Build Coastguard Worker    operator->()
885*58b9f456SAndroid Build Coastguard Worker    {
886*58b9f456SAndroid Build Coastguard Worker        _LIBCPP_ASSERT(this->has_value(), "optional operator-> called for disengaged value");
887*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_HAS_NO_BUILTIN_ADDRESSOF
888*58b9f456SAndroid Build Coastguard Worker        return _VSTD::addressof(this->__get());
889*58b9f456SAndroid Build Coastguard Worker#else
890*58b9f456SAndroid Build Coastguard Worker        return __operator_arrow(__has_operator_addressof<value_type>{}, this->__get());
891*58b9f456SAndroid Build Coastguard Worker#endif
892*58b9f456SAndroid Build Coastguard Worker    }
893*58b9f456SAndroid Build Coastguard Worker
894*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
895*58b9f456SAndroid Build Coastguard Worker    constexpr
896*58b9f456SAndroid Build Coastguard Worker    const value_type&
897*58b9f456SAndroid Build Coastguard Worker    operator*() const&
898*58b9f456SAndroid Build Coastguard Worker    {
899*58b9f456SAndroid Build Coastguard Worker        _LIBCPP_ASSERT(this->has_value(), "optional operator* called for disengaged value");
900*58b9f456SAndroid Build Coastguard Worker        return this->__get();
901*58b9f456SAndroid Build Coastguard Worker    }
902*58b9f456SAndroid Build Coastguard Worker
903*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
904*58b9f456SAndroid Build Coastguard Worker    constexpr
905*58b9f456SAndroid Build Coastguard Worker    value_type&
906*58b9f456SAndroid Build Coastguard Worker    operator*() &
907*58b9f456SAndroid Build Coastguard Worker    {
908*58b9f456SAndroid Build Coastguard Worker        _LIBCPP_ASSERT(this->has_value(), "optional operator* called for disengaged value");
909*58b9f456SAndroid Build Coastguard Worker        return this->__get();
910*58b9f456SAndroid Build Coastguard Worker    }
911*58b9f456SAndroid Build Coastguard Worker
912*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
913*58b9f456SAndroid Build Coastguard Worker    constexpr
914*58b9f456SAndroid Build Coastguard Worker    value_type&&
915*58b9f456SAndroid Build Coastguard Worker    operator*() &&
916*58b9f456SAndroid Build Coastguard Worker    {
917*58b9f456SAndroid Build Coastguard Worker        _LIBCPP_ASSERT(this->has_value(), "optional operator* called for disengaged value");
918*58b9f456SAndroid Build Coastguard Worker        return _VSTD::move(this->__get());
919*58b9f456SAndroid Build Coastguard Worker    }
920*58b9f456SAndroid Build Coastguard Worker
921*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
922*58b9f456SAndroid Build Coastguard Worker    constexpr
923*58b9f456SAndroid Build Coastguard Worker    const value_type&&
924*58b9f456SAndroid Build Coastguard Worker    operator*() const&&
925*58b9f456SAndroid Build Coastguard Worker    {
926*58b9f456SAndroid Build Coastguard Worker        _LIBCPP_ASSERT(this->has_value(), "optional operator* called for disengaged value");
927*58b9f456SAndroid Build Coastguard Worker        return _VSTD::move(this->__get());
928*58b9f456SAndroid Build Coastguard Worker    }
929*58b9f456SAndroid Build Coastguard Worker
930*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
931*58b9f456SAndroid Build Coastguard Worker    constexpr explicit operator bool() const noexcept { return has_value(); }
932*58b9f456SAndroid Build Coastguard Worker
933*58b9f456SAndroid Build Coastguard Worker    using __base::has_value;
934*58b9f456SAndroid Build Coastguard Worker    using __base::__get;
935*58b9f456SAndroid Build Coastguard Worker
936*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
937*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_AVAILABILITY_THROW_BAD_OPTIONAL_ACCESS
938*58b9f456SAndroid Build Coastguard Worker    constexpr value_type const& value() const&
939*58b9f456SAndroid Build Coastguard Worker    {
940*58b9f456SAndroid Build Coastguard Worker        if (!this->has_value())
941*58b9f456SAndroid Build Coastguard Worker            __throw_bad_optional_access();
942*58b9f456SAndroid Build Coastguard Worker        return this->__get();
943*58b9f456SAndroid Build Coastguard Worker    }
944*58b9f456SAndroid Build Coastguard Worker
945*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
946*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_AVAILABILITY_THROW_BAD_OPTIONAL_ACCESS
947*58b9f456SAndroid Build Coastguard Worker    constexpr value_type& value() &
948*58b9f456SAndroid Build Coastguard Worker    {
949*58b9f456SAndroid Build Coastguard Worker        if (!this->has_value())
950*58b9f456SAndroid Build Coastguard Worker            __throw_bad_optional_access();
951*58b9f456SAndroid Build Coastguard Worker        return this->__get();
952*58b9f456SAndroid Build Coastguard Worker    }
953*58b9f456SAndroid Build Coastguard Worker
954*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
955*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_AVAILABILITY_THROW_BAD_OPTIONAL_ACCESS
956*58b9f456SAndroid Build Coastguard Worker    constexpr value_type&& value() &&
957*58b9f456SAndroid Build Coastguard Worker    {
958*58b9f456SAndroid Build Coastguard Worker        if (!this->has_value())
959*58b9f456SAndroid Build Coastguard Worker            __throw_bad_optional_access();
960*58b9f456SAndroid Build Coastguard Worker        return _VSTD::move(this->__get());
961*58b9f456SAndroid Build Coastguard Worker    }
962*58b9f456SAndroid Build Coastguard Worker
963*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
964*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_AVAILABILITY_THROW_BAD_OPTIONAL_ACCESS
965*58b9f456SAndroid Build Coastguard Worker    constexpr value_type const&& value() const&&
966*58b9f456SAndroid Build Coastguard Worker    {
967*58b9f456SAndroid Build Coastguard Worker        if (!this->has_value())
968*58b9f456SAndroid Build Coastguard Worker            __throw_bad_optional_access();
969*58b9f456SAndroid Build Coastguard Worker        return _VSTD::move(this->__get());
970*58b9f456SAndroid Build Coastguard Worker    }
971*58b9f456SAndroid Build Coastguard Worker
972*58b9f456SAndroid Build Coastguard Worker    template <class _Up>
973*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
974*58b9f456SAndroid Build Coastguard Worker    constexpr value_type value_or(_Up&& __v) const&
975*58b9f456SAndroid Build Coastguard Worker    {
976*58b9f456SAndroid Build Coastguard Worker        static_assert(is_copy_constructible_v<value_type>,
977*58b9f456SAndroid Build Coastguard Worker                      "optional<T>::value_or: T must be copy constructible");
978*58b9f456SAndroid Build Coastguard Worker        static_assert(is_convertible_v<_Up, value_type>,
979*58b9f456SAndroid Build Coastguard Worker                      "optional<T>::value_or: U must be convertible to T");
980*58b9f456SAndroid Build Coastguard Worker        return this->has_value() ? this->__get() :
981*58b9f456SAndroid Build Coastguard Worker                                  static_cast<value_type>(_VSTD::forward<_Up>(__v));
982*58b9f456SAndroid Build Coastguard Worker    }
983*58b9f456SAndroid Build Coastguard Worker
984*58b9f456SAndroid Build Coastguard Worker    template <class _Up>
985*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
986*58b9f456SAndroid Build Coastguard Worker    constexpr value_type value_or(_Up&& __v) &&
987*58b9f456SAndroid Build Coastguard Worker    {
988*58b9f456SAndroid Build Coastguard Worker        static_assert(is_move_constructible_v<value_type>,
989*58b9f456SAndroid Build Coastguard Worker                      "optional<T>::value_or: T must be move constructible");
990*58b9f456SAndroid Build Coastguard Worker        static_assert(is_convertible_v<_Up, value_type>,
991*58b9f456SAndroid Build Coastguard Worker                      "optional<T>::value_or: U must be convertible to T");
992*58b9f456SAndroid Build Coastguard Worker        return this->has_value() ? _VSTD::move(this->__get()) :
993*58b9f456SAndroid Build Coastguard Worker                                  static_cast<value_type>(_VSTD::forward<_Up>(__v));
994*58b9f456SAndroid Build Coastguard Worker    }
995*58b9f456SAndroid Build Coastguard Worker
996*58b9f456SAndroid Build Coastguard Worker    using __base::reset;
997*58b9f456SAndroid Build Coastguard Worker
998*58b9f456SAndroid Build Coastguard Workerprivate:
999*58b9f456SAndroid Build Coastguard Worker    template <class _Up>
1000*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1001*58b9f456SAndroid Build Coastguard Worker    static _Up*
1002*58b9f456SAndroid Build Coastguard Worker    __operator_arrow(true_type, _Up& __x)
1003*58b9f456SAndroid Build Coastguard Worker    {
1004*58b9f456SAndroid Build Coastguard Worker        return _VSTD::addressof(__x);
1005*58b9f456SAndroid Build Coastguard Worker    }
1006*58b9f456SAndroid Build Coastguard Worker
1007*58b9f456SAndroid Build Coastguard Worker    template <class _Up>
1008*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1009*58b9f456SAndroid Build Coastguard Worker    static constexpr _Up*
1010*58b9f456SAndroid Build Coastguard Worker    __operator_arrow(false_type, _Up& __x)
1011*58b9f456SAndroid Build Coastguard Worker    {
1012*58b9f456SAndroid Build Coastguard Worker        return &__x;
1013*58b9f456SAndroid Build Coastguard Worker    }
1014*58b9f456SAndroid Build Coastguard Worker};
1015*58b9f456SAndroid Build Coastguard Worker
1016*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
1017*58b9f456SAndroid Build Coastguard Workertemplate<class T>
1018*58b9f456SAndroid Build Coastguard Worker    optional(T) -> optional<T>;
1019*58b9f456SAndroid Build Coastguard Worker#endif
1020*58b9f456SAndroid Build Coastguard Worker
1021*58b9f456SAndroid Build Coastguard Worker// Comparisons between optionals
1022*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, class _Up>
1023*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY constexpr
1024*58b9f456SAndroid Build Coastguard Workerenable_if_t<
1025*58b9f456SAndroid Build Coastguard Worker    is_convertible_v<decltype(_VSTD::declval<const _Tp&>() ==
1026*58b9f456SAndroid Build Coastguard Worker        _VSTD::declval<const _Up&>()), bool>,
1027*58b9f456SAndroid Build Coastguard Worker    bool
1028*58b9f456SAndroid Build Coastguard Worker>
1029*58b9f456SAndroid Build Coastguard Workeroperator==(const optional<_Tp>& __x, const optional<_Up>& __y)
1030*58b9f456SAndroid Build Coastguard Worker{
1031*58b9f456SAndroid Build Coastguard Worker    if (static_cast<bool>(__x) != static_cast<bool>(__y))
1032*58b9f456SAndroid Build Coastguard Worker        return false;
1033*58b9f456SAndroid Build Coastguard Worker    if (!static_cast<bool>(__x))
1034*58b9f456SAndroid Build Coastguard Worker        return true;
1035*58b9f456SAndroid Build Coastguard Worker    return *__x == *__y;
1036*58b9f456SAndroid Build Coastguard Worker}
1037*58b9f456SAndroid Build Coastguard Worker
1038*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, class _Up>
1039*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY constexpr
1040*58b9f456SAndroid Build Coastguard Workerenable_if_t<
1041*58b9f456SAndroid Build Coastguard Worker    is_convertible_v<decltype(_VSTD::declval<const _Tp&>() !=
1042*58b9f456SAndroid Build Coastguard Worker        _VSTD::declval<const _Up&>()), bool>,
1043*58b9f456SAndroid Build Coastguard Worker    bool
1044*58b9f456SAndroid Build Coastguard Worker>
1045*58b9f456SAndroid Build Coastguard Workeroperator!=(const optional<_Tp>& __x, const optional<_Up>& __y)
1046*58b9f456SAndroid Build Coastguard Worker{
1047*58b9f456SAndroid Build Coastguard Worker    if (static_cast<bool>(__x) != static_cast<bool>(__y))
1048*58b9f456SAndroid Build Coastguard Worker        return true;
1049*58b9f456SAndroid Build Coastguard Worker    if (!static_cast<bool>(__x))
1050*58b9f456SAndroid Build Coastguard Worker        return false;
1051*58b9f456SAndroid Build Coastguard Worker    return *__x != *__y;
1052*58b9f456SAndroid Build Coastguard Worker}
1053*58b9f456SAndroid Build Coastguard Worker
1054*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, class _Up>
1055*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY constexpr
1056*58b9f456SAndroid Build Coastguard Workerenable_if_t<
1057*58b9f456SAndroid Build Coastguard Worker    is_convertible_v<decltype(_VSTD::declval<const _Tp&>() <
1058*58b9f456SAndroid Build Coastguard Worker        _VSTD::declval<const _Up&>()), bool>,
1059*58b9f456SAndroid Build Coastguard Worker    bool
1060*58b9f456SAndroid Build Coastguard Worker>
1061*58b9f456SAndroid Build Coastguard Workeroperator<(const optional<_Tp>& __x, const optional<_Up>& __y)
1062*58b9f456SAndroid Build Coastguard Worker{
1063*58b9f456SAndroid Build Coastguard Worker    if (!static_cast<bool>(__y))
1064*58b9f456SAndroid Build Coastguard Worker        return false;
1065*58b9f456SAndroid Build Coastguard Worker    if (!static_cast<bool>(__x))
1066*58b9f456SAndroid Build Coastguard Worker        return true;
1067*58b9f456SAndroid Build Coastguard Worker    return *__x < *__y;
1068*58b9f456SAndroid Build Coastguard Worker}
1069*58b9f456SAndroid Build Coastguard Worker
1070*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, class _Up>
1071*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY constexpr
1072*58b9f456SAndroid Build Coastguard Workerenable_if_t<
1073*58b9f456SAndroid Build Coastguard Worker    is_convertible_v<decltype(_VSTD::declval<const _Tp&>() >
1074*58b9f456SAndroid Build Coastguard Worker        _VSTD::declval<const _Up&>()), bool>,
1075*58b9f456SAndroid Build Coastguard Worker    bool
1076*58b9f456SAndroid Build Coastguard Worker>
1077*58b9f456SAndroid Build Coastguard Workeroperator>(const optional<_Tp>& __x, const optional<_Up>& __y)
1078*58b9f456SAndroid Build Coastguard Worker{
1079*58b9f456SAndroid Build Coastguard Worker    if (!static_cast<bool>(__x))
1080*58b9f456SAndroid Build Coastguard Worker        return false;
1081*58b9f456SAndroid Build Coastguard Worker    if (!static_cast<bool>(__y))
1082*58b9f456SAndroid Build Coastguard Worker        return true;
1083*58b9f456SAndroid Build Coastguard Worker    return *__x > *__y;
1084*58b9f456SAndroid Build Coastguard Worker}
1085*58b9f456SAndroid Build Coastguard Worker
1086*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, class _Up>
1087*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY constexpr
1088*58b9f456SAndroid Build Coastguard Workerenable_if_t<
1089*58b9f456SAndroid Build Coastguard Worker    is_convertible_v<decltype(_VSTD::declval<const _Tp&>() <=
1090*58b9f456SAndroid Build Coastguard Worker        _VSTD::declval<const _Up&>()), bool>,
1091*58b9f456SAndroid Build Coastguard Worker    bool
1092*58b9f456SAndroid Build Coastguard Worker>
1093*58b9f456SAndroid Build Coastguard Workeroperator<=(const optional<_Tp>& __x, const optional<_Up>& __y)
1094*58b9f456SAndroid Build Coastguard Worker{
1095*58b9f456SAndroid Build Coastguard Worker    if (!static_cast<bool>(__x))
1096*58b9f456SAndroid Build Coastguard Worker        return true;
1097*58b9f456SAndroid Build Coastguard Worker    if (!static_cast<bool>(__y))
1098*58b9f456SAndroid Build Coastguard Worker        return false;
1099*58b9f456SAndroid Build Coastguard Worker    return *__x <= *__y;
1100*58b9f456SAndroid Build Coastguard Worker}
1101*58b9f456SAndroid Build Coastguard Worker
1102*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, class _Up>
1103*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY constexpr
1104*58b9f456SAndroid Build Coastguard Workerenable_if_t<
1105*58b9f456SAndroid Build Coastguard Worker    is_convertible_v<decltype(_VSTD::declval<const _Tp&>() >=
1106*58b9f456SAndroid Build Coastguard Worker        _VSTD::declval<const _Up&>()), bool>,
1107*58b9f456SAndroid Build Coastguard Worker    bool
1108*58b9f456SAndroid Build Coastguard Worker>
1109*58b9f456SAndroid Build Coastguard Workeroperator>=(const optional<_Tp>& __x, const optional<_Up>& __y)
1110*58b9f456SAndroid Build Coastguard Worker{
1111*58b9f456SAndroid Build Coastguard Worker    if (!static_cast<bool>(__y))
1112*58b9f456SAndroid Build Coastguard Worker        return true;
1113*58b9f456SAndroid Build Coastguard Worker    if (!static_cast<bool>(__x))
1114*58b9f456SAndroid Build Coastguard Worker        return false;
1115*58b9f456SAndroid Build Coastguard Worker    return *__x >= *__y;
1116*58b9f456SAndroid Build Coastguard Worker}
1117*58b9f456SAndroid Build Coastguard Worker
1118*58b9f456SAndroid Build Coastguard Worker// Comparisons with nullopt
1119*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
1120*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY constexpr
1121*58b9f456SAndroid Build Coastguard Workerbool
1122*58b9f456SAndroid Build Coastguard Workeroperator==(const optional<_Tp>& __x, nullopt_t) noexcept
1123*58b9f456SAndroid Build Coastguard Worker{
1124*58b9f456SAndroid Build Coastguard Worker    return !static_cast<bool>(__x);
1125*58b9f456SAndroid Build Coastguard Worker}
1126*58b9f456SAndroid Build Coastguard Worker
1127*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
1128*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY constexpr
1129*58b9f456SAndroid Build Coastguard Workerbool
1130*58b9f456SAndroid Build Coastguard Workeroperator==(nullopt_t, const optional<_Tp>& __x) noexcept
1131*58b9f456SAndroid Build Coastguard Worker{
1132*58b9f456SAndroid Build Coastguard Worker    return !static_cast<bool>(__x);
1133*58b9f456SAndroid Build Coastguard Worker}
1134*58b9f456SAndroid Build Coastguard Worker
1135*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
1136*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY constexpr
1137*58b9f456SAndroid Build Coastguard Workerbool
1138*58b9f456SAndroid Build Coastguard Workeroperator!=(const optional<_Tp>& __x, nullopt_t) noexcept
1139*58b9f456SAndroid Build Coastguard Worker{
1140*58b9f456SAndroid Build Coastguard Worker    return static_cast<bool>(__x);
1141*58b9f456SAndroid Build Coastguard Worker}
1142*58b9f456SAndroid Build Coastguard Worker
1143*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
1144*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY constexpr
1145*58b9f456SAndroid Build Coastguard Workerbool
1146*58b9f456SAndroid Build Coastguard Workeroperator!=(nullopt_t, const optional<_Tp>& __x) noexcept
1147*58b9f456SAndroid Build Coastguard Worker{
1148*58b9f456SAndroid Build Coastguard Worker    return static_cast<bool>(__x);
1149*58b9f456SAndroid Build Coastguard Worker}
1150*58b9f456SAndroid Build Coastguard Worker
1151*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
1152*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY constexpr
1153*58b9f456SAndroid Build Coastguard Workerbool
1154*58b9f456SAndroid Build Coastguard Workeroperator<(const optional<_Tp>&, nullopt_t) noexcept
1155*58b9f456SAndroid Build Coastguard Worker{
1156*58b9f456SAndroid Build Coastguard Worker    return false;
1157*58b9f456SAndroid Build Coastguard Worker}
1158*58b9f456SAndroid Build Coastguard Worker
1159*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
1160*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY constexpr
1161*58b9f456SAndroid Build Coastguard Workerbool
1162*58b9f456SAndroid Build Coastguard Workeroperator<(nullopt_t, const optional<_Tp>& __x) noexcept
1163*58b9f456SAndroid Build Coastguard Worker{
1164*58b9f456SAndroid Build Coastguard Worker    return static_cast<bool>(__x);
1165*58b9f456SAndroid Build Coastguard Worker}
1166*58b9f456SAndroid Build Coastguard Worker
1167*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
1168*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY constexpr
1169*58b9f456SAndroid Build Coastguard Workerbool
1170*58b9f456SAndroid Build Coastguard Workeroperator<=(const optional<_Tp>& __x, nullopt_t) noexcept
1171*58b9f456SAndroid Build Coastguard Worker{
1172*58b9f456SAndroid Build Coastguard Worker    return !static_cast<bool>(__x);
1173*58b9f456SAndroid Build Coastguard Worker}
1174*58b9f456SAndroid Build Coastguard Worker
1175*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
1176*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY constexpr
1177*58b9f456SAndroid Build Coastguard Workerbool
1178*58b9f456SAndroid Build Coastguard Workeroperator<=(nullopt_t, const optional<_Tp>&) noexcept
1179*58b9f456SAndroid Build Coastguard Worker{
1180*58b9f456SAndroid Build Coastguard Worker    return true;
1181*58b9f456SAndroid Build Coastguard Worker}
1182*58b9f456SAndroid Build Coastguard Worker
1183*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
1184*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY constexpr
1185*58b9f456SAndroid Build Coastguard Workerbool
1186*58b9f456SAndroid Build Coastguard Workeroperator>(const optional<_Tp>& __x, nullopt_t) noexcept
1187*58b9f456SAndroid Build Coastguard Worker{
1188*58b9f456SAndroid Build Coastguard Worker    return static_cast<bool>(__x);
1189*58b9f456SAndroid Build Coastguard Worker}
1190*58b9f456SAndroid Build Coastguard Worker
1191*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
1192*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY constexpr
1193*58b9f456SAndroid Build Coastguard Workerbool
1194*58b9f456SAndroid Build Coastguard Workeroperator>(nullopt_t, const optional<_Tp>&) noexcept
1195*58b9f456SAndroid Build Coastguard Worker{
1196*58b9f456SAndroid Build Coastguard Worker    return false;
1197*58b9f456SAndroid Build Coastguard Worker}
1198*58b9f456SAndroid Build Coastguard Worker
1199*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
1200*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY constexpr
1201*58b9f456SAndroid Build Coastguard Workerbool
1202*58b9f456SAndroid Build Coastguard Workeroperator>=(const optional<_Tp>&, nullopt_t) noexcept
1203*58b9f456SAndroid Build Coastguard Worker{
1204*58b9f456SAndroid Build Coastguard Worker    return true;
1205*58b9f456SAndroid Build Coastguard Worker}
1206*58b9f456SAndroid Build Coastguard Worker
1207*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
1208*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY constexpr
1209*58b9f456SAndroid Build Coastguard Workerbool
1210*58b9f456SAndroid Build Coastguard Workeroperator>=(nullopt_t, const optional<_Tp>& __x) noexcept
1211*58b9f456SAndroid Build Coastguard Worker{
1212*58b9f456SAndroid Build Coastguard Worker    return !static_cast<bool>(__x);
1213*58b9f456SAndroid Build Coastguard Worker}
1214*58b9f456SAndroid Build Coastguard Worker
1215*58b9f456SAndroid Build Coastguard Worker// Comparisons with T
1216*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, class _Up>
1217*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY constexpr
1218*58b9f456SAndroid Build Coastguard Workerenable_if_t<
1219*58b9f456SAndroid Build Coastguard Worker    is_convertible_v<decltype(_VSTD::declval<const _Tp&>() ==
1220*58b9f456SAndroid Build Coastguard Worker        _VSTD::declval<const _Up&>()), bool>,
1221*58b9f456SAndroid Build Coastguard Worker    bool
1222*58b9f456SAndroid Build Coastguard Worker>
1223*58b9f456SAndroid Build Coastguard Workeroperator==(const optional<_Tp>& __x, const _Up& __v)
1224*58b9f456SAndroid Build Coastguard Worker{
1225*58b9f456SAndroid Build Coastguard Worker    return static_cast<bool>(__x) ? *__x == __v : false;
1226*58b9f456SAndroid Build Coastguard Worker}
1227*58b9f456SAndroid Build Coastguard Worker
1228*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, class _Up>
1229*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY constexpr
1230*58b9f456SAndroid Build Coastguard Workerenable_if_t<
1231*58b9f456SAndroid Build Coastguard Worker    is_convertible_v<decltype(_VSTD::declval<const _Tp&>() ==
1232*58b9f456SAndroid Build Coastguard Worker        _VSTD::declval<const _Up&>()), bool>,
1233*58b9f456SAndroid Build Coastguard Worker    bool
1234*58b9f456SAndroid Build Coastguard Worker>
1235*58b9f456SAndroid Build Coastguard Workeroperator==(const _Tp& __v, const optional<_Up>& __x)
1236*58b9f456SAndroid Build Coastguard Worker{
1237*58b9f456SAndroid Build Coastguard Worker    return static_cast<bool>(__x) ? __v == *__x : false;
1238*58b9f456SAndroid Build Coastguard Worker}
1239*58b9f456SAndroid Build Coastguard Worker
1240*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, class _Up>
1241*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY constexpr
1242*58b9f456SAndroid Build Coastguard Workerenable_if_t<
1243*58b9f456SAndroid Build Coastguard Worker    is_convertible_v<decltype(_VSTD::declval<const _Tp&>() !=
1244*58b9f456SAndroid Build Coastguard Worker        _VSTD::declval<const _Up&>()), bool>,
1245*58b9f456SAndroid Build Coastguard Worker    bool
1246*58b9f456SAndroid Build Coastguard Worker>
1247*58b9f456SAndroid Build Coastguard Workeroperator!=(const optional<_Tp>& __x, const _Up& __v)
1248*58b9f456SAndroid Build Coastguard Worker{
1249*58b9f456SAndroid Build Coastguard Worker    return static_cast<bool>(__x) ? *__x != __v : true;
1250*58b9f456SAndroid Build Coastguard Worker}
1251*58b9f456SAndroid Build Coastguard Worker
1252*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, class _Up>
1253*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY constexpr
1254*58b9f456SAndroid Build Coastguard Workerenable_if_t<
1255*58b9f456SAndroid Build Coastguard Worker    is_convertible_v<decltype(_VSTD::declval<const _Tp&>() !=
1256*58b9f456SAndroid Build Coastguard Worker        _VSTD::declval<const _Up&>()), bool>,
1257*58b9f456SAndroid Build Coastguard Worker    bool
1258*58b9f456SAndroid Build Coastguard Worker>
1259*58b9f456SAndroid Build Coastguard Workeroperator!=(const _Tp& __v, const optional<_Up>& __x)
1260*58b9f456SAndroid Build Coastguard Worker{
1261*58b9f456SAndroid Build Coastguard Worker    return static_cast<bool>(__x) ? __v != *__x : true;
1262*58b9f456SAndroid Build Coastguard Worker}
1263*58b9f456SAndroid Build Coastguard Worker
1264*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, class _Up>
1265*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY constexpr
1266*58b9f456SAndroid Build Coastguard Workerenable_if_t<
1267*58b9f456SAndroid Build Coastguard Worker    is_convertible_v<decltype(_VSTD::declval<const _Tp&>() <
1268*58b9f456SAndroid Build Coastguard Worker        _VSTD::declval<const _Up&>()), bool>,
1269*58b9f456SAndroid Build Coastguard Worker    bool
1270*58b9f456SAndroid Build Coastguard Worker>
1271*58b9f456SAndroid Build Coastguard Workeroperator<(const optional<_Tp>& __x, const _Up& __v)
1272*58b9f456SAndroid Build Coastguard Worker{
1273*58b9f456SAndroid Build Coastguard Worker    return static_cast<bool>(__x) ? *__x < __v : true;
1274*58b9f456SAndroid Build Coastguard Worker}
1275*58b9f456SAndroid Build Coastguard Worker
1276*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, class _Up>
1277*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY constexpr
1278*58b9f456SAndroid Build Coastguard Workerenable_if_t<
1279*58b9f456SAndroid Build Coastguard Worker    is_convertible_v<decltype(_VSTD::declval<const _Tp&>() <
1280*58b9f456SAndroid Build Coastguard Worker        _VSTD::declval<const _Up&>()), bool>,
1281*58b9f456SAndroid Build Coastguard Worker    bool
1282*58b9f456SAndroid Build Coastguard Worker>
1283*58b9f456SAndroid Build Coastguard Workeroperator<(const _Tp& __v, const optional<_Up>& __x)
1284*58b9f456SAndroid Build Coastguard Worker{
1285*58b9f456SAndroid Build Coastguard Worker    return static_cast<bool>(__x) ? __v < *__x : false;
1286*58b9f456SAndroid Build Coastguard Worker}
1287*58b9f456SAndroid Build Coastguard Worker
1288*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, class _Up>
1289*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY constexpr
1290*58b9f456SAndroid Build Coastguard Workerenable_if_t<
1291*58b9f456SAndroid Build Coastguard Worker    is_convertible_v<decltype(_VSTD::declval<const _Tp&>() <=
1292*58b9f456SAndroid Build Coastguard Worker        _VSTD::declval<const _Up&>()), bool>,
1293*58b9f456SAndroid Build Coastguard Worker    bool
1294*58b9f456SAndroid Build Coastguard Worker>
1295*58b9f456SAndroid Build Coastguard Workeroperator<=(const optional<_Tp>& __x, const _Up& __v)
1296*58b9f456SAndroid Build Coastguard Worker{
1297*58b9f456SAndroid Build Coastguard Worker    return static_cast<bool>(__x) ? *__x <= __v : true;
1298*58b9f456SAndroid Build Coastguard Worker}
1299*58b9f456SAndroid Build Coastguard Worker
1300*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, class _Up>
1301*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY constexpr
1302*58b9f456SAndroid Build Coastguard Workerenable_if_t<
1303*58b9f456SAndroid Build Coastguard Worker    is_convertible_v<decltype(_VSTD::declval<const _Tp&>() <=
1304*58b9f456SAndroid Build Coastguard Worker        _VSTD::declval<const _Up&>()), bool>,
1305*58b9f456SAndroid Build Coastguard Worker    bool
1306*58b9f456SAndroid Build Coastguard Worker>
1307*58b9f456SAndroid Build Coastguard Workeroperator<=(const _Tp& __v, const optional<_Up>& __x)
1308*58b9f456SAndroid Build Coastguard Worker{
1309*58b9f456SAndroid Build Coastguard Worker    return static_cast<bool>(__x) ? __v <= *__x : false;
1310*58b9f456SAndroid Build Coastguard Worker}
1311*58b9f456SAndroid Build Coastguard Worker
1312*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, class _Up>
1313*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY constexpr
1314*58b9f456SAndroid Build Coastguard Workerenable_if_t<
1315*58b9f456SAndroid Build Coastguard Worker    is_convertible_v<decltype(_VSTD::declval<const _Tp&>() >
1316*58b9f456SAndroid Build Coastguard Worker        _VSTD::declval<const _Up&>()), bool>,
1317*58b9f456SAndroid Build Coastguard Worker    bool
1318*58b9f456SAndroid Build Coastguard Worker>
1319*58b9f456SAndroid Build Coastguard Workeroperator>(const optional<_Tp>& __x, const _Up& __v)
1320*58b9f456SAndroid Build Coastguard Worker{
1321*58b9f456SAndroid Build Coastguard Worker    return static_cast<bool>(__x) ? *__x > __v : false;
1322*58b9f456SAndroid Build Coastguard Worker}
1323*58b9f456SAndroid Build Coastguard Worker
1324*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, class _Up>
1325*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY constexpr
1326*58b9f456SAndroid Build Coastguard Workerenable_if_t<
1327*58b9f456SAndroid Build Coastguard Worker    is_convertible_v<decltype(_VSTD::declval<const _Tp&>() >
1328*58b9f456SAndroid Build Coastguard Worker        _VSTD::declval<const _Up&>()), bool>,
1329*58b9f456SAndroid Build Coastguard Worker    bool
1330*58b9f456SAndroid Build Coastguard Worker>
1331*58b9f456SAndroid Build Coastguard Workeroperator>(const _Tp& __v, const optional<_Up>& __x)
1332*58b9f456SAndroid Build Coastguard Worker{
1333*58b9f456SAndroid Build Coastguard Worker    return static_cast<bool>(__x) ? __v > *__x : true;
1334*58b9f456SAndroid Build Coastguard Worker}
1335*58b9f456SAndroid Build Coastguard Worker
1336*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, class _Up>
1337*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY constexpr
1338*58b9f456SAndroid Build Coastguard Workerenable_if_t<
1339*58b9f456SAndroid Build Coastguard Worker    is_convertible_v<decltype(_VSTD::declval<const _Tp&>() >=
1340*58b9f456SAndroid Build Coastguard Worker        _VSTD::declval<const _Up&>()), bool>,
1341*58b9f456SAndroid Build Coastguard Worker    bool
1342*58b9f456SAndroid Build Coastguard Worker>
1343*58b9f456SAndroid Build Coastguard Workeroperator>=(const optional<_Tp>& __x, const _Up& __v)
1344*58b9f456SAndroid Build Coastguard Worker{
1345*58b9f456SAndroid Build Coastguard Worker    return static_cast<bool>(__x) ? *__x >= __v : false;
1346*58b9f456SAndroid Build Coastguard Worker}
1347*58b9f456SAndroid Build Coastguard Worker
1348*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, class _Up>
1349*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY constexpr
1350*58b9f456SAndroid Build Coastguard Workerenable_if_t<
1351*58b9f456SAndroid Build Coastguard Worker    is_convertible_v<decltype(_VSTD::declval<const _Tp&>() >=
1352*58b9f456SAndroid Build Coastguard Worker        _VSTD::declval<const _Up&>()), bool>,
1353*58b9f456SAndroid Build Coastguard Worker    bool
1354*58b9f456SAndroid Build Coastguard Worker>
1355*58b9f456SAndroid Build Coastguard Workeroperator>=(const _Tp& __v, const optional<_Up>& __x)
1356*58b9f456SAndroid Build Coastguard Worker{
1357*58b9f456SAndroid Build Coastguard Worker    return static_cast<bool>(__x) ? __v >= *__x : true;
1358*58b9f456SAndroid Build Coastguard Worker}
1359*58b9f456SAndroid Build Coastguard Worker
1360*58b9f456SAndroid Build Coastguard Worker
1361*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
1362*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
1363*58b9f456SAndroid Build Coastguard Workerenable_if_t<
1364*58b9f456SAndroid Build Coastguard Worker    is_move_constructible_v<_Tp> && is_swappable_v<_Tp>,
1365*58b9f456SAndroid Build Coastguard Worker    void
1366*58b9f456SAndroid Build Coastguard Worker>
1367*58b9f456SAndroid Build Coastguard Workerswap(optional<_Tp>& __x, optional<_Tp>& __y) noexcept(noexcept(__x.swap(__y)))
1368*58b9f456SAndroid Build Coastguard Worker{
1369*58b9f456SAndroid Build Coastguard Worker    __x.swap(__y);
1370*58b9f456SAndroid Build Coastguard Worker}
1371*58b9f456SAndroid Build Coastguard Worker
1372*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
1373*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY constexpr
1374*58b9f456SAndroid Build Coastguard Workeroptional<decay_t<_Tp>> make_optional(_Tp&& __v)
1375*58b9f456SAndroid Build Coastguard Worker{
1376*58b9f456SAndroid Build Coastguard Worker    return optional<decay_t<_Tp>>(_VSTD::forward<_Tp>(__v));
1377*58b9f456SAndroid Build Coastguard Worker}
1378*58b9f456SAndroid Build Coastguard Worker
1379*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, class... _Args>
1380*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY constexpr
1381*58b9f456SAndroid Build Coastguard Workeroptional<_Tp> make_optional(_Args&&... __args)
1382*58b9f456SAndroid Build Coastguard Worker{
1383*58b9f456SAndroid Build Coastguard Worker    return optional<_Tp>(in_place, _VSTD::forward<_Args>(__args)...);
1384*58b9f456SAndroid Build Coastguard Worker}
1385*58b9f456SAndroid Build Coastguard Worker
1386*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp, class _Up, class... _Args>
1387*58b9f456SAndroid Build Coastguard Worker_LIBCPP_INLINE_VISIBILITY constexpr
1388*58b9f456SAndroid Build Coastguard Workeroptional<_Tp> make_optional(initializer_list<_Up> __il,  _Args&&... __args)
1389*58b9f456SAndroid Build Coastguard Worker{
1390*58b9f456SAndroid Build Coastguard Worker    return optional<_Tp>(in_place, __il, _VSTD::forward<_Args>(__args)...);
1391*58b9f456SAndroid Build Coastguard Worker}
1392*58b9f456SAndroid Build Coastguard Worker
1393*58b9f456SAndroid Build Coastguard Workertemplate <class _Tp>
1394*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS hash<
1395*58b9f456SAndroid Build Coastguard Worker    __enable_hash_helper<optional<_Tp>, remove_const_t<_Tp>>
1396*58b9f456SAndroid Build Coastguard Worker>
1397*58b9f456SAndroid Build Coastguard Worker{
1398*58b9f456SAndroid Build Coastguard Worker    typedef optional<_Tp> argument_type;
1399*58b9f456SAndroid Build Coastguard Worker    typedef size_t        result_type;
1400*58b9f456SAndroid Build Coastguard Worker
1401*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1402*58b9f456SAndroid Build Coastguard Worker    result_type operator()(const argument_type& __opt) const
1403*58b9f456SAndroid Build Coastguard Worker    {
1404*58b9f456SAndroid Build Coastguard Worker        return static_cast<bool>(__opt) ? hash<remove_const_t<_Tp>>()(*__opt) : 0;
1405*58b9f456SAndroid Build Coastguard Worker    }
1406*58b9f456SAndroid Build Coastguard Worker};
1407*58b9f456SAndroid Build Coastguard Worker
1408*58b9f456SAndroid Build Coastguard Worker_LIBCPP_END_NAMESPACE_STD
1409*58b9f456SAndroid Build Coastguard Worker
1410*58b9f456SAndroid Build Coastguard Worker#endif  // _LIBCPP_STD_VER > 14
1411*58b9f456SAndroid Build Coastguard Worker
1412*58b9f456SAndroid Build Coastguard Worker_LIBCPP_POP_MACROS
1413*58b9f456SAndroid Build Coastguard Worker
1414*58b9f456SAndroid Build Coastguard Worker#endif  // _LIBCPP_OPTIONAL
1415