xref: /aosp_15_r20/external/bcc/src/cc/vendor/optional.hpp (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
1*387f9dfdSAndroid Build Coastguard Worker // Copyright (C) 2011 - 2012 Andrzej Krzemienski.
2*387f9dfdSAndroid Build Coastguard Worker //
3*387f9dfdSAndroid Build Coastguard Worker // Use, modification, and distribution is subject to the Boost Software
4*387f9dfdSAndroid Build Coastguard Worker // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
5*387f9dfdSAndroid Build Coastguard Worker // http://www.boost.org/LICENSE_1_0.txt)
6*387f9dfdSAndroid Build Coastguard Worker //
7*387f9dfdSAndroid Build Coastguard Worker // The idea and interface is based on Boost.Optional library
8*387f9dfdSAndroid Build Coastguard Worker // authored by Fernando Luis Cacciola Carballal
9*387f9dfdSAndroid Build Coastguard Worker 
10*387f9dfdSAndroid Build Coastguard Worker # ifndef ___OPTIONAL_HPP___
11*387f9dfdSAndroid Build Coastguard Worker # define ___OPTIONAL_HPP___
12*387f9dfdSAndroid Build Coastguard Worker 
13*387f9dfdSAndroid Build Coastguard Worker # include <utility>
14*387f9dfdSAndroid Build Coastguard Worker # include <type_traits>
15*387f9dfdSAndroid Build Coastguard Worker # include <initializer_list>
16*387f9dfdSAndroid Build Coastguard Worker # include <cassert>
17*387f9dfdSAndroid Build Coastguard Worker # include <functional>
18*387f9dfdSAndroid Build Coastguard Worker # include <string>
19*387f9dfdSAndroid Build Coastguard Worker # include <stdexcept>
20*387f9dfdSAndroid Build Coastguard Worker 
21*387f9dfdSAndroid Build Coastguard Worker # define TR2_OPTIONAL_REQUIRES(...) typename enable_if<__VA_ARGS__::value, bool>::type = false
22*387f9dfdSAndroid Build Coastguard Worker 
23*387f9dfdSAndroid Build Coastguard Worker # if defined __GNUC__ // NOTE: GNUC is also defined for Clang
24*387f9dfdSAndroid Build Coastguard Worker #   if (__GNUC__ == 4) && (__GNUC_MINOR__ >= 8)
25*387f9dfdSAndroid Build Coastguard Worker #     define TR2_OPTIONAL_GCC_4_8_AND_HIGHER___
26*387f9dfdSAndroid Build Coastguard Worker #   elif (__GNUC__ > 4)
27*387f9dfdSAndroid Build Coastguard Worker #     define TR2_OPTIONAL_GCC_4_8_AND_HIGHER___
28*387f9dfdSAndroid Build Coastguard Worker #   endif
29*387f9dfdSAndroid Build Coastguard Worker #
30*387f9dfdSAndroid Build Coastguard Worker #   if (__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)
31*387f9dfdSAndroid Build Coastguard Worker #     define TR2_OPTIONAL_GCC_4_7_AND_HIGHER___
32*387f9dfdSAndroid Build Coastguard Worker #   elif (__GNUC__ > 4)
33*387f9dfdSAndroid Build Coastguard Worker #     define TR2_OPTIONAL_GCC_4_7_AND_HIGHER___
34*387f9dfdSAndroid Build Coastguard Worker #   endif
35*387f9dfdSAndroid Build Coastguard Worker #
36*387f9dfdSAndroid Build Coastguard Worker #   if (__GNUC__ == 4) && (__GNUC_MINOR__ == 8) && (__GNUC_PATCHLEVEL__ >= 1)
37*387f9dfdSAndroid Build Coastguard Worker #     define TR2_OPTIONAL_GCC_4_8_1_AND_HIGHER___
38*387f9dfdSAndroid Build Coastguard Worker #   elif (__GNUC__ == 4) && (__GNUC_MINOR__ >= 9)
39*387f9dfdSAndroid Build Coastguard Worker #     define TR2_OPTIONAL_GCC_4_8_1_AND_HIGHER___
40*387f9dfdSAndroid Build Coastguard Worker #   elif (__GNUC__ > 4)
41*387f9dfdSAndroid Build Coastguard Worker #     define TR2_OPTIONAL_GCC_4_8_1_AND_HIGHER___
42*387f9dfdSAndroid Build Coastguard Worker #   endif
43*387f9dfdSAndroid Build Coastguard Worker # endif
44*387f9dfdSAndroid Build Coastguard Worker #
45*387f9dfdSAndroid Build Coastguard Worker # if defined __clang_major__
46*387f9dfdSAndroid Build Coastguard Worker #   if (__clang_major__ == 3 && __clang_minor__ >= 5)
47*387f9dfdSAndroid Build Coastguard Worker #     define TR2_OPTIONAL_CLANG_3_5_AND_HIGHTER_
48*387f9dfdSAndroid Build Coastguard Worker #   elif (__clang_major__ > 3)
49*387f9dfdSAndroid Build Coastguard Worker #     define TR2_OPTIONAL_CLANG_3_5_AND_HIGHTER_
50*387f9dfdSAndroid Build Coastguard Worker #   endif
51*387f9dfdSAndroid Build Coastguard Worker #   if defined TR2_OPTIONAL_CLANG_3_5_AND_HIGHTER_
52*387f9dfdSAndroid Build Coastguard Worker #     define TR2_OPTIONAL_CLANG_3_4_2_AND_HIGHER_
53*387f9dfdSAndroid Build Coastguard Worker #   elif (__clang_major__ == 3 && __clang_minor__ == 4 && __clang_patchlevel__ >= 2)
54*387f9dfdSAndroid Build Coastguard Worker #     define TR2_OPTIONAL_CLANG_3_4_2_AND_HIGHER_
55*387f9dfdSAndroid Build Coastguard Worker #   endif
56*387f9dfdSAndroid Build Coastguard Worker # endif
57*387f9dfdSAndroid Build Coastguard Worker #
58*387f9dfdSAndroid Build Coastguard Worker # if defined _MSC_VER
59*387f9dfdSAndroid Build Coastguard Worker #   if (_MSC_VER >= 1900)
60*387f9dfdSAndroid Build Coastguard Worker #     define TR2_OPTIONAL_MSVC_2015_AND_HIGHER___
61*387f9dfdSAndroid Build Coastguard Worker #   endif
62*387f9dfdSAndroid Build Coastguard Worker # endif
63*387f9dfdSAndroid Build Coastguard Worker 
64*387f9dfdSAndroid Build Coastguard Worker # if defined __clang__
65*387f9dfdSAndroid Build Coastguard Worker #   if (__clang_major__ > 2) || (__clang_major__ == 2) && (__clang_minor__ >= 9)
66*387f9dfdSAndroid Build Coastguard Worker #     define OPTIONAL_HAS_THIS_RVALUE_REFS 1
67*387f9dfdSAndroid Build Coastguard Worker #   else
68*387f9dfdSAndroid Build Coastguard Worker #     define OPTIONAL_HAS_THIS_RVALUE_REFS 0
69*387f9dfdSAndroid Build Coastguard Worker #   endif
70*387f9dfdSAndroid Build Coastguard Worker # elif defined TR2_OPTIONAL_GCC_4_8_1_AND_HIGHER___
71*387f9dfdSAndroid Build Coastguard Worker #   define OPTIONAL_HAS_THIS_RVALUE_REFS 1
72*387f9dfdSAndroid Build Coastguard Worker # elif defined TR2_OPTIONAL_MSVC_2015_AND_HIGHER___
73*387f9dfdSAndroid Build Coastguard Worker #   define OPTIONAL_HAS_THIS_RVALUE_REFS 1
74*387f9dfdSAndroid Build Coastguard Worker # else
75*387f9dfdSAndroid Build Coastguard Worker #   define OPTIONAL_HAS_THIS_RVALUE_REFS 0
76*387f9dfdSAndroid Build Coastguard Worker # endif
77*387f9dfdSAndroid Build Coastguard Worker 
78*387f9dfdSAndroid Build Coastguard Worker 
79*387f9dfdSAndroid Build Coastguard Worker # if defined TR2_OPTIONAL_GCC_4_8_1_AND_HIGHER___
80*387f9dfdSAndroid Build Coastguard Worker #   define OPTIONAL_HAS_CONSTEXPR_INIT_LIST 1
81*387f9dfdSAndroid Build Coastguard Worker #   define OPTIONAL_CONSTEXPR_INIT_LIST constexpr
82*387f9dfdSAndroid Build Coastguard Worker # else
83*387f9dfdSAndroid Build Coastguard Worker #   define OPTIONAL_HAS_CONSTEXPR_INIT_LIST 0
84*387f9dfdSAndroid Build Coastguard Worker #   define OPTIONAL_CONSTEXPR_INIT_LIST
85*387f9dfdSAndroid Build Coastguard Worker # endif
86*387f9dfdSAndroid Build Coastguard Worker 
87*387f9dfdSAndroid Build Coastguard Worker # if defined TR2_OPTIONAL_CLANG_3_5_AND_HIGHTER_ && (defined __cplusplus) && (__cplusplus != 201103L)
88*387f9dfdSAndroid Build Coastguard Worker #   define OPTIONAL_HAS_MOVE_ACCESSORS 1
89*387f9dfdSAndroid Build Coastguard Worker # else
90*387f9dfdSAndroid Build Coastguard Worker #   define OPTIONAL_HAS_MOVE_ACCESSORS 0
91*387f9dfdSAndroid Build Coastguard Worker # endif
92*387f9dfdSAndroid Build Coastguard Worker 
93*387f9dfdSAndroid Build Coastguard Worker # // In C++11 constexpr implies const, so we need to make non-const members also non-constexpr
94*387f9dfdSAndroid Build Coastguard Worker # if (defined __cplusplus) && (__cplusplus == 201103L)
95*387f9dfdSAndroid Build Coastguard Worker #   define OPTIONAL_MUTABLE_CONSTEXPR
96*387f9dfdSAndroid Build Coastguard Worker # else
97*387f9dfdSAndroid Build Coastguard Worker #   define OPTIONAL_MUTABLE_CONSTEXPR constexpr
98*387f9dfdSAndroid Build Coastguard Worker # endif
99*387f9dfdSAndroid Build Coastguard Worker 
100*387f9dfdSAndroid Build Coastguard Worker namespace std{
101*387f9dfdSAndroid Build Coastguard Worker 
102*387f9dfdSAndroid Build Coastguard Worker namespace experimental{
103*387f9dfdSAndroid Build Coastguard Worker 
104*387f9dfdSAndroid Build Coastguard Worker // BEGIN workaround for missing is_trivially_destructible
105*387f9dfdSAndroid Build Coastguard Worker # if defined TR2_OPTIONAL_GCC_4_8_AND_HIGHER___
106*387f9dfdSAndroid Build Coastguard Worker     // leave it: it is already there
107*387f9dfdSAndroid Build Coastguard Worker # elif defined TR2_OPTIONAL_CLANG_3_4_2_AND_HIGHER_
108*387f9dfdSAndroid Build Coastguard Worker     // leave it: it is already there
109*387f9dfdSAndroid Build Coastguard Worker # elif defined TR2_OPTIONAL_MSVC_2015_AND_HIGHER___
110*387f9dfdSAndroid Build Coastguard Worker     // leave it: it is already there
111*387f9dfdSAndroid Build Coastguard Worker # elif defined TR2_OPTIONAL_DISABLE_EMULATION_OF_TYPE_TRAITS
112*387f9dfdSAndroid Build Coastguard Worker     // leave it: the user doesn't want it
113*387f9dfdSAndroid Build Coastguard Worker # else
114*387f9dfdSAndroid Build Coastguard Worker 	template <typename T>
115*387f9dfdSAndroid Build Coastguard Worker 	using is_trivially_destructible = std::has_trivial_destructor<T>;
116*387f9dfdSAndroid Build Coastguard Worker # endif
117*387f9dfdSAndroid Build Coastguard Worker // END workaround for missing is_trivially_destructible
118*387f9dfdSAndroid Build Coastguard Worker 
119*387f9dfdSAndroid Build Coastguard Worker # if (defined TR2_OPTIONAL_GCC_4_7_AND_HIGHER___)
120*387f9dfdSAndroid Build Coastguard Worker     // leave it; our metafunctions are already defined.
121*387f9dfdSAndroid Build Coastguard Worker # elif defined TR2_OPTIONAL_CLANG_3_4_2_AND_HIGHER_
122*387f9dfdSAndroid Build Coastguard Worker     // leave it; our metafunctions are already defined.
123*387f9dfdSAndroid Build Coastguard Worker # elif defined TR2_OPTIONAL_MSVC_2015_AND_HIGHER___
124*387f9dfdSAndroid Build Coastguard Worker     // leave it: it is already there
125*387f9dfdSAndroid Build Coastguard Worker # elif defined TR2_OPTIONAL_DISABLE_EMULATION_OF_TYPE_TRAITS
126*387f9dfdSAndroid Build Coastguard Worker     // leave it: the user doesn't want it
127*387f9dfdSAndroid Build Coastguard Worker # else
128*387f9dfdSAndroid Build Coastguard Worker 
129*387f9dfdSAndroid Build Coastguard Worker 
130*387f9dfdSAndroid Build Coastguard Worker // workaround for missing traits in GCC and CLANG
131*387f9dfdSAndroid Build Coastguard Worker template <class T>
132*387f9dfdSAndroid Build Coastguard Worker struct is_nothrow_move_constructible
133*387f9dfdSAndroid Build Coastguard Worker {
134*387f9dfdSAndroid Build Coastguard Worker   constexpr static bool value = std::is_nothrow_constructible<T, T&&>::value;
135*387f9dfdSAndroid Build Coastguard Worker };
136*387f9dfdSAndroid Build Coastguard Worker 
137*387f9dfdSAndroid Build Coastguard Worker 
138*387f9dfdSAndroid Build Coastguard Worker template <class T, class U>
139*387f9dfdSAndroid Build Coastguard Worker struct is_assignable
140*387f9dfdSAndroid Build Coastguard Worker {
141*387f9dfdSAndroid Build Coastguard Worker   template <class X, class Y>
142*387f9dfdSAndroid Build Coastguard Worker   constexpr static bool has_assign(...) { return false; }
143*387f9dfdSAndroid Build Coastguard Worker 
144*387f9dfdSAndroid Build Coastguard Worker   template <class X, class Y, size_t S = sizeof((std::declval<X>() = std::declval<Y>(), true)) >
145*387f9dfdSAndroid Build Coastguard Worker   // the comma operator is necessary for the cases where operator= returns void
146*387f9dfdSAndroid Build Coastguard Worker   constexpr static bool has_assign(bool) { return true; }
147*387f9dfdSAndroid Build Coastguard Worker 
148*387f9dfdSAndroid Build Coastguard Worker   constexpr static bool value = has_assign<T, U>(true);
149*387f9dfdSAndroid Build Coastguard Worker };
150*387f9dfdSAndroid Build Coastguard Worker 
151*387f9dfdSAndroid Build Coastguard Worker 
152*387f9dfdSAndroid Build Coastguard Worker template <class T>
153*387f9dfdSAndroid Build Coastguard Worker struct is_nothrow_move_assignable
154*387f9dfdSAndroid Build Coastguard Worker {
155*387f9dfdSAndroid Build Coastguard Worker   template <class X, bool has_any_move_assign>
156*387f9dfdSAndroid Build Coastguard Worker   struct has_nothrow_move_assign {
157*387f9dfdSAndroid Build Coastguard Worker     constexpr static bool value = false;
158*387f9dfdSAndroid Build Coastguard Worker   };
159*387f9dfdSAndroid Build Coastguard Worker 
160*387f9dfdSAndroid Build Coastguard Worker   template <class X>
161*387f9dfdSAndroid Build Coastguard Worker   struct has_nothrow_move_assign<X, true> {
162*387f9dfdSAndroid Build Coastguard Worker     constexpr static bool value = noexcept( std::declval<X&>() = std::declval<X&&>() );
163*387f9dfdSAndroid Build Coastguard Worker   };
164*387f9dfdSAndroid Build Coastguard Worker 
165*387f9dfdSAndroid Build Coastguard Worker   constexpr static bool value = has_nothrow_move_assign<T, is_assignable<T&, T&&>::value>::value;
166*387f9dfdSAndroid Build Coastguard Worker };
167*387f9dfdSAndroid Build Coastguard Worker // end workaround
168*387f9dfdSAndroid Build Coastguard Worker 
169*387f9dfdSAndroid Build Coastguard Worker 
170*387f9dfdSAndroid Build Coastguard Worker # endif
171*387f9dfdSAndroid Build Coastguard Worker 
172*387f9dfdSAndroid Build Coastguard Worker 
173*387f9dfdSAndroid Build Coastguard Worker 
174*387f9dfdSAndroid Build Coastguard Worker // 20.5.4, optional for object types
175*387f9dfdSAndroid Build Coastguard Worker template <class T> class optional;
176*387f9dfdSAndroid Build Coastguard Worker 
177*387f9dfdSAndroid Build Coastguard Worker // 20.5.5, optional for lvalue reference types
178*387f9dfdSAndroid Build Coastguard Worker template <class T> class optional<T&>;
179*387f9dfdSAndroid Build Coastguard Worker 
180*387f9dfdSAndroid Build Coastguard Worker 
181*387f9dfdSAndroid Build Coastguard Worker // workaround: std utility functions aren't constexpr yet
constexpr_forward(typename std::remove_reference<T>::type & t)182*387f9dfdSAndroid Build Coastguard Worker template <class T> inline constexpr T&& constexpr_forward(typename std::remove_reference<T>::type& t) noexcept
183*387f9dfdSAndroid Build Coastguard Worker {
184*387f9dfdSAndroid Build Coastguard Worker   return static_cast<T&&>(t);
185*387f9dfdSAndroid Build Coastguard Worker }
186*387f9dfdSAndroid Build Coastguard Worker 
constexpr_forward(typename std::remove_reference<T>::type && t)187*387f9dfdSAndroid Build Coastguard Worker template <class T> inline constexpr T&& constexpr_forward(typename std::remove_reference<T>::type&& t) noexcept
188*387f9dfdSAndroid Build Coastguard Worker {
189*387f9dfdSAndroid Build Coastguard Worker     static_assert(!std::is_lvalue_reference<T>::value, "!!");
190*387f9dfdSAndroid Build Coastguard Worker     return static_cast<T&&>(t);
191*387f9dfdSAndroid Build Coastguard Worker }
192*387f9dfdSAndroid Build Coastguard Worker 
constexpr_move(T && t)193*387f9dfdSAndroid Build Coastguard Worker template <class T> inline constexpr typename std::remove_reference<T>::type&& constexpr_move(T&& t) noexcept
194*387f9dfdSAndroid Build Coastguard Worker {
195*387f9dfdSAndroid Build Coastguard Worker     return static_cast<typename std::remove_reference<T>::type&&>(t);
196*387f9dfdSAndroid Build Coastguard Worker }
197*387f9dfdSAndroid Build Coastguard Worker 
198*387f9dfdSAndroid Build Coastguard Worker 
199*387f9dfdSAndroid Build Coastguard Worker #if defined NDEBUG
200*387f9dfdSAndroid Build Coastguard Worker # define TR2_OPTIONAL_ASSERTED_EXPRESSION(CHECK, EXPR) (EXPR)
201*387f9dfdSAndroid Build Coastguard Worker #else
202*387f9dfdSAndroid Build Coastguard Worker # define TR2_OPTIONAL_ASSERTED_EXPRESSION(CHECK, EXPR) ((CHECK) ? (EXPR) : ([]{assert(!#CHECK);}(), (EXPR)))
203*387f9dfdSAndroid Build Coastguard Worker #endif
204*387f9dfdSAndroid Build Coastguard Worker 
205*387f9dfdSAndroid Build Coastguard Worker 
206*387f9dfdSAndroid Build Coastguard Worker namespace detail_
207*387f9dfdSAndroid Build Coastguard Worker {
208*387f9dfdSAndroid Build Coastguard Worker 
209*387f9dfdSAndroid Build Coastguard Worker // static_addressof: a constexpr version of addressof
210*387f9dfdSAndroid Build Coastguard Worker template <typename T>
211*387f9dfdSAndroid Build Coastguard Worker struct has_overloaded_addressof
212*387f9dfdSAndroid Build Coastguard Worker {
213*387f9dfdSAndroid Build Coastguard Worker   template <class X>
has_overloadstd::experimental::detail_::has_overloaded_addressof214*387f9dfdSAndroid Build Coastguard Worker   constexpr static bool has_overload(...) { return false; }
215*387f9dfdSAndroid Build Coastguard Worker 
216*387f9dfdSAndroid Build Coastguard Worker   template <class X, size_t S = sizeof(std::declval<X&>().operator&()) >
has_overloadstd::experimental::detail_::has_overloaded_addressof217*387f9dfdSAndroid Build Coastguard Worker   constexpr static bool has_overload(bool) { return true; }
218*387f9dfdSAndroid Build Coastguard Worker 
219*387f9dfdSAndroid Build Coastguard Worker   constexpr static bool value = has_overload<T>(true);
220*387f9dfdSAndroid Build Coastguard Worker };
221*387f9dfdSAndroid Build Coastguard Worker 
222*387f9dfdSAndroid Build Coastguard Worker template <typename T, TR2_OPTIONAL_REQUIRES(!has_overloaded_addressof<T>)>
static_addressof(T & ref)223*387f9dfdSAndroid Build Coastguard Worker constexpr T* static_addressof(T& ref)
224*387f9dfdSAndroid Build Coastguard Worker {
225*387f9dfdSAndroid Build Coastguard Worker   return &ref;
226*387f9dfdSAndroid Build Coastguard Worker }
227*387f9dfdSAndroid Build Coastguard Worker 
228*387f9dfdSAndroid Build Coastguard Worker template <typename T, TR2_OPTIONAL_REQUIRES(has_overloaded_addressof<T>)>
static_addressof(T & ref)229*387f9dfdSAndroid Build Coastguard Worker T* static_addressof(T& ref)
230*387f9dfdSAndroid Build Coastguard Worker {
231*387f9dfdSAndroid Build Coastguard Worker   return std::addressof(ref);
232*387f9dfdSAndroid Build Coastguard Worker }
233*387f9dfdSAndroid Build Coastguard Worker 
234*387f9dfdSAndroid Build Coastguard Worker 
235*387f9dfdSAndroid Build Coastguard Worker // the call to convert<A>(b) has return type A and converts b to type A iff b decltype(b) is implicitly convertible to A
236*387f9dfdSAndroid Build Coastguard Worker template <class U>
convert(U v)237*387f9dfdSAndroid Build Coastguard Worker U convert(U v) { return v; }
238*387f9dfdSAndroid Build Coastguard Worker 
239*387f9dfdSAndroid Build Coastguard Worker } // namespace detail
240*387f9dfdSAndroid Build Coastguard Worker 
241*387f9dfdSAndroid Build Coastguard Worker 
242*387f9dfdSAndroid Build Coastguard Worker constexpr struct trivial_init_t{} trivial_init{};
243*387f9dfdSAndroid Build Coastguard Worker 
244*387f9dfdSAndroid Build Coastguard Worker 
245*387f9dfdSAndroid Build Coastguard Worker // 20.5.6, In-place construction
246*387f9dfdSAndroid Build Coastguard Worker constexpr struct in_place_t{} in_place{};
247*387f9dfdSAndroid Build Coastguard Worker 
248*387f9dfdSAndroid Build Coastguard Worker 
249*387f9dfdSAndroid Build Coastguard Worker // 20.5.7, Disengaged state indicator
250*387f9dfdSAndroid Build Coastguard Worker struct nullopt_t
251*387f9dfdSAndroid Build Coastguard Worker {
252*387f9dfdSAndroid Build Coastguard Worker   struct init{};
nullopt_tstd::experimental::nullopt_t253*387f9dfdSAndroid Build Coastguard Worker   constexpr explicit nullopt_t(init){}
254*387f9dfdSAndroid Build Coastguard Worker };
255*387f9dfdSAndroid Build Coastguard Worker constexpr nullopt_t nullopt{nullopt_t::init()};
256*387f9dfdSAndroid Build Coastguard Worker 
257*387f9dfdSAndroid Build Coastguard Worker 
258*387f9dfdSAndroid Build Coastguard Worker // 20.5.8, class bad_optional_access
259*387f9dfdSAndroid Build Coastguard Worker class bad_optional_access : public logic_error {
260*387f9dfdSAndroid Build Coastguard Worker public:
bad_optional_access(const string & what_arg)261*387f9dfdSAndroid Build Coastguard Worker   explicit bad_optional_access(const string& what_arg) : logic_error{what_arg} {}
bad_optional_access(const char * what_arg)262*387f9dfdSAndroid Build Coastguard Worker   explicit bad_optional_access(const char* what_arg) : logic_error{what_arg} {}
263*387f9dfdSAndroid Build Coastguard Worker };
264*387f9dfdSAndroid Build Coastguard Worker 
265*387f9dfdSAndroid Build Coastguard Worker 
266*387f9dfdSAndroid Build Coastguard Worker template <class T>
267*387f9dfdSAndroid Build Coastguard Worker union storage_t
268*387f9dfdSAndroid Build Coastguard Worker {
269*387f9dfdSAndroid Build Coastguard Worker   unsigned char dummy_;
270*387f9dfdSAndroid Build Coastguard Worker   T value_;
271*387f9dfdSAndroid Build Coastguard Worker 
storage_t(trivial_init_t)272*387f9dfdSAndroid Build Coastguard Worker   constexpr storage_t( trivial_init_t ) noexcept : dummy_() {};
273*387f9dfdSAndroid Build Coastguard Worker 
274*387f9dfdSAndroid Build Coastguard Worker   template <class... Args>
storage_t(Args &&...args)275*387f9dfdSAndroid Build Coastguard Worker   constexpr storage_t( Args&&... args ) : value_(constexpr_forward<Args>(args)...) {}
276*387f9dfdSAndroid Build Coastguard Worker 
~storage_t()277*387f9dfdSAndroid Build Coastguard Worker   ~storage_t(){}
278*387f9dfdSAndroid Build Coastguard Worker };
279*387f9dfdSAndroid Build Coastguard Worker 
280*387f9dfdSAndroid Build Coastguard Worker 
281*387f9dfdSAndroid Build Coastguard Worker template <class T>
282*387f9dfdSAndroid Build Coastguard Worker union constexpr_storage_t
283*387f9dfdSAndroid Build Coastguard Worker {
284*387f9dfdSAndroid Build Coastguard Worker     unsigned char dummy_;
285*387f9dfdSAndroid Build Coastguard Worker     T value_;
286*387f9dfdSAndroid Build Coastguard Worker 
constexpr_storage_t(trivial_init_t)287*387f9dfdSAndroid Build Coastguard Worker     constexpr constexpr_storage_t( trivial_init_t ) noexcept : dummy_() {};
288*387f9dfdSAndroid Build Coastguard Worker 
289*387f9dfdSAndroid Build Coastguard Worker     template <class... Args>
constexpr_storage_t(Args &&...args)290*387f9dfdSAndroid Build Coastguard Worker     constexpr constexpr_storage_t( Args&&... args ) : value_(constexpr_forward<Args>(args)...) {}
291*387f9dfdSAndroid Build Coastguard Worker 
292*387f9dfdSAndroid Build Coastguard Worker     ~constexpr_storage_t() = default;
293*387f9dfdSAndroid Build Coastguard Worker };
294*387f9dfdSAndroid Build Coastguard Worker 
295*387f9dfdSAndroid Build Coastguard Worker 
296*387f9dfdSAndroid Build Coastguard Worker template <class T>
297*387f9dfdSAndroid Build Coastguard Worker struct optional_base
298*387f9dfdSAndroid Build Coastguard Worker {
299*387f9dfdSAndroid Build Coastguard Worker     bool init_;
300*387f9dfdSAndroid Build Coastguard Worker     storage_t<T> storage_;
301*387f9dfdSAndroid Build Coastguard Worker 
optional_basestd::experimental::optional_base302*387f9dfdSAndroid Build Coastguard Worker     constexpr optional_base() noexcept : init_(false), storage_(trivial_init) {};
303*387f9dfdSAndroid Build Coastguard Worker 
optional_basestd::experimental::optional_base304*387f9dfdSAndroid Build Coastguard Worker     explicit constexpr optional_base(const T& v) : init_(true), storage_(v) {}
305*387f9dfdSAndroid Build Coastguard Worker 
optional_basestd::experimental::optional_base306*387f9dfdSAndroid Build Coastguard Worker     explicit constexpr optional_base(T&& v) : init_(true), storage_(constexpr_move(v)) {}
307*387f9dfdSAndroid Build Coastguard Worker 
optional_basestd::experimental::optional_base308*387f9dfdSAndroid Build Coastguard Worker     template <class... Args> explicit optional_base(in_place_t, Args&&... args)
309*387f9dfdSAndroid Build Coastguard Worker         : init_(true), storage_(constexpr_forward<Args>(args)...) {}
310*387f9dfdSAndroid Build Coastguard Worker 
311*387f9dfdSAndroid Build Coastguard Worker     template <class U, class... Args, TR2_OPTIONAL_REQUIRES(is_constructible<T, std::initializer_list<U>>)>
optional_basestd::experimental::optional_base312*387f9dfdSAndroid Build Coastguard Worker     explicit optional_base(in_place_t, std::initializer_list<U> il, Args&&... args)
313*387f9dfdSAndroid Build Coastguard Worker         : init_(true), storage_(il, std::forward<Args>(args)...) {}
314*387f9dfdSAndroid Build Coastguard Worker 
~optional_basestd::experimental::optional_base315*387f9dfdSAndroid Build Coastguard Worker     ~optional_base() { if (init_) storage_.value_.T::~T(); }
316*387f9dfdSAndroid Build Coastguard Worker };
317*387f9dfdSAndroid Build Coastguard Worker 
318*387f9dfdSAndroid Build Coastguard Worker 
319*387f9dfdSAndroid Build Coastguard Worker template <class T>
320*387f9dfdSAndroid Build Coastguard Worker struct constexpr_optional_base
321*387f9dfdSAndroid Build Coastguard Worker {
322*387f9dfdSAndroid Build Coastguard Worker     bool init_;
323*387f9dfdSAndroid Build Coastguard Worker     constexpr_storage_t<T> storage_;
324*387f9dfdSAndroid Build Coastguard Worker 
constexpr_optional_basestd::experimental::constexpr_optional_base325*387f9dfdSAndroid Build Coastguard Worker     constexpr constexpr_optional_base() noexcept : init_(false), storage_(trivial_init) {};
326*387f9dfdSAndroid Build Coastguard Worker 
constexpr_optional_basestd::experimental::constexpr_optional_base327*387f9dfdSAndroid Build Coastguard Worker     explicit constexpr constexpr_optional_base(const T& v) : init_(true), storage_(v) {}
328*387f9dfdSAndroid Build Coastguard Worker 
constexpr_optional_basestd::experimental::constexpr_optional_base329*387f9dfdSAndroid Build Coastguard Worker     explicit constexpr constexpr_optional_base(T&& v) : init_(true), storage_(constexpr_move(v)) {}
330*387f9dfdSAndroid Build Coastguard Worker 
constexpr_optional_basestd::experimental::constexpr_optional_base331*387f9dfdSAndroid Build Coastguard Worker     template <class... Args> explicit constexpr constexpr_optional_base(in_place_t, Args&&... args)
332*387f9dfdSAndroid Build Coastguard Worker       : init_(true), storage_(constexpr_forward<Args>(args)...) {}
333*387f9dfdSAndroid Build Coastguard Worker 
334*387f9dfdSAndroid Build Coastguard Worker     template <class U, class... Args, TR2_OPTIONAL_REQUIRES(is_constructible<T, std::initializer_list<U>>)>
constexpr_optional_basestd::experimental::constexpr_optional_base335*387f9dfdSAndroid Build Coastguard Worker     OPTIONAL_CONSTEXPR_INIT_LIST explicit constexpr_optional_base(in_place_t, std::initializer_list<U> il, Args&&... args)
336*387f9dfdSAndroid Build Coastguard Worker       : init_(true), storage_(il, std::forward<Args>(args)...) {}
337*387f9dfdSAndroid Build Coastguard Worker 
338*387f9dfdSAndroid Build Coastguard Worker     ~constexpr_optional_base() = default;
339*387f9dfdSAndroid Build Coastguard Worker };
340*387f9dfdSAndroid Build Coastguard Worker 
341*387f9dfdSAndroid Build Coastguard Worker template <class T>
342*387f9dfdSAndroid Build Coastguard Worker using OptionalBase = typename std::conditional<
343*387f9dfdSAndroid Build Coastguard Worker     is_trivially_destructible<T>::value,
344*387f9dfdSAndroid Build Coastguard Worker     constexpr_optional_base<T>,
345*387f9dfdSAndroid Build Coastguard Worker     optional_base<T>
346*387f9dfdSAndroid Build Coastguard Worker >::type;
347*387f9dfdSAndroid Build Coastguard Worker 
348*387f9dfdSAndroid Build Coastguard Worker 
349*387f9dfdSAndroid Build Coastguard Worker 
350*387f9dfdSAndroid Build Coastguard Worker template <class T>
351*387f9dfdSAndroid Build Coastguard Worker class optional : private OptionalBase<T>
352*387f9dfdSAndroid Build Coastguard Worker {
353*387f9dfdSAndroid Build Coastguard Worker   static_assert( !std::is_same<typename std::decay<T>::type, nullopt_t>::value, "bad T" );
354*387f9dfdSAndroid Build Coastguard Worker   static_assert( !std::is_same<typename std::decay<T>::type, in_place_t>::value, "bad T" );
355*387f9dfdSAndroid Build Coastguard Worker 
356*387f9dfdSAndroid Build Coastguard Worker 
initialized() const357*387f9dfdSAndroid Build Coastguard Worker   constexpr bool initialized() const noexcept { return OptionalBase<T>::init_; }
dataptr()358*387f9dfdSAndroid Build Coastguard Worker   T* dataptr() {  return std::addressof(OptionalBase<T>::storage_.value_); }
dataptr() const359*387f9dfdSAndroid Build Coastguard Worker   constexpr const T* dataptr() const { return detail_::static_addressof(OptionalBase<T>::storage_.value_); }
360*387f9dfdSAndroid Build Coastguard Worker 
361*387f9dfdSAndroid Build Coastguard Worker # if OPTIONAL_HAS_THIS_RVALUE_REFS == 1
contained_val() const362*387f9dfdSAndroid Build Coastguard Worker   constexpr const T& contained_val() const& { return OptionalBase<T>::storage_.value_; }
363*387f9dfdSAndroid Build Coastguard Worker #   if OPTIONAL_HAS_MOVE_ACCESSORS == 1
contained_val()364*387f9dfdSAndroid Build Coastguard Worker   OPTIONAL_MUTABLE_CONSTEXPR T&& contained_val() && { return std::move(OptionalBase<T>::storage_.value_); }
contained_val()365*387f9dfdSAndroid Build Coastguard Worker   OPTIONAL_MUTABLE_CONSTEXPR T& contained_val() & { return OptionalBase<T>::storage_.value_; }
366*387f9dfdSAndroid Build Coastguard Worker #   else
contained_val()367*387f9dfdSAndroid Build Coastguard Worker   T& contained_val() & { return OptionalBase<T>::storage_.value_; }
contained_val()368*387f9dfdSAndroid Build Coastguard Worker   T&& contained_val() && { return std::move(OptionalBase<T>::storage_.value_); }
369*387f9dfdSAndroid Build Coastguard Worker #   endif
370*387f9dfdSAndroid Build Coastguard Worker # else
contained_val() const371*387f9dfdSAndroid Build Coastguard Worker   constexpr const T& contained_val() const { return OptionalBase<T>::storage_.value_; }
contained_val()372*387f9dfdSAndroid Build Coastguard Worker   T& contained_val() { return OptionalBase<T>::storage_.value_; }
373*387f9dfdSAndroid Build Coastguard Worker # endif
374*387f9dfdSAndroid Build Coastguard Worker 
clear()375*387f9dfdSAndroid Build Coastguard Worker   void clear() noexcept {
376*387f9dfdSAndroid Build Coastguard Worker     if (initialized()) dataptr()->T::~T();
377*387f9dfdSAndroid Build Coastguard Worker     OptionalBase<T>::init_ = false;
378*387f9dfdSAndroid Build Coastguard Worker   }
379*387f9dfdSAndroid Build Coastguard Worker 
380*387f9dfdSAndroid Build Coastguard Worker   template <class... Args>
initialize(Args &&...args)381*387f9dfdSAndroid Build Coastguard Worker   void initialize(Args&&... args) noexcept(noexcept(T(std::forward<Args>(args)...)))
382*387f9dfdSAndroid Build Coastguard Worker   {
383*387f9dfdSAndroid Build Coastguard Worker     assert(!OptionalBase<T>::init_);
384*387f9dfdSAndroid Build Coastguard Worker     ::new (static_cast<void*>(dataptr())) T(std::forward<Args>(args)...);
385*387f9dfdSAndroid Build Coastguard Worker     OptionalBase<T>::init_ = true;
386*387f9dfdSAndroid Build Coastguard Worker   }
387*387f9dfdSAndroid Build Coastguard Worker 
388*387f9dfdSAndroid Build Coastguard Worker   template <class U, class... Args>
initialize(std::initializer_list<U> il,Args &&...args)389*387f9dfdSAndroid Build Coastguard Worker   void initialize(std::initializer_list<U> il, Args&&... args) noexcept(noexcept(T(il, std::forward<Args>(args)...)))
390*387f9dfdSAndroid Build Coastguard Worker   {
391*387f9dfdSAndroid Build Coastguard Worker     assert(!OptionalBase<T>::init_);
392*387f9dfdSAndroid Build Coastguard Worker     ::new (static_cast<void*>(dataptr())) T(il, std::forward<Args>(args)...);
393*387f9dfdSAndroid Build Coastguard Worker     OptionalBase<T>::init_ = true;
394*387f9dfdSAndroid Build Coastguard Worker   }
395*387f9dfdSAndroid Build Coastguard Worker 
396*387f9dfdSAndroid Build Coastguard Worker public:
397*387f9dfdSAndroid Build Coastguard Worker   typedef T value_type;
398*387f9dfdSAndroid Build Coastguard Worker 
399*387f9dfdSAndroid Build Coastguard Worker   // 20.5.5.1, constructors
optional()400*387f9dfdSAndroid Build Coastguard Worker   constexpr optional() noexcept : OptionalBase<T>()  {};
optional(nullopt_t)401*387f9dfdSAndroid Build Coastguard Worker   constexpr optional(nullopt_t) noexcept : OptionalBase<T>() {};
402*387f9dfdSAndroid Build Coastguard Worker 
optional(const optional & rhs)403*387f9dfdSAndroid Build Coastguard Worker   optional(const optional& rhs)
404*387f9dfdSAndroid Build Coastguard Worker   : OptionalBase<T>()
405*387f9dfdSAndroid Build Coastguard Worker   {
406*387f9dfdSAndroid Build Coastguard Worker     if (rhs.initialized()) {
407*387f9dfdSAndroid Build Coastguard Worker         ::new (static_cast<void*>(dataptr())) T(*rhs);
408*387f9dfdSAndroid Build Coastguard Worker         OptionalBase<T>::init_ = true;
409*387f9dfdSAndroid Build Coastguard Worker     }
410*387f9dfdSAndroid Build Coastguard Worker   }
411*387f9dfdSAndroid Build Coastguard Worker 
optional(optional && rhs)412*387f9dfdSAndroid Build Coastguard Worker   optional(optional&& rhs) noexcept(is_nothrow_move_constructible<T>::value)
413*387f9dfdSAndroid Build Coastguard Worker   : OptionalBase<T>()
414*387f9dfdSAndroid Build Coastguard Worker   {
415*387f9dfdSAndroid Build Coastguard Worker     if (rhs.initialized()) {
416*387f9dfdSAndroid Build Coastguard Worker         ::new (static_cast<void*>(dataptr())) T(std::move(*rhs));
417*387f9dfdSAndroid Build Coastguard Worker         OptionalBase<T>::init_ = true;
418*387f9dfdSAndroid Build Coastguard Worker     }
419*387f9dfdSAndroid Build Coastguard Worker   }
420*387f9dfdSAndroid Build Coastguard Worker 
optional(const T & v)421*387f9dfdSAndroid Build Coastguard Worker   constexpr optional(const T& v) : OptionalBase<T>(v) {}
422*387f9dfdSAndroid Build Coastguard Worker 
optional(T && v)423*387f9dfdSAndroid Build Coastguard Worker   constexpr optional(T&& v) : OptionalBase<T>(constexpr_move(v)) {}
424*387f9dfdSAndroid Build Coastguard Worker 
425*387f9dfdSAndroid Build Coastguard Worker   template <class... Args>
optional(in_place_t,Args &&...args)426*387f9dfdSAndroid Build Coastguard Worker   explicit constexpr optional(in_place_t, Args&&... args)
427*387f9dfdSAndroid Build Coastguard Worker   : OptionalBase<T>(in_place_t{}, constexpr_forward<Args>(args)...) {}
428*387f9dfdSAndroid Build Coastguard Worker 
429*387f9dfdSAndroid Build Coastguard Worker   template <class U, class... Args, TR2_OPTIONAL_REQUIRES(is_constructible<T, std::initializer_list<U>>)>
optional(in_place_t,std::initializer_list<U> il,Args &&...args)430*387f9dfdSAndroid Build Coastguard Worker   OPTIONAL_CONSTEXPR_INIT_LIST explicit optional(in_place_t, std::initializer_list<U> il, Args&&... args)
431*387f9dfdSAndroid Build Coastguard Worker   : OptionalBase<T>(in_place_t{}, il, constexpr_forward<Args>(args)...) {}
432*387f9dfdSAndroid Build Coastguard Worker 
433*387f9dfdSAndroid Build Coastguard Worker   // 20.5.4.2, Destructor
434*387f9dfdSAndroid Build Coastguard Worker   ~optional() = default;
435*387f9dfdSAndroid Build Coastguard Worker 
436*387f9dfdSAndroid Build Coastguard Worker   // 20.5.4.3, assignment
operator =(nullopt_t)437*387f9dfdSAndroid Build Coastguard Worker   optional& operator=(nullopt_t) noexcept
438*387f9dfdSAndroid Build Coastguard Worker   {
439*387f9dfdSAndroid Build Coastguard Worker     clear();
440*387f9dfdSAndroid Build Coastguard Worker     return *this;
441*387f9dfdSAndroid Build Coastguard Worker   }
442*387f9dfdSAndroid Build Coastguard Worker 
operator =(const optional & rhs)443*387f9dfdSAndroid Build Coastguard Worker   optional& operator=(const optional& rhs)
444*387f9dfdSAndroid Build Coastguard Worker   {
445*387f9dfdSAndroid Build Coastguard Worker     if      (initialized() == true  && rhs.initialized() == false) clear();
446*387f9dfdSAndroid Build Coastguard Worker     else if (initialized() == false && rhs.initialized() == true)  initialize(*rhs);
447*387f9dfdSAndroid Build Coastguard Worker     else if (initialized() == true  && rhs.initialized() == true)  contained_val() = *rhs;
448*387f9dfdSAndroid Build Coastguard Worker     return *this;
449*387f9dfdSAndroid Build Coastguard Worker   }
450*387f9dfdSAndroid Build Coastguard Worker 
operator =(optional && rhs)451*387f9dfdSAndroid Build Coastguard Worker   optional& operator=(optional&& rhs)
452*387f9dfdSAndroid Build Coastguard Worker   noexcept(is_nothrow_move_assignable<T>::value && is_nothrow_move_constructible<T>::value)
453*387f9dfdSAndroid Build Coastguard Worker   {
454*387f9dfdSAndroid Build Coastguard Worker     if      (initialized() == true  && rhs.initialized() == false) clear();
455*387f9dfdSAndroid Build Coastguard Worker     else if (initialized() == false && rhs.initialized() == true)  initialize(std::move(*rhs));
456*387f9dfdSAndroid Build Coastguard Worker     else if (initialized() == true  && rhs.initialized() == true)  contained_val() = std::move(*rhs);
457*387f9dfdSAndroid Build Coastguard Worker     return *this;
458*387f9dfdSAndroid Build Coastguard Worker   }
459*387f9dfdSAndroid Build Coastguard Worker 
460*387f9dfdSAndroid Build Coastguard Worker   template <class U>
operator =(U && v)461*387f9dfdSAndroid Build Coastguard Worker   auto operator=(U&& v)
462*387f9dfdSAndroid Build Coastguard Worker   -> typename enable_if
463*387f9dfdSAndroid Build Coastguard Worker   <
464*387f9dfdSAndroid Build Coastguard Worker     is_same<typename decay<U>::type, T>::value,
465*387f9dfdSAndroid Build Coastguard Worker     optional&
466*387f9dfdSAndroid Build Coastguard Worker   >::type
467*387f9dfdSAndroid Build Coastguard Worker   {
468*387f9dfdSAndroid Build Coastguard Worker     if (initialized()) { contained_val() = std::forward<U>(v); }
469*387f9dfdSAndroid Build Coastguard Worker     else               { initialize(std::forward<U>(v));  }
470*387f9dfdSAndroid Build Coastguard Worker     return *this;
471*387f9dfdSAndroid Build Coastguard Worker   }
472*387f9dfdSAndroid Build Coastguard Worker 
473*387f9dfdSAndroid Build Coastguard Worker 
474*387f9dfdSAndroid Build Coastguard Worker   template <class... Args>
emplace(Args &&...args)475*387f9dfdSAndroid Build Coastguard Worker   void emplace(Args&&... args)
476*387f9dfdSAndroid Build Coastguard Worker   {
477*387f9dfdSAndroid Build Coastguard Worker     clear();
478*387f9dfdSAndroid Build Coastguard Worker     initialize(std::forward<Args>(args)...);
479*387f9dfdSAndroid Build Coastguard Worker   }
480*387f9dfdSAndroid Build Coastguard Worker 
481*387f9dfdSAndroid Build Coastguard Worker   template <class U, class... Args>
emplace(initializer_list<U> il,Args &&...args)482*387f9dfdSAndroid Build Coastguard Worker   void emplace(initializer_list<U> il, Args&&... args)
483*387f9dfdSAndroid Build Coastguard Worker   {
484*387f9dfdSAndroid Build Coastguard Worker     clear();
485*387f9dfdSAndroid Build Coastguard Worker     initialize<U, Args...>(il, std::forward<Args>(args)...);
486*387f9dfdSAndroid Build Coastguard Worker   }
487*387f9dfdSAndroid Build Coastguard Worker 
488*387f9dfdSAndroid Build Coastguard Worker   // 20.5.4.4, Swap
swap(optional<T> & rhs)489*387f9dfdSAndroid Build Coastguard Worker   void swap(optional<T>& rhs) noexcept(is_nothrow_move_constructible<T>::value && noexcept(swap(declval<T&>(), declval<T&>())))
490*387f9dfdSAndroid Build Coastguard Worker   {
491*387f9dfdSAndroid Build Coastguard Worker     if      (initialized() == true  && rhs.initialized() == false) { rhs.initialize(std::move(**this)); clear(); }
492*387f9dfdSAndroid Build Coastguard Worker     else if (initialized() == false && rhs.initialized() == true)  { initialize(std::move(*rhs)); rhs.clear(); }
493*387f9dfdSAndroid Build Coastguard Worker     else if (initialized() == true  && rhs.initialized() == true)  { using std::swap; swap(**this, *rhs); }
494*387f9dfdSAndroid Build Coastguard Worker   }
495*387f9dfdSAndroid Build Coastguard Worker 
496*387f9dfdSAndroid Build Coastguard Worker   // 20.5.4.5, Observers
497*387f9dfdSAndroid Build Coastguard Worker 
operator bool() const498*387f9dfdSAndroid Build Coastguard Worker   explicit constexpr operator bool() const noexcept { return initialized(); }
499*387f9dfdSAndroid Build Coastguard Worker 
operator ->() const500*387f9dfdSAndroid Build Coastguard Worker   constexpr T const* operator ->() const {
501*387f9dfdSAndroid Build Coastguard Worker     return TR2_OPTIONAL_ASSERTED_EXPRESSION(initialized(), dataptr());
502*387f9dfdSAndroid Build Coastguard Worker   }
503*387f9dfdSAndroid Build Coastguard Worker 
504*387f9dfdSAndroid Build Coastguard Worker # if OPTIONAL_HAS_MOVE_ACCESSORS == 1
505*387f9dfdSAndroid Build Coastguard Worker 
operator ->()506*387f9dfdSAndroid Build Coastguard Worker   OPTIONAL_MUTABLE_CONSTEXPR T* operator ->() {
507*387f9dfdSAndroid Build Coastguard Worker     assert (initialized());
508*387f9dfdSAndroid Build Coastguard Worker     return dataptr();
509*387f9dfdSAndroid Build Coastguard Worker   }
510*387f9dfdSAndroid Build Coastguard Worker 
operator *() const511*387f9dfdSAndroid Build Coastguard Worker   constexpr T const& operator *() const& {
512*387f9dfdSAndroid Build Coastguard Worker     return TR2_OPTIONAL_ASSERTED_EXPRESSION(initialized(), contained_val());
513*387f9dfdSAndroid Build Coastguard Worker   }
514*387f9dfdSAndroid Build Coastguard Worker 
operator *()515*387f9dfdSAndroid Build Coastguard Worker   OPTIONAL_MUTABLE_CONSTEXPR T& operator *() & {
516*387f9dfdSAndroid Build Coastguard Worker     assert (initialized());
517*387f9dfdSAndroid Build Coastguard Worker     return contained_val();
518*387f9dfdSAndroid Build Coastguard Worker   }
519*387f9dfdSAndroid Build Coastguard Worker 
operator *()520*387f9dfdSAndroid Build Coastguard Worker   OPTIONAL_MUTABLE_CONSTEXPR T&& operator *() && {
521*387f9dfdSAndroid Build Coastguard Worker     assert (initialized());
522*387f9dfdSAndroid Build Coastguard Worker     return constexpr_move(contained_val());
523*387f9dfdSAndroid Build Coastguard Worker   }
524*387f9dfdSAndroid Build Coastguard Worker 
value() const525*387f9dfdSAndroid Build Coastguard Worker   constexpr T const& value() const& {
526*387f9dfdSAndroid Build Coastguard Worker     return initialized() ? contained_val() : (throw bad_optional_access("bad optional access"), contained_val());
527*387f9dfdSAndroid Build Coastguard Worker   }
528*387f9dfdSAndroid Build Coastguard Worker 
value()529*387f9dfdSAndroid Build Coastguard Worker   OPTIONAL_MUTABLE_CONSTEXPR T& value() & {
530*387f9dfdSAndroid Build Coastguard Worker     return initialized() ? contained_val() : (throw bad_optional_access("bad optional access"), contained_val());
531*387f9dfdSAndroid Build Coastguard Worker   }
532*387f9dfdSAndroid Build Coastguard Worker 
value()533*387f9dfdSAndroid Build Coastguard Worker   OPTIONAL_MUTABLE_CONSTEXPR T&& value() && {
534*387f9dfdSAndroid Build Coastguard Worker     if (!initialized()) throw bad_optional_access("bad optional access");
535*387f9dfdSAndroid Build Coastguard Worker 	return std::move(contained_val());
536*387f9dfdSAndroid Build Coastguard Worker   }
537*387f9dfdSAndroid Build Coastguard Worker 
538*387f9dfdSAndroid Build Coastguard Worker # else
539*387f9dfdSAndroid Build Coastguard Worker 
operator ->()540*387f9dfdSAndroid Build Coastguard Worker   T* operator ->() {
541*387f9dfdSAndroid Build Coastguard Worker     assert (initialized());
542*387f9dfdSAndroid Build Coastguard Worker     return dataptr();
543*387f9dfdSAndroid Build Coastguard Worker   }
544*387f9dfdSAndroid Build Coastguard Worker 
operator *() const545*387f9dfdSAndroid Build Coastguard Worker   constexpr T const& operator *() const {
546*387f9dfdSAndroid Build Coastguard Worker     return TR2_OPTIONAL_ASSERTED_EXPRESSION(initialized(), contained_val());
547*387f9dfdSAndroid Build Coastguard Worker   }
548*387f9dfdSAndroid Build Coastguard Worker 
operator *()549*387f9dfdSAndroid Build Coastguard Worker   T& operator *() {
550*387f9dfdSAndroid Build Coastguard Worker     assert (initialized());
551*387f9dfdSAndroid Build Coastguard Worker     return contained_val();
552*387f9dfdSAndroid Build Coastguard Worker   }
553*387f9dfdSAndroid Build Coastguard Worker 
value() const554*387f9dfdSAndroid Build Coastguard Worker   constexpr T const& value() const {
555*387f9dfdSAndroid Build Coastguard Worker     return initialized() ? contained_val() : (throw bad_optional_access("bad optional access"), contained_val());
556*387f9dfdSAndroid Build Coastguard Worker   }
557*387f9dfdSAndroid Build Coastguard Worker 
value()558*387f9dfdSAndroid Build Coastguard Worker   T& value() {
559*387f9dfdSAndroid Build Coastguard Worker     return initialized() ? contained_val() : (throw bad_optional_access("bad optional access"), contained_val());
560*387f9dfdSAndroid Build Coastguard Worker   }
561*387f9dfdSAndroid Build Coastguard Worker 
562*387f9dfdSAndroid Build Coastguard Worker # endif
563*387f9dfdSAndroid Build Coastguard Worker 
564*387f9dfdSAndroid Build Coastguard Worker # if OPTIONAL_HAS_THIS_RVALUE_REFS == 1
565*387f9dfdSAndroid Build Coastguard Worker 
566*387f9dfdSAndroid Build Coastguard Worker   template <class V>
value_or(V && v) const567*387f9dfdSAndroid Build Coastguard Worker   constexpr T value_or(V&& v) const&
568*387f9dfdSAndroid Build Coastguard Worker   {
569*387f9dfdSAndroid Build Coastguard Worker     return *this ? **this : detail_::convert<T>(constexpr_forward<V>(v));
570*387f9dfdSAndroid Build Coastguard Worker   }
571*387f9dfdSAndroid Build Coastguard Worker 
572*387f9dfdSAndroid Build Coastguard Worker #   if OPTIONAL_HAS_MOVE_ACCESSORS == 1
573*387f9dfdSAndroid Build Coastguard Worker 
574*387f9dfdSAndroid Build Coastguard Worker   template <class V>
value_or(V && v)575*387f9dfdSAndroid Build Coastguard Worker   OPTIONAL_MUTABLE_CONSTEXPR T value_or(V&& v) &&
576*387f9dfdSAndroid Build Coastguard Worker   {
577*387f9dfdSAndroid Build Coastguard Worker     return *this ? constexpr_move(const_cast<optional<T>&>(*this).contained_val()) : detail_::convert<T>(constexpr_forward<V>(v));
578*387f9dfdSAndroid Build Coastguard Worker   }
579*387f9dfdSAndroid Build Coastguard Worker 
580*387f9dfdSAndroid Build Coastguard Worker #   else
581*387f9dfdSAndroid Build Coastguard Worker 
582*387f9dfdSAndroid Build Coastguard Worker   template <class V>
value_or(V && v)583*387f9dfdSAndroid Build Coastguard Worker   T value_or(V&& v) &&
584*387f9dfdSAndroid Build Coastguard Worker   {
585*387f9dfdSAndroid Build Coastguard Worker     return *this ? constexpr_move(const_cast<optional<T>&>(*this).contained_val()) : detail_::convert<T>(constexpr_forward<V>(v));
586*387f9dfdSAndroid Build Coastguard Worker   }
587*387f9dfdSAndroid Build Coastguard Worker 
588*387f9dfdSAndroid Build Coastguard Worker #   endif
589*387f9dfdSAndroid Build Coastguard Worker 
590*387f9dfdSAndroid Build Coastguard Worker # else
591*387f9dfdSAndroid Build Coastguard Worker 
592*387f9dfdSAndroid Build Coastguard Worker   template <class V>
value_or(V && v) const593*387f9dfdSAndroid Build Coastguard Worker   constexpr T value_or(V&& v) const
594*387f9dfdSAndroid Build Coastguard Worker   {
595*387f9dfdSAndroid Build Coastguard Worker     return *this ? **this : detail_::convert<T>(constexpr_forward<V>(v));
596*387f9dfdSAndroid Build Coastguard Worker   }
597*387f9dfdSAndroid Build Coastguard Worker 
598*387f9dfdSAndroid Build Coastguard Worker # endif
599*387f9dfdSAndroid Build Coastguard Worker 
600*387f9dfdSAndroid Build Coastguard Worker };
601*387f9dfdSAndroid Build Coastguard Worker 
602*387f9dfdSAndroid Build Coastguard Worker 
603*387f9dfdSAndroid Build Coastguard Worker template <class T>
604*387f9dfdSAndroid Build Coastguard Worker class optional<T&>
605*387f9dfdSAndroid Build Coastguard Worker {
606*387f9dfdSAndroid Build Coastguard Worker   static_assert( !std::is_same<T, nullopt_t>::value, "bad T" );
607*387f9dfdSAndroid Build Coastguard Worker   static_assert( !std::is_same<T, in_place_t>::value, "bad T" );
608*387f9dfdSAndroid Build Coastguard Worker   T* ref;
609*387f9dfdSAndroid Build Coastguard Worker 
610*387f9dfdSAndroid Build Coastguard Worker public:
611*387f9dfdSAndroid Build Coastguard Worker 
612*387f9dfdSAndroid Build Coastguard Worker   // 20.5.5.1, construction/destruction
optional()613*387f9dfdSAndroid Build Coastguard Worker   constexpr optional() noexcept : ref(nullptr) {}
614*387f9dfdSAndroid Build Coastguard Worker 
optional(nullopt_t)615*387f9dfdSAndroid Build Coastguard Worker   constexpr optional(nullopt_t) noexcept : ref(nullptr) {}
616*387f9dfdSAndroid Build Coastguard Worker 
optional(T & v)617*387f9dfdSAndroid Build Coastguard Worker   constexpr optional(T& v) noexcept : ref(detail_::static_addressof(v)) {}
618*387f9dfdSAndroid Build Coastguard Worker 
619*387f9dfdSAndroid Build Coastguard Worker   optional(T&&) = delete;
620*387f9dfdSAndroid Build Coastguard Worker 
optional(const optional & rhs)621*387f9dfdSAndroid Build Coastguard Worker   constexpr optional(const optional& rhs) noexcept : ref(rhs.ref) {}
622*387f9dfdSAndroid Build Coastguard Worker 
optional(in_place_t,T & v)623*387f9dfdSAndroid Build Coastguard Worker   explicit constexpr optional(in_place_t, T& v) noexcept : ref(detail_::static_addressof(v)) {}
624*387f9dfdSAndroid Build Coastguard Worker 
625*387f9dfdSAndroid Build Coastguard Worker   explicit optional(in_place_t, T&&) = delete;
626*387f9dfdSAndroid Build Coastguard Worker 
627*387f9dfdSAndroid Build Coastguard Worker   ~optional() = default;
628*387f9dfdSAndroid Build Coastguard Worker 
629*387f9dfdSAndroid Build Coastguard Worker   // 20.5.5.2, mutation
operator =(nullopt_t)630*387f9dfdSAndroid Build Coastguard Worker   optional& operator=(nullopt_t) noexcept {
631*387f9dfdSAndroid Build Coastguard Worker     ref = nullptr;
632*387f9dfdSAndroid Build Coastguard Worker     return *this;
633*387f9dfdSAndroid Build Coastguard Worker   }
634*387f9dfdSAndroid Build Coastguard Worker 
635*387f9dfdSAndroid Build Coastguard Worker   // optional& operator=(const optional& rhs) noexcept {
636*387f9dfdSAndroid Build Coastguard Worker     // ref = rhs.ref;
637*387f9dfdSAndroid Build Coastguard Worker     // return *this;
638*387f9dfdSAndroid Build Coastguard Worker   // }
639*387f9dfdSAndroid Build Coastguard Worker 
640*387f9dfdSAndroid Build Coastguard Worker   // optional& operator=(optional&& rhs) noexcept {
641*387f9dfdSAndroid Build Coastguard Worker     // ref = rhs.ref;
642*387f9dfdSAndroid Build Coastguard Worker     // return *this;
643*387f9dfdSAndroid Build Coastguard Worker   // }
644*387f9dfdSAndroid Build Coastguard Worker 
645*387f9dfdSAndroid Build Coastguard Worker   template <typename U>
operator =(U && rhs)646*387f9dfdSAndroid Build Coastguard Worker   auto operator=(U&& rhs) noexcept
647*387f9dfdSAndroid Build Coastguard Worker   -> typename enable_if
648*387f9dfdSAndroid Build Coastguard Worker   <
649*387f9dfdSAndroid Build Coastguard Worker     is_same<typename decay<U>::type, optional<T&>>::value,
650*387f9dfdSAndroid Build Coastguard Worker     optional&
651*387f9dfdSAndroid Build Coastguard Worker   >::type
652*387f9dfdSAndroid Build Coastguard Worker   {
653*387f9dfdSAndroid Build Coastguard Worker     ref = rhs.ref;
654*387f9dfdSAndroid Build Coastguard Worker     return *this;
655*387f9dfdSAndroid Build Coastguard Worker   }
656*387f9dfdSAndroid Build Coastguard Worker 
657*387f9dfdSAndroid Build Coastguard Worker   template <typename U>
658*387f9dfdSAndroid Build Coastguard Worker   auto operator=(U&& rhs) noexcept
659*387f9dfdSAndroid Build Coastguard Worker   -> typename enable_if
660*387f9dfdSAndroid Build Coastguard Worker   <
661*387f9dfdSAndroid Build Coastguard Worker     !is_same<typename decay<U>::type, optional<T&>>::value,
662*387f9dfdSAndroid Build Coastguard Worker     optional&
663*387f9dfdSAndroid Build Coastguard Worker   >::type
664*387f9dfdSAndroid Build Coastguard Worker   = delete;
665*387f9dfdSAndroid Build Coastguard Worker 
emplace(T & v)666*387f9dfdSAndroid Build Coastguard Worker   void emplace(T& v) noexcept {
667*387f9dfdSAndroid Build Coastguard Worker     ref = detail_::static_addressof(v);
668*387f9dfdSAndroid Build Coastguard Worker   }
669*387f9dfdSAndroid Build Coastguard Worker 
670*387f9dfdSAndroid Build Coastguard Worker   void emplace(T&&) = delete;
671*387f9dfdSAndroid Build Coastguard Worker 
672*387f9dfdSAndroid Build Coastguard Worker 
swap(optional<T &> & rhs)673*387f9dfdSAndroid Build Coastguard Worker   void swap(optional<T&>& rhs) noexcept
674*387f9dfdSAndroid Build Coastguard Worker   {
675*387f9dfdSAndroid Build Coastguard Worker     std::swap(ref, rhs.ref);
676*387f9dfdSAndroid Build Coastguard Worker   }
677*387f9dfdSAndroid Build Coastguard Worker 
678*387f9dfdSAndroid Build Coastguard Worker   // 20.5.5.3, observers
operator ->() const679*387f9dfdSAndroid Build Coastguard Worker   constexpr T* operator->() const {
680*387f9dfdSAndroid Build Coastguard Worker     return TR2_OPTIONAL_ASSERTED_EXPRESSION(ref, ref);
681*387f9dfdSAndroid Build Coastguard Worker   }
682*387f9dfdSAndroid Build Coastguard Worker 
operator *() const683*387f9dfdSAndroid Build Coastguard Worker   constexpr T& operator*() const {
684*387f9dfdSAndroid Build Coastguard Worker     return TR2_OPTIONAL_ASSERTED_EXPRESSION(ref, *ref);
685*387f9dfdSAndroid Build Coastguard Worker   }
686*387f9dfdSAndroid Build Coastguard Worker 
value() const687*387f9dfdSAndroid Build Coastguard Worker   constexpr T& value() const {
688*387f9dfdSAndroid Build Coastguard Worker     return ref ? *ref : (throw bad_optional_access("bad optional access"), *ref);
689*387f9dfdSAndroid Build Coastguard Worker   }
690*387f9dfdSAndroid Build Coastguard Worker 
operator bool() const691*387f9dfdSAndroid Build Coastguard Worker   explicit constexpr operator bool() const noexcept {
692*387f9dfdSAndroid Build Coastguard Worker     return ref != nullptr;
693*387f9dfdSAndroid Build Coastguard Worker   }
694*387f9dfdSAndroid Build Coastguard Worker 
695*387f9dfdSAndroid Build Coastguard Worker   template <class V>
value_or(V && v) const696*387f9dfdSAndroid Build Coastguard Worker   constexpr typename decay<T>::type value_or(V&& v) const
697*387f9dfdSAndroid Build Coastguard Worker   {
698*387f9dfdSAndroid Build Coastguard Worker     return *this ? **this : detail_::convert<typename decay<T>::type>(constexpr_forward<V>(v));
699*387f9dfdSAndroid Build Coastguard Worker   }
700*387f9dfdSAndroid Build Coastguard Worker };
701*387f9dfdSAndroid Build Coastguard Worker 
702*387f9dfdSAndroid Build Coastguard Worker 
703*387f9dfdSAndroid Build Coastguard Worker template <class T>
704*387f9dfdSAndroid Build Coastguard Worker class optional<T&&>
705*387f9dfdSAndroid Build Coastguard Worker {
706*387f9dfdSAndroid Build Coastguard Worker   static_assert( sizeof(T) == 0, "optional rvalue references disallowed" );
707*387f9dfdSAndroid Build Coastguard Worker };
708*387f9dfdSAndroid Build Coastguard Worker 
709*387f9dfdSAndroid Build Coastguard Worker 
710*387f9dfdSAndroid Build Coastguard Worker // 20.5.8, Relational operators
operator ==(const optional<T> & x,const optional<T> & y)711*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator==(const optional<T>& x, const optional<T>& y)
712*387f9dfdSAndroid Build Coastguard Worker {
713*387f9dfdSAndroid Build Coastguard Worker   return bool(x) != bool(y) ? false : bool(x) == false ? true : *x == *y;
714*387f9dfdSAndroid Build Coastguard Worker }
715*387f9dfdSAndroid Build Coastguard Worker 
operator !=(const optional<T> & x,const optional<T> & y)716*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator!=(const optional<T>& x, const optional<T>& y)
717*387f9dfdSAndroid Build Coastguard Worker {
718*387f9dfdSAndroid Build Coastguard Worker   return !(x == y);
719*387f9dfdSAndroid Build Coastguard Worker }
720*387f9dfdSAndroid Build Coastguard Worker 
operator <(const optional<T> & x,const optional<T> & y)721*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator<(const optional<T>& x, const optional<T>& y)
722*387f9dfdSAndroid Build Coastguard Worker {
723*387f9dfdSAndroid Build Coastguard Worker   return (!y) ? false : (!x) ? true : *x < *y;
724*387f9dfdSAndroid Build Coastguard Worker }
725*387f9dfdSAndroid Build Coastguard Worker 
operator >(const optional<T> & x,const optional<T> & y)726*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator>(const optional<T>& x, const optional<T>& y)
727*387f9dfdSAndroid Build Coastguard Worker {
728*387f9dfdSAndroid Build Coastguard Worker   return (y < x);
729*387f9dfdSAndroid Build Coastguard Worker }
730*387f9dfdSAndroid Build Coastguard Worker 
operator <=(const optional<T> & x,const optional<T> & y)731*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator<=(const optional<T>& x, const optional<T>& y)
732*387f9dfdSAndroid Build Coastguard Worker {
733*387f9dfdSAndroid Build Coastguard Worker   return !(y < x);
734*387f9dfdSAndroid Build Coastguard Worker }
735*387f9dfdSAndroid Build Coastguard Worker 
operator >=(const optional<T> & x,const optional<T> & y)736*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator>=(const optional<T>& x, const optional<T>& y)
737*387f9dfdSAndroid Build Coastguard Worker {
738*387f9dfdSAndroid Build Coastguard Worker   return !(x < y);
739*387f9dfdSAndroid Build Coastguard Worker }
740*387f9dfdSAndroid Build Coastguard Worker 
741*387f9dfdSAndroid Build Coastguard Worker 
742*387f9dfdSAndroid Build Coastguard Worker // 20.5.9, Comparison with nullopt
operator ==(const optional<T> & x,nullopt_t)743*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator==(const optional<T>& x, nullopt_t) noexcept
744*387f9dfdSAndroid Build Coastguard Worker {
745*387f9dfdSAndroid Build Coastguard Worker   return (!x);
746*387f9dfdSAndroid Build Coastguard Worker }
747*387f9dfdSAndroid Build Coastguard Worker 
operator ==(nullopt_t,const optional<T> & x)748*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator==(nullopt_t, const optional<T>& x) noexcept
749*387f9dfdSAndroid Build Coastguard Worker {
750*387f9dfdSAndroid Build Coastguard Worker   return (!x);
751*387f9dfdSAndroid Build Coastguard Worker }
752*387f9dfdSAndroid Build Coastguard Worker 
operator !=(const optional<T> & x,nullopt_t)753*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator!=(const optional<T>& x, nullopt_t) noexcept
754*387f9dfdSAndroid Build Coastguard Worker {
755*387f9dfdSAndroid Build Coastguard Worker   return bool(x);
756*387f9dfdSAndroid Build Coastguard Worker }
757*387f9dfdSAndroid Build Coastguard Worker 
operator !=(nullopt_t,const optional<T> & x)758*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator!=(nullopt_t, const optional<T>& x) noexcept
759*387f9dfdSAndroid Build Coastguard Worker {
760*387f9dfdSAndroid Build Coastguard Worker   return bool(x);
761*387f9dfdSAndroid Build Coastguard Worker }
762*387f9dfdSAndroid Build Coastguard Worker 
operator <(const optional<T> &,nullopt_t)763*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator<(const optional<T>&, nullopt_t) noexcept
764*387f9dfdSAndroid Build Coastguard Worker {
765*387f9dfdSAndroid Build Coastguard Worker   return false;
766*387f9dfdSAndroid Build Coastguard Worker }
767*387f9dfdSAndroid Build Coastguard Worker 
operator <(nullopt_t,const optional<T> & x)768*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator<(nullopt_t, const optional<T>& x) noexcept
769*387f9dfdSAndroid Build Coastguard Worker {
770*387f9dfdSAndroid Build Coastguard Worker   return bool(x);
771*387f9dfdSAndroid Build Coastguard Worker }
772*387f9dfdSAndroid Build Coastguard Worker 
operator <=(const optional<T> & x,nullopt_t)773*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator<=(const optional<T>& x, nullopt_t) noexcept
774*387f9dfdSAndroid Build Coastguard Worker {
775*387f9dfdSAndroid Build Coastguard Worker   return (!x);
776*387f9dfdSAndroid Build Coastguard Worker }
777*387f9dfdSAndroid Build Coastguard Worker 
operator <=(nullopt_t,const optional<T> &)778*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator<=(nullopt_t, const optional<T>&) noexcept
779*387f9dfdSAndroid Build Coastguard Worker {
780*387f9dfdSAndroid Build Coastguard Worker   return true;
781*387f9dfdSAndroid Build Coastguard Worker }
782*387f9dfdSAndroid Build Coastguard Worker 
operator >(const optional<T> & x,nullopt_t)783*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator>(const optional<T>& x, nullopt_t) noexcept
784*387f9dfdSAndroid Build Coastguard Worker {
785*387f9dfdSAndroid Build Coastguard Worker   return bool(x);
786*387f9dfdSAndroid Build Coastguard Worker }
787*387f9dfdSAndroid Build Coastguard Worker 
operator >(nullopt_t,const optional<T> &)788*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator>(nullopt_t, const optional<T>&) noexcept
789*387f9dfdSAndroid Build Coastguard Worker {
790*387f9dfdSAndroid Build Coastguard Worker   return false;
791*387f9dfdSAndroid Build Coastguard Worker }
792*387f9dfdSAndroid Build Coastguard Worker 
operator >=(const optional<T> &,nullopt_t)793*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator>=(const optional<T>&, nullopt_t) noexcept
794*387f9dfdSAndroid Build Coastguard Worker {
795*387f9dfdSAndroid Build Coastguard Worker   return true;
796*387f9dfdSAndroid Build Coastguard Worker }
797*387f9dfdSAndroid Build Coastguard Worker 
operator >=(nullopt_t,const optional<T> & x)798*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator>=(nullopt_t, const optional<T>& x) noexcept
799*387f9dfdSAndroid Build Coastguard Worker {
800*387f9dfdSAndroid Build Coastguard Worker   return (!x);
801*387f9dfdSAndroid Build Coastguard Worker }
802*387f9dfdSAndroid Build Coastguard Worker 
803*387f9dfdSAndroid Build Coastguard Worker 
804*387f9dfdSAndroid Build Coastguard Worker 
805*387f9dfdSAndroid Build Coastguard Worker // 20.5.10, Comparison with T
operator ==(const optional<T> & x,const T & v)806*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator==(const optional<T>& x, const T& v)
807*387f9dfdSAndroid Build Coastguard Worker {
808*387f9dfdSAndroid Build Coastguard Worker   return bool(x) ? *x == v : false;
809*387f9dfdSAndroid Build Coastguard Worker }
810*387f9dfdSAndroid Build Coastguard Worker 
operator ==(const T & v,const optional<T> & x)811*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator==(const T& v, const optional<T>& x)
812*387f9dfdSAndroid Build Coastguard Worker {
813*387f9dfdSAndroid Build Coastguard Worker   return bool(x) ? v == *x : false;
814*387f9dfdSAndroid Build Coastguard Worker }
815*387f9dfdSAndroid Build Coastguard Worker 
operator !=(const optional<T> & x,const T & v)816*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator!=(const optional<T>& x, const T& v)
817*387f9dfdSAndroid Build Coastguard Worker {
818*387f9dfdSAndroid Build Coastguard Worker   return bool(x) ? *x != v : true;
819*387f9dfdSAndroid Build Coastguard Worker }
820*387f9dfdSAndroid Build Coastguard Worker 
operator !=(const T & v,const optional<T> & x)821*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator!=(const T& v, const optional<T>& x)
822*387f9dfdSAndroid Build Coastguard Worker {
823*387f9dfdSAndroid Build Coastguard Worker   return bool(x) ? v != *x : true;
824*387f9dfdSAndroid Build Coastguard Worker }
825*387f9dfdSAndroid Build Coastguard Worker 
operator <(const optional<T> & x,const T & v)826*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator<(const optional<T>& x, const T& v)
827*387f9dfdSAndroid Build Coastguard Worker {
828*387f9dfdSAndroid Build Coastguard Worker   return bool(x) ? *x < v : true;
829*387f9dfdSAndroid Build Coastguard Worker }
830*387f9dfdSAndroid Build Coastguard Worker 
operator >(const T & v,const optional<T> & x)831*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator>(const T& v, const optional<T>& x)
832*387f9dfdSAndroid Build Coastguard Worker {
833*387f9dfdSAndroid Build Coastguard Worker   return bool(x) ? v > *x : true;
834*387f9dfdSAndroid Build Coastguard Worker }
835*387f9dfdSAndroid Build Coastguard Worker 
operator >(const optional<T> & x,const T & v)836*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator>(const optional<T>& x, const T& v)
837*387f9dfdSAndroid Build Coastguard Worker {
838*387f9dfdSAndroid Build Coastguard Worker   return bool(x) ? *x > v : false;
839*387f9dfdSAndroid Build Coastguard Worker }
840*387f9dfdSAndroid Build Coastguard Worker 
operator <(const T & v,const optional<T> & x)841*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator<(const T& v, const optional<T>& x)
842*387f9dfdSAndroid Build Coastguard Worker {
843*387f9dfdSAndroid Build Coastguard Worker   return bool(x) ? v < *x : false;
844*387f9dfdSAndroid Build Coastguard Worker }
845*387f9dfdSAndroid Build Coastguard Worker 
operator >=(const optional<T> & x,const T & v)846*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator>=(const optional<T>& x, const T& v)
847*387f9dfdSAndroid Build Coastguard Worker {
848*387f9dfdSAndroid Build Coastguard Worker   return bool(x) ? *x >= v : false;
849*387f9dfdSAndroid Build Coastguard Worker }
850*387f9dfdSAndroid Build Coastguard Worker 
operator <=(const T & v,const optional<T> & x)851*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator<=(const T& v, const optional<T>& x)
852*387f9dfdSAndroid Build Coastguard Worker {
853*387f9dfdSAndroid Build Coastguard Worker   return bool(x) ? v <= *x : false;
854*387f9dfdSAndroid Build Coastguard Worker }
855*387f9dfdSAndroid Build Coastguard Worker 
operator <=(const optional<T> & x,const T & v)856*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator<=(const optional<T>& x, const T& v)
857*387f9dfdSAndroid Build Coastguard Worker {
858*387f9dfdSAndroid Build Coastguard Worker   return bool(x) ? *x <= v : true;
859*387f9dfdSAndroid Build Coastguard Worker }
860*387f9dfdSAndroid Build Coastguard Worker 
operator >=(const T & v,const optional<T> & x)861*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator>=(const T& v, const optional<T>& x)
862*387f9dfdSAndroid Build Coastguard Worker {
863*387f9dfdSAndroid Build Coastguard Worker   return bool(x) ? v >= *x : true;
864*387f9dfdSAndroid Build Coastguard Worker }
865*387f9dfdSAndroid Build Coastguard Worker 
866*387f9dfdSAndroid Build Coastguard Worker 
867*387f9dfdSAndroid Build Coastguard Worker // Comparison of optional<T&> with T
operator ==(const optional<T &> & x,const T & v)868*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator==(const optional<T&>& x, const T& v)
869*387f9dfdSAndroid Build Coastguard Worker {
870*387f9dfdSAndroid Build Coastguard Worker   return bool(x) ? *x == v : false;
871*387f9dfdSAndroid Build Coastguard Worker }
872*387f9dfdSAndroid Build Coastguard Worker 
operator ==(const T & v,const optional<T &> & x)873*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator==(const T& v, const optional<T&>& x)
874*387f9dfdSAndroid Build Coastguard Worker {
875*387f9dfdSAndroid Build Coastguard Worker   return bool(x) ? v == *x : false;
876*387f9dfdSAndroid Build Coastguard Worker }
877*387f9dfdSAndroid Build Coastguard Worker 
operator !=(const optional<T &> & x,const T & v)878*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator!=(const optional<T&>& x, const T& v)
879*387f9dfdSAndroid Build Coastguard Worker {
880*387f9dfdSAndroid Build Coastguard Worker   return bool(x) ? *x != v : true;
881*387f9dfdSAndroid Build Coastguard Worker }
882*387f9dfdSAndroid Build Coastguard Worker 
operator !=(const T & v,const optional<T &> & x)883*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator!=(const T& v, const optional<T&>& x)
884*387f9dfdSAndroid Build Coastguard Worker {
885*387f9dfdSAndroid Build Coastguard Worker   return bool(x) ? v != *x : true;
886*387f9dfdSAndroid Build Coastguard Worker }
887*387f9dfdSAndroid Build Coastguard Worker 
operator <(const optional<T &> & x,const T & v)888*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator<(const optional<T&>& x, const T& v)
889*387f9dfdSAndroid Build Coastguard Worker {
890*387f9dfdSAndroid Build Coastguard Worker   return bool(x) ? *x < v : true;
891*387f9dfdSAndroid Build Coastguard Worker }
892*387f9dfdSAndroid Build Coastguard Worker 
operator >(const T & v,const optional<T &> & x)893*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator>(const T& v, const optional<T&>& x)
894*387f9dfdSAndroid Build Coastguard Worker {
895*387f9dfdSAndroid Build Coastguard Worker   return bool(x) ? v > *x : true;
896*387f9dfdSAndroid Build Coastguard Worker }
897*387f9dfdSAndroid Build Coastguard Worker 
operator >(const optional<T &> & x,const T & v)898*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator>(const optional<T&>& x, const T& v)
899*387f9dfdSAndroid Build Coastguard Worker {
900*387f9dfdSAndroid Build Coastguard Worker   return bool(x) ? *x > v : false;
901*387f9dfdSAndroid Build Coastguard Worker }
902*387f9dfdSAndroid Build Coastguard Worker 
operator <(const T & v,const optional<T &> & x)903*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator<(const T& v, const optional<T&>& x)
904*387f9dfdSAndroid Build Coastguard Worker {
905*387f9dfdSAndroid Build Coastguard Worker   return bool(x) ? v < *x : false;
906*387f9dfdSAndroid Build Coastguard Worker }
907*387f9dfdSAndroid Build Coastguard Worker 
operator >=(const optional<T &> & x,const T & v)908*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator>=(const optional<T&>& x, const T& v)
909*387f9dfdSAndroid Build Coastguard Worker {
910*387f9dfdSAndroid Build Coastguard Worker   return bool(x) ? *x >= v : false;
911*387f9dfdSAndroid Build Coastguard Worker }
912*387f9dfdSAndroid Build Coastguard Worker 
operator <=(const T & v,const optional<T &> & x)913*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator<=(const T& v, const optional<T&>& x)
914*387f9dfdSAndroid Build Coastguard Worker {
915*387f9dfdSAndroid Build Coastguard Worker   return bool(x) ? v <= *x : false;
916*387f9dfdSAndroid Build Coastguard Worker }
917*387f9dfdSAndroid Build Coastguard Worker 
operator <=(const optional<T &> & x,const T & v)918*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator<=(const optional<T&>& x, const T& v)
919*387f9dfdSAndroid Build Coastguard Worker {
920*387f9dfdSAndroid Build Coastguard Worker   return bool(x) ? *x <= v : true;
921*387f9dfdSAndroid Build Coastguard Worker }
922*387f9dfdSAndroid Build Coastguard Worker 
operator >=(const T & v,const optional<T &> & x)923*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator>=(const T& v, const optional<T&>& x)
924*387f9dfdSAndroid Build Coastguard Worker {
925*387f9dfdSAndroid Build Coastguard Worker   return bool(x) ? v >= *x : true;
926*387f9dfdSAndroid Build Coastguard Worker }
927*387f9dfdSAndroid Build Coastguard Worker 
928*387f9dfdSAndroid Build Coastguard Worker // Comparison of optional<T const&> with T
operator ==(const optional<const T &> & x,const T & v)929*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator==(const optional<const T&>& x, const T& v)
930*387f9dfdSAndroid Build Coastguard Worker {
931*387f9dfdSAndroid Build Coastguard Worker   return bool(x) ? *x == v : false;
932*387f9dfdSAndroid Build Coastguard Worker }
933*387f9dfdSAndroid Build Coastguard Worker 
operator ==(const T & v,const optional<const T &> & x)934*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator==(const T& v, const optional<const T&>& x)
935*387f9dfdSAndroid Build Coastguard Worker {
936*387f9dfdSAndroid Build Coastguard Worker   return bool(x) ? v == *x : false;
937*387f9dfdSAndroid Build Coastguard Worker }
938*387f9dfdSAndroid Build Coastguard Worker 
operator !=(const optional<const T &> & x,const T & v)939*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator!=(const optional<const T&>& x, const T& v)
940*387f9dfdSAndroid Build Coastguard Worker {
941*387f9dfdSAndroid Build Coastguard Worker   return bool(x) ? *x != v : true;
942*387f9dfdSAndroid Build Coastguard Worker }
943*387f9dfdSAndroid Build Coastguard Worker 
operator !=(const T & v,const optional<const T &> & x)944*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator!=(const T& v, const optional<const T&>& x)
945*387f9dfdSAndroid Build Coastguard Worker {
946*387f9dfdSAndroid Build Coastguard Worker   return bool(x) ? v != *x : true;
947*387f9dfdSAndroid Build Coastguard Worker }
948*387f9dfdSAndroid Build Coastguard Worker 
operator <(const optional<const T &> & x,const T & v)949*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator<(const optional<const T&>& x, const T& v)
950*387f9dfdSAndroid Build Coastguard Worker {
951*387f9dfdSAndroid Build Coastguard Worker   return bool(x) ? *x < v : true;
952*387f9dfdSAndroid Build Coastguard Worker }
953*387f9dfdSAndroid Build Coastguard Worker 
operator >(const T & v,const optional<const T &> & x)954*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator>(const T& v, const optional<const T&>& x)
955*387f9dfdSAndroid Build Coastguard Worker {
956*387f9dfdSAndroid Build Coastguard Worker   return bool(x) ? v > *x : true;
957*387f9dfdSAndroid Build Coastguard Worker }
958*387f9dfdSAndroid Build Coastguard Worker 
operator >(const optional<const T &> & x,const T & v)959*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator>(const optional<const T&>& x, const T& v)
960*387f9dfdSAndroid Build Coastguard Worker {
961*387f9dfdSAndroid Build Coastguard Worker   return bool(x) ? *x > v : false;
962*387f9dfdSAndroid Build Coastguard Worker }
963*387f9dfdSAndroid Build Coastguard Worker 
operator <(const T & v,const optional<const T &> & x)964*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator<(const T& v, const optional<const T&>& x)
965*387f9dfdSAndroid Build Coastguard Worker {
966*387f9dfdSAndroid Build Coastguard Worker   return bool(x) ? v < *x : false;
967*387f9dfdSAndroid Build Coastguard Worker }
968*387f9dfdSAndroid Build Coastguard Worker 
operator >=(const optional<const T &> & x,const T & v)969*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator>=(const optional<const T&>& x, const T& v)
970*387f9dfdSAndroid Build Coastguard Worker {
971*387f9dfdSAndroid Build Coastguard Worker   return bool(x) ? *x >= v : false;
972*387f9dfdSAndroid Build Coastguard Worker }
973*387f9dfdSAndroid Build Coastguard Worker 
operator <=(const T & v,const optional<const T &> & x)974*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator<=(const T& v, const optional<const T&>& x)
975*387f9dfdSAndroid Build Coastguard Worker {
976*387f9dfdSAndroid Build Coastguard Worker   return bool(x) ? v <= *x : false;
977*387f9dfdSAndroid Build Coastguard Worker }
978*387f9dfdSAndroid Build Coastguard Worker 
operator <=(const optional<const T &> & x,const T & v)979*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator<=(const optional<const T&>& x, const T& v)
980*387f9dfdSAndroid Build Coastguard Worker {
981*387f9dfdSAndroid Build Coastguard Worker   return bool(x) ? *x <= v : true;
982*387f9dfdSAndroid Build Coastguard Worker }
983*387f9dfdSAndroid Build Coastguard Worker 
operator >=(const T & v,const optional<const T &> & x)984*387f9dfdSAndroid Build Coastguard Worker template <class T> constexpr bool operator>=(const T& v, const optional<const T&>& x)
985*387f9dfdSAndroid Build Coastguard Worker {
986*387f9dfdSAndroid Build Coastguard Worker   return bool(x) ? v >= *x : true;
987*387f9dfdSAndroid Build Coastguard Worker }
988*387f9dfdSAndroid Build Coastguard Worker 
989*387f9dfdSAndroid Build Coastguard Worker 
990*387f9dfdSAndroid Build Coastguard Worker // 20.5.12, Specialized algorithms
991*387f9dfdSAndroid Build Coastguard Worker template <class T>
swap(optional<T> & x,optional<T> & y)992*387f9dfdSAndroid Build Coastguard Worker void swap(optional<T>& x, optional<T>& y) noexcept(noexcept(x.swap(y)))
993*387f9dfdSAndroid Build Coastguard Worker {
994*387f9dfdSAndroid Build Coastguard Worker   x.swap(y);
995*387f9dfdSAndroid Build Coastguard Worker }
996*387f9dfdSAndroid Build Coastguard Worker 
997*387f9dfdSAndroid Build Coastguard Worker 
998*387f9dfdSAndroid Build Coastguard Worker template <class T>
make_optional(T && v)999*387f9dfdSAndroid Build Coastguard Worker constexpr optional<typename decay<T>::type> make_optional(T&& v)
1000*387f9dfdSAndroid Build Coastguard Worker {
1001*387f9dfdSAndroid Build Coastguard Worker   return optional<typename decay<T>::type>(constexpr_forward<T>(v));
1002*387f9dfdSAndroid Build Coastguard Worker }
1003*387f9dfdSAndroid Build Coastguard Worker 
1004*387f9dfdSAndroid Build Coastguard Worker template <class X>
make_optional(reference_wrapper<X> v)1005*387f9dfdSAndroid Build Coastguard Worker constexpr optional<X&> make_optional(reference_wrapper<X> v)
1006*387f9dfdSAndroid Build Coastguard Worker {
1007*387f9dfdSAndroid Build Coastguard Worker   return optional<X&>(v.get());
1008*387f9dfdSAndroid Build Coastguard Worker }
1009*387f9dfdSAndroid Build Coastguard Worker 
1010*387f9dfdSAndroid Build Coastguard Worker 
1011*387f9dfdSAndroid Build Coastguard Worker } // namespace experimental
1012*387f9dfdSAndroid Build Coastguard Worker } // namespace std
1013*387f9dfdSAndroid Build Coastguard Worker 
1014*387f9dfdSAndroid Build Coastguard Worker namespace std
1015*387f9dfdSAndroid Build Coastguard Worker {
1016*387f9dfdSAndroid Build Coastguard Worker   template <typename T>
1017*387f9dfdSAndroid Build Coastguard Worker   struct hash<std::experimental::optional<T>>
1018*387f9dfdSAndroid Build Coastguard Worker   {
1019*387f9dfdSAndroid Build Coastguard Worker     typedef typename hash<T>::result_type result_type;
1020*387f9dfdSAndroid Build Coastguard Worker     typedef std::experimental::optional<T> argument_type;
1021*387f9dfdSAndroid Build Coastguard Worker 
operator ()std::hash1022*387f9dfdSAndroid Build Coastguard Worker     constexpr result_type operator()(argument_type const& arg) const {
1023*387f9dfdSAndroid Build Coastguard Worker       return arg ? std::hash<T>{}(*arg) : result_type{};
1024*387f9dfdSAndroid Build Coastguard Worker     }
1025*387f9dfdSAndroid Build Coastguard Worker   };
1026*387f9dfdSAndroid Build Coastguard Worker 
1027*387f9dfdSAndroid Build Coastguard Worker   template <typename T>
1028*387f9dfdSAndroid Build Coastguard Worker   struct hash<std::experimental::optional<T&>>
1029*387f9dfdSAndroid Build Coastguard Worker   {
1030*387f9dfdSAndroid Build Coastguard Worker     typedef typename hash<T>::result_type result_type;
1031*387f9dfdSAndroid Build Coastguard Worker     typedef std::experimental::optional<T&> argument_type;
1032*387f9dfdSAndroid Build Coastguard Worker 
operator ()std::hash1033*387f9dfdSAndroid Build Coastguard Worker     constexpr result_type operator()(argument_type const& arg) const {
1034*387f9dfdSAndroid Build Coastguard Worker       return arg ? std::hash<T>{}(*arg) : result_type{};
1035*387f9dfdSAndroid Build Coastguard Worker     }
1036*387f9dfdSAndroid Build Coastguard Worker   };
1037*387f9dfdSAndroid Build Coastguard Worker }
1038*387f9dfdSAndroid Build Coastguard Worker 
1039*387f9dfdSAndroid Build Coastguard Worker # undef TR2_OPTIONAL_REQUIRES
1040*387f9dfdSAndroid Build Coastguard Worker # undef TR2_OPTIONAL_ASSERTED_EXPRESSION
1041*387f9dfdSAndroid Build Coastguard Worker 
1042*387f9dfdSAndroid Build Coastguard Worker # endif //___OPTIONAL_HPP___
1043