9#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)
15#if __cplusplus >= 201103L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201103L)
16#define CONSTEXPR constexpr
23#if __cplusplus >= 201103L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201103L)
24#define NOEXCEPT(Expr) noexcept(Expr)
62#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)
63 template <
class... Args>
86#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)
87 template <
class... Args>
88 void Init(Args&&... args) {
89 ::new (&
value_) T(std::forward<Args>(args)...);
93 void Init(
const T& _value) {
131#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)
132 template <
class... Args>
149#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)
151 if (other.is_populated_)
152 Init(std::move(other.value_));
167#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)
170 template <
class... Args>
179 template <
typename U>
185#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)
186 template <
typename U>
188 if (other.storage_.is_populated_)
189 storage_.Init(std::move(other.storage_.value_));
200#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)
202 std::is_nothrow_move_assignable<T>::value &&
203 std::is_nothrow_move_constructible<T>::value) {
209 template <
typename U>
217#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)
218 template <
typename U>
220 if (other.storage_.is_populated_)
227 template <
typename U>
228#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)
231 storage_.value_ = std::forward<U>(value);
233 storage_.Init(std::forward<U>(value));
254 template <
typename U>
264template <
bool is_copy_constructible>
271#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)
279template <
bool is_move_constructible>
287#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)
294template <
bool is_copy_assignable>
301#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)
309template <
bool is_move_assignable>
317#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)
325#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)
327template <
typename T,
typename U>
329 : std::integral_constant<
331 std::is_constructible<T, Optional<U>&>::value ||
332 std::is_constructible<T, const Optional<U>&>::value ||
333 std::is_constructible<T, Optional<U>&&>::value ||
334 std::is_constructible<T, const Optional<U>&&>::value ||
335 std::is_convertible<Optional<U>&, T>::value ||
336 std::is_convertible<const Optional<U>&, T>::value ||
337 std::is_convertible<Optional<U>&&, T>::value ||
338 std::is_convertible<const Optional<U>&&, T>::value> {};
340template <
typename T,
typename U>
342 : std::integral_constant<
344 IsConvertibleFromOptional<T, U>::value ||
345 std::is_assignable<T&, Optional<U>&>::value ||
346 std::is_assignable<T&, const Optional<U>&>::value ||
347 std::is_assignable<T&, Optional<U>&&>::value ||
348 std::is_assignable<T&, const Optional<U>&&>::value> {};
359 template <
typename T>
361 ->
decltype(
swap(std::declval<T>(), std::declval<T>()), std::true_type());
363 template <
typename T>
368struct IsSwappable : decltype(swappable_impl::IsSwappableImpl::Check<T&>(0)) {};
378#define OPTIONAL_DECLSPEC_EMPTY_BASES __declspec(empty_bases)
380#define OPTIONAL_DECLSPEC_EMPTY_BASES
405#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)
409 std::is_copy_assignable<T>::value>,
411 std::is_move_assignable<T>::value>
415#undef OPTIONAL_DECLSPEC_EMPTY_BASES
429 template <
typename U>
432#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)
435 template <
typename U>
438 template <
class... Args>
442 template <
class U,
class... Args>
444 std::initializer_list<U> il,
459#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)
460 template <
typename U = value_type>
464 template <
typename U>
473 if (&other ==
this) {
487 template <
typename U>
488#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)
501 template <
typename U>
507#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)
509 template <
typename U>
533#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)
534 CONSTEXPR
explicit operator bool()
const {
return storage_.is_populated_; }
536 CONSTEXPR
operator bool()
const {
return storage_.is_populated_; }
547#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)
552 static_assert(std::is_convertible<U, T>::value,
553 "U must be convertible to T");
556 :
static_cast<T
>(std::forward<U>(default_value));
559 CONSTEXPR T
value_or(
const U& default_value)
const {
562 :
static_cast<T
>(default_value);
570#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)
577#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)
582 static_assert(std::is_convertible<U, T>::value,
583 "U must be convertible to T");
586 :
static_cast<T
>(std::forward<U>(default_value));
589 CONSTEXPR T
value_or(
const U& default_value)
const & {
593 static_assert(std::is_convertible<U, T>::value,
594 "U must be convertible to T");
597 :
static_cast<T
>(default_value);
602#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)
607 static_assert(std::is_convertible<U, T>::value,
608 "U must be convertible to T");
611 :
static_cast<T
>(std::forward<U>(default_value));
620#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)
633 swap(**
this, *other);
638#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)
639 template <
class... Args>
642 storage_.Init(std::forward<Args>(args)...);
646 template <
class U,
class... Args>
647 T&
emplace(std::initializer_list<U> il, Args&&... args) {
649 storage_.Init(il, std::forward<Args>(args)...);
672#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)
682template <
class T,
class U>
691template <
class T,
class U>
700template <
class T,
class U>
709template <
class T,
class U>
718template <
class T,
class U>
727template <
class T,
class U>
796template <
class T,
class U>
798 return opt.
has_value() ? *opt == value :
false;
801template <
class T,
class U>
803 return opt.
has_value() ? value == *opt :
false;
806template <
class T,
class U>
808 return opt.
has_value() ? *opt != value :
true;
811template <
class T,
class U>
813 return opt.
has_value() ? value != *opt :
true;
816template <
class T,
class U>
818 return opt.
has_value() ? *opt < value :
true;
821template <
class T,
class U>
823 return opt.
has_value() ? value < *opt :
false;
826template <
class T,
class U>
828 return opt.
has_value() ? *opt <= value :
true;
831template <
class T,
class U>
833 return opt.
has_value() ? value <= *opt :
false;
836template <
class T,
class U>
838 return opt.
has_value() ? *opt > value :
false;
841template <
class T,
class U>
843 return opt.
has_value() ? value > *opt :
true;
846template <
class T,
class U>
848 return opt.
has_value() ? *opt >= value :
false;
851template <
class T,
class U>
853 return opt.
has_value() ? value >= *opt :
true;
856#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)
857template <
class T,
class... Args>
862template <
class T,
class U,
class... Args>
880#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)
Definition AgoraOptional.h:413
Optional & operator=(nullopt_t)
Definition AgoraOptional.h:481
T value_type
Definition AgoraOptional.h:417
CONSTEXPR T value_or(const U &default_value) const &
Definition AgoraOptional.h:589
CONSTEXPR T value_or(U &&default_value) const &&
Definition AgoraOptional.h:603
CONSTEXPR Optional(const U &value)
Definition AgoraOptional.h:465
CONSTEXPR T value_or(U &&default_value) const
Definition AgoraOptional.h:548
const T & operator*() const
Definition AgoraOptional.h:524
T & emplace(std::initializer_list< U > il, Args &&... args)
Definition AgoraOptional.h:647
T * operator->()
Definition AgoraOptional.h:520
Optional(Optional< U > &&other)
Definition AgoraOptional.h:436
T & emplace(const U il[], const T &_value)
Definition AgoraOptional.h:659
Optional & operator=(const Optional &other)
Definition AgoraOptional.h:472
CONSTEXPR Optional(nullopt_t)
Definition AgoraOptional.h:423
CONSTEXPR T value_or(const U &default_value) const
Definition AgoraOptional.h:559
CONSTEXPR Optional(in_place_t, Args &&... args)
Definition AgoraOptional.h:439
Optional & operator=(const Optional< U > &other)
Definition AgoraOptional.h:502
CONSTEXPR Optional(in_place_t, const U il[], const T &_value)
Definition AgoraOptional.h:451
const T && value() const &&
Definition AgoraOptional.h:571
void swap(Optional &other)
Definition AgoraOptional.h:616
CONSTEXPR Optional()
Definition AgoraOptional.h:420
CONSTEXPR Optional(in_place_t, std::initializer_list< U > il, Args &&... args)
Definition AgoraOptional.h:443
void reset()
Definition AgoraOptional.h:636
const T & value() const &
Definition AgoraOptional.h:566
CONSTEXPR T value_or(U &&default_value) const &
Definition AgoraOptional.h:578
~Optional()
Definition AgoraOptional.h:469
Optional & operator=(Optional< U > &&other)
Definition AgoraOptional.h:510
CONSTEXPR Optional(in_place_t, const T &_value)
Definition AgoraOptional.h:448
T & operator*()
Definition AgoraOptional.h:528
CONSTEXPR bool has_value() const
Definition AgoraOptional.h:539
T & emplace(const T &_value)
Definition AgoraOptional.h:653
CONSTEXPR Optional(const Optional &other)
Definition AgoraOptional.h:421
Optional(const Optional< U > &other)
Definition AgoraOptional.h:430
const T * operator->() const
Definition AgoraOptional.h:516
T & emplace(Args &&... args)
Definition AgoraOptional.h:640
Optional & operator=(const U &value)
Definition AgoraOptional.h:494
const T & value() const
Definition AgoraOptional.h:542
CONSTEXPR Optional(U &&value)
Definition AgoraOptional.h:461
Optional & operator=(U &&value)
Definition AgoraOptional.h:489
Definition AgoraOptional.h:160
OptionalStorage< T > storage_
Definition AgoraOptional.h:257
CONSTEXPR OptionalBase(in_place_t, const T &_value)
Definition AgoraOptional.h:174
OptionalBase & operator=(OptionalBase &&other) NOEXCEPT(std
Definition AgoraOptional.h:201
void FreeIfNeeded()
Definition AgoraOptional.h:245
OptionalBase(const OptionalBase< U > &other)
Definition AgoraOptional.h:180
CONSTEXPR OptionalBase(const OptionalBase &other)
Definition AgoraOptional.h:166
void MoveAssign(OptionalBase< U > &&other)
Definition AgoraOptional.h:219
OptionalBase & operator=(const OptionalBase &other)
Definition AgoraOptional.h:195
CONSTEXPR OptionalBase()
Definition AgoraOptional.h:165
void InitOrAssign(const U &value)
Definition AgoraOptional.h:236
CONSTEXPR OptionalBase(in_place_t, Args &&... args)
Definition AgoraOptional.h:171
CONSTEXPR OptionalBase(OptionalBase &&other)
Definition AgoraOptional.h:168
friend class OptionalBase
Definition AgoraOptional.h:255
void CopyAssign(const OptionalBase< U > &other)
Definition AgoraOptional.h:210
void InitOrAssign(U &&value)
Definition AgoraOptional.h:229
~OptionalBase()
Definition AgoraOptional.h:193
OptionalBase(OptionalBase< U > &&other)
Definition AgoraOptional.h:187
Definition AgoraOptional.h:352
Definition AgoraOptional.h:54
Definition AgoraAtomicOps.h:21
void swap(Optional< T > &lhs, Optional< T > &rhs)
Definition AgoraOptional.h:874
bool operator!=(const Optional< T > &lhs, const Optional< U > &rhs)
Definition AgoraOptional.h:692
const in_place_t in_place
Definition AgoraOptional.h:44
bool operator==(const Optional< T > &lhs, const Optional< U > &rhs)
Definition AgoraOptional.h:683
bool operator>=(const Optional< T > &lhs, const Optional< U > &rhs)
Definition AgoraOptional.h:728
bool operator<(const Optional< T > &lhs, const Optional< U > &rhs)
Definition AgoraOptional.h:701
CONSTEXPR Optional< T > make_optional(Args &&... args)
Definition AgoraOptional.h:858
bool operator<=(const Optional< T > &lhs, const Optional< U > &rhs)
Definition AgoraOptional.h:710
const nullopt_t nullopt(0)
bool operator>(const Optional< T > &lhs, const Optional< U > &rhs)
Definition AgoraOptional.h:719
Definition AgoraOptional.h:881
Definition AgoraOptional.h:34
CONSTEXPR CopyAssignable(CopyAssignable &&)
Definition AgoraOptional.h:302
CONSTEXPR CopyAssignable(const CopyAssignable &)
Definition AgoraOptional.h:300
CopyAssignable & operator=(CopyAssignable &&)
Definition AgoraOptional.h:303
CONSTEXPR CopyAssignable()
Definition AgoraOptional.h:299
Definition AgoraOptional.h:295
CONSTEXPR CopyConstructible()
Definition AgoraOptional.h:269
CopyConstructible & operator=(CopyConstructible &&)
Definition AgoraOptional.h:273
CopyConstructible & operator=(const CopyConstructible &)
Definition AgoraOptional.h:270
CONSTEXPR CopyConstructible(CopyConstructible &&)
Definition AgoraOptional.h:272
Definition AgoraOptional.h:265
Definition AgoraOptional.h:348
Definition AgoraOptional.h:338
Definition AgoraOptional.h:368
MoveAssignable & operator=(const MoveAssignable &)
Definition AgoraOptional.h:316
CONSTEXPR MoveAssignable(MoveAssignable &&)
Definition AgoraOptional.h:318
CONSTEXPR MoveAssignable()
Definition AgoraOptional.h:314
CONSTEXPR MoveAssignable(const MoveAssignable &)
Definition AgoraOptional.h:315
Definition AgoraOptional.h:310
MoveConstructible & operator=(const MoveConstructible &)
Definition AgoraOptional.h:286
CONSTEXPR MoveConstructible(const MoveConstructible &)
Definition AgoraOptional.h:285
CONSTEXPR MoveConstructible()
Definition AgoraOptional.h:284
MoveConstructible & operator=(MoveConstructible &&)
Definition AgoraOptional.h:288
Definition AgoraOptional.h:280
void Init(Args &&... args)
Definition AgoraOptional.h:88
char empty_
Definition AgoraOptional.h:105
CONSTEXPR OptionalStorageBase(in_place_t, const T &_value)
Definition AgoraOptional.h:67
~OptionalStorageBase()
Definition AgoraOptional.h:81
CONSTEXPR OptionalStorageBase(in_place_t, Args &&... args)
Definition AgoraOptional.h:64
void Init(const T &_value)
Definition AgoraOptional.h:93
bool is_populated_
Definition AgoraOptional.h:99
CONSTEXPR OptionalStorageBase()
Definition AgoraOptional.h:60
T value_
Definition AgoraOptional.h:106
Definition AgoraOptional.h:118
CONSTEXPR OptionalStorage(in_place_t in_place, const T &_value)
Definition AgoraOptional.h:136
CONSTEXPR OptionalStorage(in_place_t in_place, Args &&... args)
Definition AgoraOptional.h:133
OptionalStorage(const OptionalStorage &other)
Definition AgoraOptional.h:144
OptionalStorage()
Definition AgoraOptional.h:142
OptionalStorage(OptionalStorage &&other) NOEXCEPT(std
Definition AgoraOptional.h:150
Definition AgoraOptional.h:355
static std::false_type Check(...)
static auto Check(int) -> decltype(swap(std::declval< T >(), std::declval< T >()), std::true_type())
Definition AgoraOptional.h:38
CONSTEXPR nullopt_t(int)
Definition AgoraOptional.h:39
size_t operator()(const agora::Optional< T > &opt) const
Definition AgoraOptional.h:884