33 optional(
const value_type& data) : data_(data), valid_(
true) { }
34 optional(value_type&& data) : data_(data), valid_(
true) { }
41 optional& operator=(
const value_type& data) { data_ = data; valid_ =
true;
return *
this; }
42 optional& operator=(value_type&& data) { data_ = data; valid_ =
true;
return *
this; }
44 bool operator==(
const optional& b)
const
46 if(not(valid_ || b.valid_))
return valid_ == b.valid_;
47 return data_ == b.data_;
50 value_type& operator+=(
const value_type& data) { assert(valid_); data_ += data;
return data_; }
51 value_type& operator-=(
const value_type& data) { assert(valid_); data_ += data;
return data_; }
52 value_type& operator*=(
const value_type& data) { assert(valid_); data_ += data;
return data_; }
53 value_type& operator/=(
const value_type& data) { assert(valid_); data_ += data;
return data_; }
54 value_type& operator%=(
const value_type& data) { assert(valid_); data_ += data;
return data_; }
56 value_type& operator<<=(
const value_type& data) { assert(valid_); data_ <<= data;
return data_; }
57 value_type& operator>>=(
const value_type& data) { assert(valid_); data_ >>= data;
return data_; }
58 value_type& operator|=(
const value_type& data) { assert(valid_); data_ |= data;
return data_; }
59 value_type& operator&=(
const value_type& data) { assert(valid_); data_ &= data;
return data_; }
60 value_type& operator^=(
const value_type& data) { assert(valid_); data_ ^= data;
return data_; }
62 [[nodiscard]]
bool operator()()
const {
return valid_; }
64 operator value_type()
const { assert(valid_);
return data_; }
66 operator value_type&() { assert(valid_);
return data_; }
67 operator const value_type&()
const { assert(valid_);
return data_; }
69 value_type* operator->() { assert(valid_);
return &data_; }
70 const value_type* operator->()
const { assert(valid_);
return &data_; }
72 value_type& operator*() { assert(valid_);
return data_; }
73 const value_type& operator*()
const { assert(valid_);
return data_; }
75 void reset() { valid_ =
false; }