32 #include <type_traits>
40 namespace result_constructor_type
58 result_constructor_type::OK(), __VA_ARGS__ \
60 #define ERR(message) \
62 result_constructor_type::ER(), Error(__FILE__, __LINE__, message) \
64 #define ERR_APPEND(prev_error, message) \
66 result_constructor_type::ER(), Error(__FILE__, __LINE__, prev_error, message) \
74 static_assert(!std::is_same<T, Error>(),
"Cannot initialize a Result<Error>.");
76 template<
typename... Args,
typename U =
T,
typename std::enable_if_t<std::is_same_v<U, void>,
int> = 0>
81 template<
typename... Args,
typename U =
T,
typename std::enable_if_t<!std::is_same_v<U, void>,
int> = 0>
86 template<
typename... Args,
typename U =
T,
typename std::enable_if_t<!std::is_same_v<U, void>,
int> = 0>
101 template<
typename... Args,
typename U =
T,
typename std::enable_if_t<!std::is_same_v<U, void>,
int> = 0>
110 template<
typename... Args,
typename U =
T,
typename std::enable_if_t<!std::is_same_v<U, void>,
int> = 0>
113 return OK(std::move(value));
124 return this->m_result == other.m_result;
135 return !(*
this == other);
155 return std::holds_alternative<Error>(m_result);
165 template<
typename U = T,
typename std::enable_if_t<!std::is_same_v<U,
void>,
int> = 0>
168 return std::get<T>(m_result);
178 template<
typename U = T,
typename std::enable_if_t<!std::is_same_v<U,
void>,
int> = 0>
181 return std::get<T>(std::move(m_result));
192 return std::get<Error>(m_result);
203 return std::get<Error>(std::move(m_result));
213 template<
typename U,
typename std::enable_if_t<!std::is_same_v<U,
void>,
int> = 0>
218 return f(this->get());
222 return ERR(this->get_error());
233 template<
typename U,
typename std::enable_if_t<!std::is_same_v<U,
void>,
int> = 0>
238 return f(this->get());
242 return ERR(this->get_error());
247 std::variant<T, Error> m_result;
Result(result_constructor_type::ER, const Error &error)
bool operator==(const Result< T > &other)
Result(result_constructor_type::OK)
static Result< T > Ok(const T &value)
Result< U > map(const std::function< Result< U >(T &&)> &f)
const Error & get_error() const
Result(result_constructor_type::OK, const T &value)
bool operator!=(const Result< T > &other)
Result(result_constructor_type::OK, std::remove_reference_t< T > &&value)
static Result< T > Ok(std::remove_reference_t< T > &&value)
Result< U > map(const std::function< Result< U >(const T &)> &f) const