13 #include "result.fwd.hpp"
15 #include <experimental/optional>
28 explicit bad_result_access(
const std::string& __arg) : std::logic_error(__arg) { }
35 template <
typename T,
typename E>
38 std::experimental::optional<T> var_ok;
39 std::experimental::optional<E> var_err;
49 result(T&& value, internal::placeholder) : var_ok(
std::forward<T>(value))
53 result(internal::placeholder, E&& value) : var_err(
std::forward<E>(value))
57 result(
const T& value, internal::placeholder) : var_ok(value)
61 result(internal::placeholder,
const E& value) : var_err(value)
73 return std::forward<result<T, E>>(
74 result<T, E>(std::forward<T>(value), internal::placeholder{}));
79 return std::forward<result<T, E>>(
result<T, E>(value, internal::placeholder{}));
90 return std::forward<result<T, E>>(
91 result<T, E>(internal::placeholder{}, std::forward<E>(value)));
96 return std::forward<result<T, E>>(
result<T, E>(internal::placeholder{}, value));
106 return std::move(
result<T, E>(T(), internal::placeholder{}));
116 return std::move(
result<T, E>(internal::placeholder{}, E()));
141 explicit inline operator bool() const noexcept
146 constexpr T
const& ok_value() const&
149 throw new bad_result_access(
"Attempted to ok from err");
154 constexpr T& ok_value() &
157 throw new bad_result_access(
"Attempted to ok from err");
162 constexpr T&& ok_value() &&
165 throw new bad_result_access(
"Attempted to ok from err");
167 return std::move(*var_ok);
171 constexpr T ok_value_or(V&& v) const&
173 return var_ok.value_or(std::forward<V>(v));
177 constexpr T ok_value_or(V&& v) &&
179 return var_ok.value_or(std::forward<V>(v));
182 constexpr E
const& err_value() const&
185 throw new bad_result_access(
"Attempted to err from ok");
190 constexpr E& err_value() &
193 throw new bad_result_access(
"Attempted to err from ok");
198 constexpr E&& err_value() &&
201 throw new bad_result_access(
"Attempted to err from ok");
203 return std::move(*var_err);
207 constexpr E err_value_or(V&& v) const&
209 return var_err.value_or(std::forward<V>(v));
213 constexpr E err_value_or(V&& v) &&
215 return var_err.value_or(std::forward<V>(v));
230 template <typename F, typename R = typename std::result_of<F(T)>::type>
249 template <typename U>
263 template <typename F>
264 inline auto
map_err(F f) noexcept ->
maybe::result<T, typename
std::result_of<F(E)>::type>;
275 template <typename U>
286 template <typename F>
287 inline auto
and_then(F op) noexcept -> typename
std::result_of<F(T)>::type;
296 template <typename U>
297 inline auto
into_err() noexcept ->
maybe::result<U, E> const;
300 template <typename T, typename E>
301 constexpr
bool operator==(const result<T, E>& x, const result<T, E>& y)
303 return x.is_ok() && y.is_ok()
304 ? x.ok_value() == y.ok_value()
305 : (x.is_err() && y.is_err() ? x.err_value() == y.err_value() :
false);
308 template <
typename T,
typename E>
309 constexpr
bool operator!=(
const result<T, E>& x,
const result<T, E>& y)
314 template <
typename E>
317 std::experimental::optional<E> var_err;
320 typedef void ok_type;
327 result(internal::placeholder, E&& value) : var_err(std::forward<E>(value))
331 result(internal::placeholder,
const E& value) : var_err(value)
335 result(E&& value) : var_err(std::forward<E>(value))
339 result(
const E& value) : var_err(value)
362 return std::forward<result<void, E>>(
result<void, E>(std::forward<E>(value)));
412 explicit inline operator bool() const noexcept
420 throw new bad_result_access(
"Attempted to get ok from err");
424 constexpr E
const& err_value() const&
427 throw new bad_result_access(
"Attempted to err from ok");
432 constexpr E& err_value() &
435 throw new bad_result_access(
"Attempted to err from ok");
440 constexpr E&& err_value() &&
443 throw new bad_result_access(
"Attempted to err from ok");
445 return std::move(*var_err);
449 constexpr E err_value_or(V&& v) const&
451 return var_err.value_or(std::forward<V>(v));
455 constexpr E err_value_or(V&& v) &&
457 return var_err.value_or(std::forward<V>(v));
472 template <
typename F>
484 template <
typename U>
498 template <
typename F>
499 inline auto map_err(F f) noexcept
511 template <
typename U>
522 template <
typename F>
523 inline auto and_then(F op) noexcept ->
typename std::result_of<F()>::type;
533 template <typename E>
534 constexpr
bool operator==(const result<
void, E>& x, const result<
void, E>& y)
536 return x.
is_ok() && y.is_ok()
538 : (x.is_err() && y.is_err() ? x.err_value() == y.err_value() :
false);
541 template <
typename E>
542 constexpr
bool operator!=(
const result<void, E>& x,
const result<void, E>& y)
548 #include "result.inline.hpp"
auto and_then(F op) noexcept-> typename std::result_of< F(T)>::type
auto map_void() noexcept-> maybe::result< void, E >
bool is_ok() const noexcept
bool is_err() const noexcept
auto map_err_value(U value) noexcept-> maybe::result< T, U >
static constexpr result< T, E > ok(T &&value) noexcept
static constexpr result< T, E > default_ok() noexcept
static constexpr result< T, E > default_err() noexcept
auto into_err() noexcept-> maybe::result< U, E > const
auto map_err(F f) noexcept-> maybe::result< T, typename std::result_of< F(E)>::type >
static constexpr result< T, E > err(E &&value) noexcept
static constexpr result< void, E > ok() noexcept
static constexpr result< void, E > err(E &&value) noexcept
auto map(F f) noexcept-> maybe::result< R, E >
bool is_err() const noexcept
bool is_ok() const noexcept
auto map_value(U value) noexcept-> maybe::result< U, E >
static constexpr result< void, E > default_ok() noexcept
static constexpr result< void, E > default_err() noexcept