32 #include <type_traits>
37 namespace result_constructor_type
51 result_constructor_type::OK(), __VA_ARGS__ \
53 #define ERR(message) \
55 result_constructor_type::ER(), Error(__FILE__, __LINE__, message) \
57 #define ERR_APPEND(prev_error, message) \
59 result_constructor_type::ER(), Error(__FILE__, __LINE__, prev_error, message) \
67 static_assert(!std::is_same<T, Error>(),
"Cannot initialize a Result<Error>.");
69 template<
typename... Args,
typename U =
T,
typename std::enable_if_t<std::is_same_v<U, void>,
int> = 0>
74 template<
typename... Args,
typename U =
T,
typename std::enable_if_t<!std::is_same_v<U, void>,
int> = 0>
79 template<
typename... Args,
typename U =
T,
typename std::enable_if_t<!std::is_same_v<U, void>,
int> = 0>
94 template<
typename... Args,
typename U =
T,
typename std::enable_if_t<!std::is_same_v<U, void>,
int> = 0>
103 template<
typename... Args,
typename U =
T,
typename std::enable_if_t<!std::is_same_v<U, void>,
int> = 0>
106 return OK(std::move(value));
117 return this->m_result == other.m_result;
128 return !(*
this == other);
148 return std::holds_alternative<Error>(m_result);
158 template<
typename U = T,
typename std::enable_if_t<!std::is_same_v<U,
void>,
int> = 0>
161 return std::get<T>(m_result);
171 template<
typename U = T,
typename std::enable_if_t<!std::is_same_v<U,
void>,
int> = 0>
174 return std::get<T>(std::move(m_result));
185 return std::get<Error>(m_result);
196 return std::get<Error>(std::move(m_result));
206 template<
typename U,
typename std::enable_if_t<!std::is_same_v<U,
void>,
int> = 0>
211 return f(this->get());
215 return ERR(this->get_error());
226 template<
typename U,
typename std::enable_if_t<!std::is_same_v<U,
void>,
int> = 0>
231 return f(this->get());
235 return ERR(this->get_error());
240 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