25 Optional() : Data(), Valid(
false) { }
26 Optional(
const Type& data) : Data(data), Valid(
true) { }
27 Optional(Type&& data) : Data(data), Valid(
true) { }
34 Type& operator=(
const Type& data) { Data = data; Valid =
true;
return Data; }
35 Type& operator=(Type&& data) { Data = data; Valid =
true;
return Data; }
37 Type& operator+=(
const Type& data) { assert(Valid); Data += data;
return Data; }
38 Type& operator-=(
const Type& data) { assert(Valid); Data += data;
return Data; }
39 Type& operator*=(
const Type& data) { assert(Valid); Data += data;
return Data; }
40 Type& operator/=(
const Type& data) { assert(Valid); Data += data;
return Data; }
41 Type& operator%=(
const Type& data) { assert(Valid); Data += data;
return Data; }
43 Type& operator<<=(
const Type& data) { assert(Valid); Data <<= data;
return Data; }
44 Type& operator>>=(
const Type& data) { assert(Valid); Data >>= data;
return Data; }
45 Type& operator|=(
const Type& data) { assert(Valid); Data |= data;
return Data; }
46 Type& operator&=(
const Type& data) { assert(Valid); Data &= data;
return Data; }
47 Type& operator^=(
const Type& data) { assert(Valid); Data ^= data;
return Data; }
49 [[nodiscard]]
bool operator()()
const {
return Valid; }
51 operator Type&() { assert(Valid);
return Data; }
52 operator const Type&()
const { assert(Valid);
return Data; }
54 Type* operator->() { assert(Valid);
return &Data; }
55 const Type* operator->()
const { assert(Valid);
return &Data; }
57 Type& operator*() { assert(Valid);
return Data; }
58 const Type& operator*()
const { assert(Valid);
return Data; }
60 void Reset() { Valid =
false; }