40 #include <initializer_list>
43 #include <type_traits>
46 #define TR2_OPTIONAL_REQUIRES(...) \
47 typename std::enable_if<__VA_ARGS__::value, bool>::type = false
70 return static_cast<T&&
>(
t);
76 static_assert(!std::is_lvalue_reference<T>::value,
"!!");
77 return static_cast<T&&
>(
t);
87 #define TR2_OPTIONAL_ASSERTED_EXPRESSION(CHECK, EXPR) (EXPR)
89 #define TR2_OPTIONAL_ASSERTED_EXPRESSION(CHECK, EXPR) \
90 ((CHECK) ? (EXPR) : ([] { assert(!#CHECK); }(), (EXPR)))
93 #if defined(__CUDA_ARCH__)
94 #define TR2_OPTIONAL_HOST_CONSTEXPR
96 #define TR2_OPTIONAL_HOST_CONSTEXPR constexpr
102 #if (defined _MSC_VER)
103 template <
typename T>
105 return std::addressof(ref);
109 template <
typename T>
116 template <class X, size_t S = sizeof(std::declval<X&>().operator&())>
121 constexpr
static bool value = has_overload<T>(
true);
124 template <
typename T, TR2_OPTIONAL_REQUIRES(!has_overloaded_addressof<T>)>
129 template <
typename T, TR2_OPTIONAL_REQUIRES(has_overloaded_addressof<T>)>
131 return std::addressof(ref);
158 : logic_error{what_arg} {}
160 : logic_error{what_arg} {}
170 template <
class... Args>
184 template <
class... Args>
204 template <
class... Args>
211 std::is_constructible<T, std::initializer_list<U>>)>
213 std::initializer_list<U> il,
236 template <
class... Args>
243 std::is_constructible<T, std::initializer_list<U>>)>
245 std::initializer_list<U> il,
254 std::is_trivially_destructible<T>::value,
262 using OptionalBase =
typename std::conditional<
263 std::is_trivially_destructible<U>::value,
274 constexpr
bool initialized()
const noexcept {
275 return OptionalBase<T>::init_;
278 return std::addressof(OptionalBase<T>::storage_.value_);
280 constexpr
const T* dataptr()
const {
284 constexpr
const T& contained_val()
const& {
285 return OptionalBase<T>::storage_.value_;
287 constexpr T&& contained_val() && {
288 return std::move(OptionalBase<T>::storage_.value_);
290 constexpr T& contained_val() & {
return OptionalBase<T>::storage_.value_; }
292 void clear() noexcept {
293 if (initialized()) dataptr()->~T();
294 OptionalBase<T>::init_ =
false;
297 template <
class... Args>
298 void initialize(Args&&... args) noexcept(
299 noexcept(T(std::forward<Args>(args)...))) {
300 assert(!OptionalBase<T>::init_);
301 ::new (
static_cast<void*
>(dataptr())) T(std::forward<Args>(args)...);
302 OptionalBase<T>::init_ =
true;
305 template <
class U,
class... Args>
306 void initialize(std::initializer_list<U> il, Args&&... args) noexcept(
307 noexcept(T(il, std::forward<Args>(args)...))) {
308 assert(!OptionalBase<T>::init_);
309 ::new (
static_cast<void*
>(dataptr()))
310 T(il, std::forward<Args>(args)...);
311 OptionalBase<T>::init_ =
true;
318 constexpr
optional() noexcept : OptionalBase<T>() {};
322 if (rhs.initialized()) {
323 ::new (
static_cast<void*
>(dataptr())) T(*rhs);
324 OptionalBase<T>::init_ =
true;
329 std::is_nothrow_move_constructible<T>::value)
330 : OptionalBase<T>() {
331 if (rhs.initialized()) {
332 ::new (
static_cast<void*
>(dataptr())) T(std::move(*rhs));
333 OptionalBase<T>::init_ =
true;
343 template <
typename U = T,
349 std::is_convertible<U&&, T>)>
350 constexpr
optional(U&& u) : OptionalBase<T>(
std::forward<U>(u)) {}
353 template <
typename U = T,
359 !std::is_convertible<U&&, T>)>
360 explicit constexpr
optional(U&& u) : OptionalBase<T>(
std::forward<U>(u)) {}
362 template <
class... Args>
369 std::is_constructible<T, std::initializer_list<U>>)>
371 std::initializer_list<U> il,
385 if (initialized() ==
true && rhs.initialized() ==
false)
387 else if (initialized() ==
false && rhs.initialized() ==
true)
389 else if (initialized() ==
true && rhs.initialized() ==
true)
390 contained_val() = *rhs;
395 std::is_nothrow_move_assignable<T>::value &&
396 std::is_nothrow_move_constructible<T>::value) {
397 if (initialized() ==
true && rhs.initialized() ==
false)
399 else if (initialized() ==
false && rhs.initialized() ==
true)
400 initialize(std::move(*rhs));
401 else if (initialized() ==
true && rhs.initialized() ==
true)
402 contained_val() = std::move(*rhs);
406 template <
class U = T>
408 typename std::enable_if<
409 std::is_constructible<T, U>::value &&
412 (std::is_scalar<T>::value ||
415 std::is_assignable<T&, U>::value,
418 contained_val() = std::forward<U>(v);
420 initialize(std::forward<U>(v));
425 template <
class... Args>
428 initialize(std::forward<Args>(args)...);
431 template <
class U,
class... Args>
432 void emplace(std::initializer_list<U> il, Args&&... args) {
434 initialize<U, Args...>(il, std::forward<Args>(args)...);
439 std::is_nothrow_move_constructible<T>::value &&
440 noexcept(
std::swap(std::declval<T&>(), std::declval<T&>()))) {
441 if (initialized() ==
true && rhs.initialized() ==
false) {
442 rhs.initialize(std::move(**
this));
444 }
else if (initialized() ==
false && rhs.initialized() ==
true) {
445 initialize(std::move(*rhs));
447 }
else if (initialized() ==
true && rhs.initialized() ==
true) {
455 explicit constexpr
operator bool() const noexcept {
return initialized(); }
456 constexpr
bool has_value() const noexcept {
return initialized(); }
463 assert(initialized());
472 assert(initialized());
473 return contained_val();
477 assert(initialized());
497 return std::move(contained_val());
502 return *
this ? **this : detail_::convert<T>(constexpr_forward<V>(v));
509 : detail_::convert<T>(constexpr_forward<V>(v));
528 static_assert(
sizeof(T) == 0,
529 "optional references is ill-formed, \
530 consider use optional of a std::reference_wrapper of type T to \
531 hold a reference if you really need to");
533 static_assert(!std::is_same<T, nullopt_t>::value,
"bad T");
534 static_assert(!std::is_same<T, in_place_t>::value,
"bad T");
543 template <
typename U = T>
546 template <
typename U = T>
574 template <
typename U>
583 template <
typename U>
609 explicit constexpr
operator bool() const noexcept {
return ref !=
nullptr; }
611 constexpr
bool has_value() const noexcept {
return ref !=
nullptr; }
615 return *
this ? **this
617 constexpr_forward<V>(v));
621 void reset() noexcept { ref =
nullptr; }
626 static_assert(
sizeof(T) == 0,
"optional rvalue references disallowed");
632 return bool(x) != bool(y) ? false : bool(x) ==
false ? true : *x == *y;
642 return (!y) ? false : (!x) ?
true : *x < *y;
724 return bool(x) ? *x == v :
false;
729 return bool(x) ? v == *x :
false;
734 return bool(x) ? *x != v :
true;
739 return bool(x) ? v != *x :
true;
744 return bool(x) ? *x < v :
true;
749 return bool(x) ? v > *x :
true;
754 return bool(x) ? *x > v :
false;
759 return bool(x) ? v < *x :
false;
764 return bool(x) ? *x >= v :
false;
769 return bool(x) ? v <= *x :
false;
774 return bool(x) ? *x <= v :
true;
779 return bool(x) ? v >= *x :
true;
785 return bool(x) ? *x == v :
false;
790 return bool(x) ? v == *x :
false;
795 return bool(x) ? *x != v :
true;
800 return bool(x) ? v != *x :
true;
805 return bool(x) ? *x < v :
true;
810 return bool(x) ? v > *x :
true;
815 return bool(x) ? *x > v :
false;
820 return bool(x) ? v < *x :
false;
825 return bool(x) ? *x >= v :
false;
830 return bool(x) ? v <= *x :
false;
835 return bool(x) ? *x <= v :
true;
840 return bool(x) ? v >= *x :
true;
846 return bool(x) ? *x == v :
false;
851 return bool(x) ? v == *x :
false;
856 return bool(x) ? *x != v :
true;
861 return bool(x) ? v != *x :
true;
866 return bool(x) ? *x < v :
true;
871 return bool(x) ? v > *x :
true;
876 return bool(x) ? *x > v :
false;
881 return bool(x) ? v < *x :
false;
886 return bool(x) ? *x >= v :
false;
891 return bool(x) ? v <= *x :
false;
896 return bool(x) ? *x <= v :
true;
901 return bool(x) ? v >= *x :
true;
924 template <
typename T>
925 struct hash<
open3d::utility::optional<T>> {
934 template <
typename T>
935 struct hash<
open3d::utility::optional<T&>> {
945 #undef TR2_OPTIONAL_REQUIRES
946 #undef TR2_OPTIONAL_ASSERTED_EXPRESSION
947 #undef TR2_OPTIONAL_HOST_CONSTEXPR
#define TR2_OPTIONAL_REQUIRES(...)
Definition: Optional.h:46
#define TR2_OPTIONAL_HOST_CONSTEXPR
Definition: Optional.h:96
#define TR2_OPTIONAL_ASSERTED_EXPRESSION(CHECK, EXPR)
Definition: Optional.h:89
double t
Definition: SurfaceReconstructionPoisson.cpp:172
Definition: Optional.h:155
bad_optional_access(const char *what_arg)
Definition: Optional.h:159
bad_optional_access(const std::string &what_arg)
Definition: Optional.h:157
Definition: Optional.h:525
constexpr T & value() const
Definition: Optional.h:604
constexpr optional(U &u) noexcept
Definition: Optional.h:544
constexpr optional() noexcept
Definition: Optional.h:539
auto operator=(U &&rhs) noexcept -> typename std::enable_if< std::is_same< typename std::decay< U >::type, optional< T & >>::value, optional & >::type
Definition: Optional.h:575
TR2_OPTIONAL_HOST_CONSTEXPR T * operator->() const
Definition: Optional.h:596
TR2_OPTIONAL_HOST_CONSTEXPR T & operator*() const
Definition: Optional.h:600
void reset() noexcept
Definition: Optional.h:621
auto operator=(U &&rhs) noexcept -> typename std::enable_if<!std::is_same< typename std::decay< U >::type, optional< T & >>::value, optional & >::type=delete
constexpr optional(nullopt_t) noexcept
Definition: Optional.h:541
void emplace(T &v) noexcept
Definition: Optional.h:589
constexpr std::decay< T >::type value_or(V &&v) const
Definition: Optional.h:614
optional(in_place_t, T &&)=delete
void emplace(T &&)=delete
void swap(optional< T & > &rhs) noexcept
Definition: Optional.h:593
constexpr optional(in_place_t, T &v) noexcept
Definition: Optional.h:551
constexpr bool has_value() const noexcept
Definition: Optional.h:611
optional & operator=(nullopt_t) noexcept
Definition: Optional.h:559
constexpr optional(const optional &rhs) noexcept
Definition: Optional.h:549
Definition: Optional.h:260
constexpr bool has_value() const noexcept
Definition: Optional.h:456
optional & operator=(const optional &rhs)
Definition: Optional.h:384
optional(const optional &rhs)
Definition: Optional.h:321
TR2_OPTIONAL_HOST_CONSTEXPR T && operator*() &&
Definition: Optional.h:476
optional & operator=(nullopt_t) noexcept
Definition: Optional.h:379
T value_type
Definition: Optional.h:315
TR2_OPTIONAL_HOST_CONSTEXPR T const & value() const &
Definition: Optional.h:481
TR2_OPTIONAL_HOST_CONSTEXPR T & operator*() &
Definition: Optional.h:471
constexpr T value_or(V &&v) const &
Definition: Optional.h:501
constexpr optional() noexcept
Definition: Optional.h:318
optional & operator=(optional &&rhs) noexcept(std::is_nothrow_move_assignable< T >::value &&std::is_nothrow_move_constructible< T >::value)
Definition: Optional.h:394
TR2_OPTIONAL_HOST_CONSTEXPR T const & operator*() const &
Definition: Optional.h:467
TR2_OPTIONAL_HOST_CONSTEXPR T & value() &
Definition: Optional.h:488
void emplace(std::initializer_list< U > il, Args &&... args)
Definition: Optional.h:432
constexpr optional(U &&u)
Definition: Optional.h:350
constexpr T value_or(V &&v) &&
Definition: Optional.h:506
void emplace(Args &&... args)
Definition: Optional.h:426
auto operator=(U &&v) -> typename std::enable_if< std::is_constructible< T, U >::value &&!std::is_same< typename std::decay< U >::type, optional< T >>::value &&(std::is_scalar< T >::value||std::is_same< typename std::decay< U >::type, T >::value) &&std::is_assignable< T &, U >::value, optional & >::type
Definition: Optional.h:407
void reset() noexcept
Definition: Optional.h:513
TR2_OPTIONAL_HOST_CONSTEXPR T * operator->()
Definition: Optional.h:462
constexpr optional(in_place_t, std::initializer_list< U > il, Args &&... args)
Definition: Optional.h:370
optional(optional &&rhs) noexcept(std::is_nothrow_move_constructible< T >::value)
Definition: Optional.h:328
constexpr optional(in_place_t, Args &&... args)
Definition: Optional.h:363
void swap(optional< T > &rhs) noexcept(std::is_nothrow_move_constructible< T >::value &&noexcept(std::swap(std::declval< T & >(), std::declval< T & >())))
Definition: Optional.h:438
TR2_OPTIONAL_HOST_CONSTEXPR T const * operator->() const
Definition: Optional.h:458
TR2_OPTIONAL_HOST_CONSTEXPR T && value() &&
Definition: Optional.h:495
constexpr optional(nullopt_t) noexcept
Definition: Optional.h:319
constexpr U convert(U v)
Definition: Optional.h:138
constexpr T * static_addressof(T &ref)
Definition: Optional.h:125
constexpr in_place_t in_place
Definition: Optional.h:56
constexpr struct open3d::utility::trivial_init_t trivial_init
constexpr bool operator<(const optional< T > &x, const optional< T > &y)
Definition: Optional.h:641
constexpr bool operator>=(const optional< T > &x, const optional< T > &y)
Definition: Optional.h:656
constexpr std::remove_reference< T >::type && constexpr_move(T &&t) noexcept
Definition: Optional.h:81
constexpr optional< typename std::decay< T >::type > make_optional(T &&v)
Definition: Optional.h:911
constexpr bool operator==(const optional< T > &x, const optional< T > &y)
Definition: Optional.h:631
typename std::conditional< std::is_trivially_destructible< T >::value, constexpr_optional_base< typename std::remove_const< T >::type >, optional_base< typename std::remove_const< T >::type > >::type OptionalBase
Definition: Optional.h:257
void swap(optional< T > &x, optional< T > &y) noexcept(noexcept(x.swap(y)))
Definition: Optional.h:906
constexpr bool operator<=(const optional< T > &x, const optional< T > &y)
Definition: Optional.h:651
constexpr bool operator>(const optional< T > &x, const optional< T > &y)
Definition: Optional.h:646
constexpr nullopt_t nullopt
Definition: Optional.h:152
constexpr bool operator!=(const optional< T > &x, const optional< T > &y)
Definition: Optional.h:636
constexpr T && constexpr_forward(typename std::remove_reference< T >::type &t) noexcept
Definition: Optional.h:68
Definition: PinholeCameraIntrinsic.cpp:16
void swap(open3d::core::SmallVectorImpl< T > &LHS, open3d::core::SmallVectorImpl< T > &RHS)
Implement std::swap in terms of SmallVector swap.
Definition: SmallVector.h:1370
Definition: Optional.h:223
constexpr constexpr_optional_base() noexcept
Definition: Optional.h:227
constexpr_storage_t< T > storage_
Definition: Optional.h:225
constexpr constexpr_optional_base(in_place_t, Args &&... args)
Definition: Optional.h:237
constexpr constexpr_optional_base(T &&v)
Definition: Optional.h:233
bool init_
Definition: Optional.h:224
constexpr constexpr_optional_base(in_place_t, std::initializer_list< U > il, Args &&... args)
Definition: Optional.h:244
constexpr constexpr_optional_base(const T &v)
Definition: Optional.h:230
~constexpr_optional_base()=default
Definition: Optional.h:110
constexpr static bool value
Definition: Optional.h:121
constexpr static bool has_overload(bool)
Definition: Optional.h:117
constexpr static bool has_overload(...)
Definition: Optional.h:112
Definition: Optional.h:52
Definition: Optional.h:149
Definition: Optional.h:148
constexpr nullopt_t(init)
Definition: Optional.h:150
Definition: Optional.h:192
~optional_base()
Definition: Optional.h:217
bool init_
Definition: Optional.h:193
optional_base(in_place_t, std::initializer_list< U > il, Args &&... args)
Definition: Optional.h:212
storage_t< T > storage_
Definition: Optional.h:194
optional_base(in_place_t, Args &&... args)
Definition: Optional.h:205
constexpr optional_base(const T &v)
Definition: Optional.h:199
constexpr optional_base() noexcept
Definition: Optional.h:196
constexpr optional_base(T &&v)
Definition: Optional.h:201
Definition: Optional.h:144
open3d::utility::optional< T > argument_type
Definition: Optional.h:927
constexpr result_type operator()(argument_type const &arg) const
Definition: Optional.h:929
hash< T >::result_type result_type
Definition: Optional.h:926
open3d::utility::optional< T & > argument_type
Definition: Optional.h:937
constexpr result_type operator()(argument_type const &arg) const
Definition: Optional.h:939
hash< T >::result_type result_type
Definition: Optional.h:936
Definition: Optional.h:178
T value_
Definition: Optional.h:180
constexpr constexpr_storage_t(trivial_init_t) noexcept
Definition: Optional.h:182
unsigned char dummy_
Definition: Optional.h:179
~constexpr_storage_t()=default
constexpr constexpr_storage_t(Args &&... args)
Definition: Optional.h:185
Definition: Optional.h:164
constexpr storage_t(Args &&... args)
Definition: Optional.h:171
unsigned char dummy_
Definition: Optional.h:165
constexpr storage_t(trivial_init_t) noexcept
Definition: Optional.h:168
~storage_t()
Definition: Optional.h:174
T value_
Definition: Optional.h:166