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