31 #ifndef LEDGER_CORE_OPTION_HPP 32 #define LEDGER_CORE_OPTION_HPP 34 #include "optional.hpp" 39 #include <type_traits> 50 static_assert(!std::is_reference<T>::value,
51 "Option is not compatible with references");
52 static_assert(!std::is_abstract<T>::value,
53 "Option is not compatible with abstract types");
59 Option(
const T& value) : _optional(value) {};
60 Option(T&& value) : _optional(std::move(value)) {};
68 if (
this != &option) {
69 _optional = option._optional;
75 if (
this != &option) {
76 _optional = std::move(option._optional);
100 inline bool isEmpty()
const {
104 inline bool hasValue()
const {
108 inline bool nonEmpty()
const {
112 T& operator*() & {
return *_optional;};
113 const T& operator*()
const & {
return *_optional;};
114 T&& operator*() && {
return std::move(*_optional);};
115 const T&& operator*()
const && {
return std::move(*_optional);};
117 const T* operator->()
const {
118 return &_optional.value();
122 return &_optional.value();
126 return _optional.value();
129 const T& getValue()
const & {
130 return _optional.value();
134 return std::move(_optional.value());
137 const T&& getValue()
const && {
138 return std::move(_optional.value());
141 T getValueOr(
const T& v)
const& {
148 T getOrElse(std::function<T ()> f)
const {
155 T getValueOr(T&& v)
const & {
157 return std::forward<T>(v);
161 T getValueOr(T&& v) && {
171 bool operator==(
const T& v)
const noexcept {
172 return hasValue() && **
this == v;
175 bool operator==(
const Option<T>& v)
const noexcept {
176 return (isEmpty() == v.isEmpty()) || (hasValue() && v.hasValue() && **
this == *v);
179 bool operator!=(
const T& v)
const noexcept {
180 return !(*
this == v);
183 bool operator!=(
const Option<T>& v)
const noexcept {
184 return !(*
this == v);
187 operator bool()
const {
return hasValue();};
189 void foreach(std::function<
void (
const T& value)> f)
const {
191 f(_optional.value());
195 bool forall(std::function<
bool (
const T& value)> f)
const {
197 return f(_optional.value());
202 template <
typename A>
203 Option<A> map(std::function<A (
const T&)> f)
const {
209 template <
typename A>
210 Option<A> flatMap(std::function<Option<A> (
const T&)> f)
const {
213 return f(getValue());
216 std::vector<T> toVector()
const {
218 return std::vector<T>();
220 out.push_back(getValue());
224 template <
typename A>
225 Option<A> orElse(std::function<Option<A> ()> f)
const {
241 template <
typename T>
244 template <
typename T>
247 template <
typename T>
258 #endif //LEDGER_CORE_OPTION_HPP Definition: Option.hpp:49
Definition: Account.cpp:8
Definition: optional.hpp:177