91 operator T&() {
return value_; }
92 operator const T&()
const {
return value_; }
93 auto operator->()
const {
return value_.operator->(); }
94 auto operator->() {
return value_.operator->(); }
95 auto& operator*()
const {
return value_.operator*(); }
96 auto& operator*() {
return value_.operator*(); }
98 bool operator!()
const {
return !value_; }
99 explicit operator bool()
const {
return static_cast<bool>(value_); }
101#if __cpp_impl_three_way_comparison
102 auto operator<=>(
const NoNone& other)
const =
default;
109#if !__cpp_impl_three_way_comparison
111template <
typename T>
bool operator==(
const NoNone<T>& a,
const NoNone<T>& b) {
return a.reference() == b.reference(); }
112template <
typename T>
bool operator!=(
const NoNone<T>& a,
const NoNone<T>& b) {
return a.reference() != b.reference(); }
113template <
typename T>
bool operator<(
const NoNone<T>& a,
const NoNone<T>& b) {
return a.reference() < b.reference(); }
114template <
typename T>
bool operator>(
const NoNone<T>& a,
const NoNone<T>& b) {
return a.reference() > b.reference(); }
115template <
typename T>
bool operator<=(
const NoNone<T>& a,
const NoNone<T>& b) {
return a.reference() <= b.reference(); }
116template <
typename T>
bool operator>=(
const NoNone<T>& a,
const NoNone<T>& b) {
return a.reference() >= b.reference(); }
117template <
typename T>
bool operator==(
const NoNone<T>& a, std::nullptr_t b) {
return a.reference() == b; }
118template <
typename T>
bool operator!=(
const NoNone<T>& a, std::nullptr_t b) {
return a.reference() != b; }
119template <
typename T>
bool operator==(std::nullptr_t a,
const NoNone<T>& b) {
return a == b.reference(); }
120template <
typename T>
bool operator!=(std::nullptr_t a,
const NoNone<T>& b) {
return a != b.reference(); }