59 #include <initializer_list> 62 #include <type_traits> 65 #define TR2_OPTIONAL_REQUIRES(...) \ 66 typename std::enable_if<__VA_ARGS__::value, bool>::type = false 89 return static_cast<T&&
>(t);
95 static_assert(!std::is_lvalue_reference<T>::value,
"!!");
96 return static_cast<T&&
>(t);
106 #define TR2_OPTIONAL_ASSERTED_EXPRESSION(CHECK, EXPR) (EXPR) 108 #define TR2_OPTIONAL_ASSERTED_EXPRESSION(CHECK, EXPR) \ 109 ((CHECK) ? (EXPR) : ([] { assert(!#CHECK); }(), (EXPR))) 112 #if defined(__CUDA_ARCH__) 113 #define TR2_OPTIONAL_HOST_CONSTEXPR 115 #define TR2_OPTIONAL_HOST_CONSTEXPR constexpr 121 #if (defined _MSC_VER) 122 template <
typename T>
124 return std::addressof(ref);
128 template <
typename T>
135 template <
class X,
size_t S = sizeof(std::declval<X&>().operator&())>
140 constexpr
static bool value = has_overload<T>(
true);
143 template <
typename T, TR2_OPTIONAL_REQUIRES(!has_overloaded_addressof<T>)>
148 template <
typename T, TR2_OPTIONAL_REQUIRES(has_overloaded_addressof<T>)>
150 return std::addressof(ref);
177 : logic_error{what_arg} {}
179 : logic_error{what_arg} {}
189 template <
class... Args>
203 template <
class... Args>
222 template <
class... Args>
229 std::is_constructible<T, std::initializer_list<U>>)>
231 std::initializer_list<U> il,
233 : init_(true), storage_(il,
std::forward<Args>(args)...) {}
236 if (init_) storage_.
value_.T::~T();
249 : init_(true), storage_(v) {}
254 template <
class... Args>
261 std::is_constructible<T, std::initializer_list<U>>)>
263 std::initializer_list<U> il,
265 : init_(true), storage_(il,
std::forward<Args>(args)...) {}
272 std::is_trivially_destructible<T>::value,
281 std::is_trivially_destructible<U>::value,
292 constexpr
bool initialized()
const noexcept {
298 constexpr
const T* dataptr()
const {
302 constexpr
const T& contained_val()
const& {
305 constexpr T&& contained_val() && {
310 void clear() noexcept {
311 if (initialized()) dataptr()->~T();
315 template <
class... Args>
316 void initialize(Args&&... args) noexcept(
317 noexcept(T(std::forward<Args>(args)...))) {
319 ::new (static_cast<void*>(dataptr())) T(std::forward<Args>(args)...);
323 template <
class U,
class... Args>
324 void initialize(std::initializer_list<U> il, Args&&... args) noexcept(
325 noexcept(T(il, std::forward<Args>(args)...))) {
327 ::new (static_cast<void*>(dataptr()))
328 T(il, std::forward<Args>(args)...);
340 if (rhs.initialized()) {
341 ::new (static_cast<void*>(dataptr())) T(*rhs);
347 std::is_nothrow_move_constructible<T>::value)
349 if (rhs.initialized()) {
350 ::new (static_cast<void*>(dataptr())) T(std::move(*rhs));
361 template <
typename U = T,
367 std::is_convertible<U&&, T>)>
371 template <
typename U = T,
377 !std::is_convertible<U&&, T>)>
380 template <
class... Args>
387 std::is_constructible<T, std::initializer_list<U>>)>
389 std::initializer_list<U> il,
403 if (initialized() ==
true && rhs.initialized() ==
false)
405 else if (initialized() ==
false && rhs.initialized() ==
true)
407 else if (initialized() ==
true && rhs.initialized() ==
true)
408 contained_val() = *rhs;
413 std::is_nothrow_move_assignable<T>::value&&
414 std::is_nothrow_move_constructible<T>::value) {
415 if (initialized() ==
true && rhs.initialized() ==
false)
417 else if (initialized() ==
false && rhs.initialized() ==
true)
418 initialize(std::move(*rhs));
419 else if (initialized() ==
true && rhs.initialized() ==
true)
420 contained_val() = std::move(*rhs);
424 template <
class U = T>
426 std::is_constructible<T, U>::value &&
429 (std::is_scalar<T>::value ||
431 std::is_assignable<T&, U>::value,
434 contained_val() = std::forward<U>(v);
436 initialize(std::forward<U>(v));
441 template <
class... Args>
444 initialize(std::forward<Args>(args)...);
447 template <
class U,
class... Args>
448 void emplace(std::initializer_list<U> il, Args&&... args) {
450 initialize<U, Args...>(il, std::forward<Args>(args)...);
455 std::is_nothrow_move_constructible<T>::value&& noexcept(
456 std::swap(std::declval<T&>(), std::declval<T&>()))) {
457 if (initialized() ==
true && rhs.initialized() ==
false) {
458 rhs.initialize(std::move(**
this));
460 }
else if (initialized() ==
false && rhs.initialized() ==
true) {
461 initialize(std::move(*rhs));
463 }
else if (initialized() ==
true && rhs.initialized() ==
true) {
471 explicit constexpr
operator bool() const noexcept {
return initialized(); }
472 constexpr
bool has_value() const noexcept {
return initialized(); }
479 assert(initialized());
488 assert(initialized());
489 return contained_val();
493 assert(initialized());
513 return std::move(contained_val());
518 return *
this ? **this : detail_::convert<T>(constexpr_forward<V>(v));
525 : detail_::convert<T>(constexpr_forward<V>(v));
544 static_assert(
sizeof(T) == 0,
545 "optional references is ill-formed, \ 546 consider use optional of a std::reference_wrapper of type T to \ 547 hold a reference if you really need to");
549 static_assert(!std::is_same<T, nullopt_t>::value,
"bad T");
550 static_assert(!std::is_same<T, in_place_t>::value,
"bad T");
559 template <
typename U = T>
562 template <
typename U = T>
590 template <
typename U>
591 auto operator=(U&& rhs) noexcept ->
typename std::enable_if<
598 template <
typename U>
599 auto operator=(U&& rhs) noexcept ->
typename std::enable_if<
600 !std::is_same<typename std::decay<U>::type,
optional<T&>>::value,
605 void emplace(T&&) =
delete;
623 explicit constexpr
operator bool() const noexcept {
return ref !=
nullptr; }
625 constexpr
bool has_value() const noexcept {
return ref !=
nullptr; }
629 return *
this ? **this
631 constexpr_forward<V>(v));
635 void reset() noexcept { ref =
nullptr; }
640 static_assert(
sizeof(T) == 0,
"optional rvalue references disallowed");
646 return bool(x) != bool(y) ? false : bool(x) ==
false ? true : *x == *y;
655 constexpr
bool operator<(const optional<T>& x,
const optional<T>& y) {
656 return (!y) ? false : (!x) ?
true : *x < *y;
665 constexpr
bool operator<=(const optional<T>& x,
const optional<T>& y) {
696 constexpr
bool operator<(const optional<T>&,
nullopt_t) noexcept {
701 constexpr
bool operator<(nullopt_t, const optional<T>& x) noexcept {
706 constexpr
bool operator<=(const optional<T>& x,
nullopt_t) noexcept {
711 constexpr
bool operator<=(nullopt_t, const optional<T>&) noexcept {
738 return bool(x) ? *x == v :
false;
743 return bool(x) ? v == *x :
false;
748 return bool(x) ? *x != v :
true;
753 return bool(x) ? v != *x :
true;
757 constexpr
bool operator<(const optional<T>& x,
const T& v) {
758 return bool(x) ? *x < v :
true;
763 return bool(x) ? v > *x :
true;
768 return bool(x) ? *x > v :
false;
772 constexpr
bool operator<(const T& v, const optional<T>& x) {
773 return bool(x) ? v < *x :
false;
778 return bool(x) ? *x >= v :
false;
782 constexpr
bool operator<=(const T& v, const optional<T>& x) {
783 return bool(x) ? v <= *x :
false;
787 constexpr
bool operator<=(const optional<T>& x,
const T& v) {
788 return bool(x) ? *x <= v :
true;
793 return bool(x) ? v >= *x :
true;
799 return bool(x) ? *x == v :
false;
804 return bool(x) ? v == *x :
false;
809 return bool(x) ? *x != v :
true;
814 return bool(x) ? v != *x :
true;
818 constexpr
bool operator<(const optional<T&>& x,
const T& v) {
819 return bool(x) ? *x < v :
true;
824 return bool(x) ? v > *x :
true;
829 return bool(x) ? *x > v :
false;
833 constexpr
bool operator<(const T& v, const optional<T&>& x) {
834 return bool(x) ? v < *x :
false;
839 return bool(x) ? *x >= v :
false;
843 constexpr
bool operator<=(const T& v, const optional<T&>& x) {
844 return bool(x) ? v <= *x :
false;
848 constexpr
bool operator<=(const optional<T&>& x,
const T& v) {
849 return bool(x) ? *x <= v :
true;
854 return bool(x) ? v >= *x :
true;
860 return bool(x) ? *x == v :
false;
865 return bool(x) ? v == *x :
false;
870 return bool(x) ? *x != v :
true;
875 return bool(x) ? v != *x :
true;
879 constexpr
bool operator<(const optional<const T&>& x,
const T& v) {
880 return bool(x) ? *x < v :
true;
885 return bool(x) ? v > *x :
true;
890 return bool(x) ? *x > v :
false;
894 constexpr
bool operator<(const T& v, const optional<const T&>& x) {
895 return bool(x) ? v < *x :
false;
900 return bool(x) ? *x >= v :
false;
904 constexpr
bool operator<=(const T& v, const optional<const T&>& x) {
905 return bool(x) ? v <= *x :
false;
909 constexpr
bool operator<=(const optional<const T&>& x,
const T& v) {
910 return bool(x) ? *x <= v :
true;
915 return bool(x) ? v >= *x :
true;
938 template <
typename T>
939 struct hash<
open3d::utility::optional<T>> {
943 constexpr result_type
operator()(argument_type
const& arg)
const {
944 return arg ? std::hash<T>{}(*arg) : result_type{};
948 template <
typename T>
949 struct hash<
open3d::utility::optional<T&>> {
953 constexpr result_type
operator()(argument_type
const& arg)
const {
954 return arg ? std::hash<T>{}(*arg) : result_type{};
959 #undef TR2_OPTIONAL_REQUIRES 960 #undef TR2_OPTIONAL_ASSERTED_EXPRESSION 961 #undef TR2_OPTIONAL_HOST_CONSTEXPR constexpr bool operator==(const optional< T > &x, const optional< T > &y)
Definition: Optional.h:645
constexpr result_type operator()(argument_type const &arg) const
Definition: Optional.h:953
TR2_OPTIONAL_HOST_CONSTEXPR T & operator*() const
Definition: Optional.h:614
constexpr storage_t(Args &&... args)
Definition: Optional.h:190
constexpr bool operator>=(const optional< T > &x, const optional< T > &y)
Definition: Optional.h:670
optional & operator=(nullopt_t) noexcept
Definition: Optional.h:575
constexpr in_place_t in_place
Definition: Optional.h:75
constexpr_storage_t< T > storage_
Definition: Optional.h:243
constexpr nullopt_t nullopt
Definition: Optional.h:171
void reset() noexcept
Definition: Optional.h:529
constexpr optional(U &&u)
Definition: Optional.h:368
constexpr std::decay< T >::type value_or(V &&v) const
Definition: Optional.h:628
void swap(optional< T &> &rhs) noexcept
Definition: Optional.h:607
constexpr constexpr_optional_base(const T &v)
Definition: Optional.h:248
constexpr T && constexpr_forward(typename std::remove_reference< T >::type &t) noexcept
Definition: Optional.h:87
bad_optional_access(const char *what_arg)
Definition: Optional.h:178
#define TR2_OPTIONAL_HOST_CONSTEXPR
Definition: Optional.h:115
hash< T >::result_type result_type
Definition: Optional.h:940
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:454
constexpr result_type operator()(argument_type const &arg) const
Definition: Optional.h:943
unsigned char dummy_
Definition: Optional.h:184
Definition: Optional.h:168
constexpr constexpr_optional_base(in_place_t, std::initializer_list< U > il, Args &&... args)
Definition: Optional.h:262
static constexpr bool has_overload(...)
Definition: Optional.h:131
TR2_OPTIONAL_HOST_CONSTEXPR T const & operator*() const &
Definition: Optional.h:483
constexpr constexpr_optional_base(T &&v)
Definition: Optional.h:251
void swap(open3d::core::SmallVectorImpl< T > &LHS, open3d::core::SmallVectorImpl< T > &RHS)
Implement std::swap in terms of SmallVector swap.
Definition: SmallVector.h:1389
storage_t< T > storage_
Definition: Optional.h:213
TR2_OPTIONAL_HOST_CONSTEXPR T && operator*() &&
Definition: Optional.h:492
Definition: Optional.h:129
T value_
Definition: Optional.h:185
constexpr bool operator!=(const optional< T > &x, const optional< T > &y)
Definition: Optional.h:650
optional_base(in_place_t, Args &&... args)
Definition: Optional.h:223
constexpr struct open3d::utility::trivial_init_t trivial_init
T value_type
Definition: Optional.h:333
constexpr optional(const optional &rhs) noexcept
Definition: Optional.h:565
unsigned char dummy_
Definition: Optional.h:198
void reset() noexcept
Definition: Optional.h:635
constexpr constexpr_storage_t(trivial_init_t) noexcept
Definition: Optional.h:201
optional & operator=(const optional &rhs)
Definition: Optional.h:402
open3d::utility::optional< T > argument_type
Definition: Optional.h:941
constexpr constexpr_optional_base(in_place_t, Args &&... args)
Definition: Optional.h:255
TR2_OPTIONAL_HOST_CONSTEXPR T && value() &&
Definition: Optional.h:511
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:425
optional & operator=(optional &&rhs) noexcept(std::is_nothrow_move_assignable< T >::value &&std::is_nothrow_move_constructible< T >::value)
Definition: Optional.h:412
void emplace(Args &&... args)
Definition: Optional.h:442
constexpr optional_base() noexcept
Definition: Optional.h:215
hash< T >::result_type result_type
Definition: Optional.h:950
TR2_OPTIONAL_HOST_CONSTEXPR T & value() &
Definition: Optional.h:504
constexpr bool has_value() const noexcept
Definition: Optional.h:472
static constexpr bool has_overload(bool)
Definition: Optional.h:136
constexpr T * static_addressof(T &ref)
Definition: Optional.h:144
Definition: Optional.h:167
constexpr optional(nullopt_t) noexcept
Definition: Optional.h:557
void swap(optional< T > &x, optional< T > &y) noexcept(noexcept(x.swap(y)))
Definition: Optional.h:920
Definition: Optional.h:174
constexpr T value_or(V &&v) const &
Definition: Optional.h:517
open3d::utility::optional< T & > argument_type
Definition: Optional.h:951
TR2_OPTIONAL_HOST_CONSTEXPR T const & value() const &
Definition: Optional.h:497
~optional_base()
Definition: Optional.h:235
bad_optional_access(const std::string &what_arg)
Definition: Optional.h:176
constexpr optional() noexcept
Definition: Optional.h:336
void emplace(T &v) noexcept
Definition: Optional.h:603
constexpr bool operator>(const optional< T > &x, const optional< T > &y)
Definition: Optional.h:660
Definition: Optional.h:79
~storage_t()
Definition: Optional.h:193
constexpr optional(in_place_t, std::initializer_list< U > il, Args &&... args)
Definition: Optional.h:388
Definition: Optional.h:197
#define TR2_OPTIONAL_ASSERTED_EXPRESSION(CHECK, EXPR)
Definition: Optional.h:108
constexpr optional(in_place_t, T &v) noexcept
Definition: Optional.h:567
Definition: PinholeCameraIntrinsic.cpp:35
constexpr optional_base(T &&v)
Definition: Optional.h:219
Definition: Optional.h:541
constexpr constexpr_optional_base() noexcept
Definition: Optional.h:245
optional_base(in_place_t, std::initializer_list< U > il, Args &&... args)
Definition: Optional.h:230
constexpr optional(nullopt_t) noexcept
Definition: Optional.h:337
constexpr optional< typename std::decay< T >::type > make_optional(T &&v)
Definition: Optional.h:925
optional & operator=(nullopt_t) noexcept
Definition: Optional.h:397
T value_
Definition: Optional.h:199
constexpr U convert(U v)
Definition: Optional.h:157
optional(const optional &rhs)
Definition: Optional.h:339
Definition: Optional.h:163
Definition: Optional.h:71
constexpr nullopt_t(init)
Definition: Optional.h:169
constexpr constexpr_storage_t(Args &&... args)
Definition: Optional.h:204
TR2_OPTIONAL_HOST_CONSTEXPR T * operator->() const
Definition: Optional.h:610
Definition: Optional.h:211
TR2_OPTIONAL_HOST_CONSTEXPR T * operator->()
Definition: Optional.h:478
T * static_addressof(T &ref)
Definition: Optional.h:149
constexpr optional_base(const T &v)
Definition: Optional.h:217
TR2_OPTIONAL_HOST_CONSTEXPR T const * operator->() const
Definition: Optional.h:474
Definition: Optional.h:241
#define TR2_OPTIONAL_REQUIRES(...)
Definition: Optional.h:65
bool init_
Definition: Optional.h:212
constexpr bool has_value() const noexcept
Definition: Optional.h:625
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:275
constexpr T value_or(V &&v) &&
Definition: Optional.h:522
constexpr optional(in_place_t, Args &&... args)
Definition: Optional.h:381
constexpr optional() noexcept
Definition: Optional.h:555
Definition: Optional.h:183
void emplace(std::initializer_list< U > il, Args &&... args)
Definition: Optional.h:448
bool init_
Definition: Optional.h:242
constexpr optional(U &u) noexcept
Definition: Optional.h:560
TR2_OPTIONAL_HOST_CONSTEXPR T & operator*() &
Definition: Optional.h:487
optional(optional &&rhs) noexcept(std::is_nothrow_move_constructible< T >::value)
Definition: Optional.h:346
constexpr T & value() const
Definition: Optional.h:618
constexpr storage_t(trivial_init_t) noexcept
Definition: Optional.h:187
constexpr std::remove_reference< T >::type && constexpr_move(T &&t) noexcept
Definition: Optional.h:100
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:591