Iros
 
Loading...
Searching...
No Matches
expected_void_void.h
Go to the documentation of this file.
1#pragma once
2
4#include "di/meta/language.h"
6#include "di/meta/util.h"
7#include "di/types/in_place.h"
10
11namespace di::vocab {
12template<>
13class [[nodiscard]] Expected<void, void> : public function::monad::MonadInterface<Expected<void, void>> {
14public:
15 using Value = void;
16 using Error = void;
17
18 constexpr Expected() = default;
19 constexpr Expected(Expected const&) = default;
20 constexpr Expected(Expected&) = default;
21
22 constexpr explicit Expected(types::InPlace) {}
23
24 constexpr ~Expected() = default;
25
26 constexpr auto operator=(Expected const&) -> Expected& = default;
27 constexpr auto operator=(Expected&&) -> Expected& = default;
28
29 constexpr explicit operator bool() const { return true; }
30 constexpr auto has_value() const -> bool { return true; }
31
32 constexpr void operator*() const& {}
33 constexpr void operator*() && {}
34
35 constexpr void value() const& {}
36 constexpr void value() && {}
37
38 constexpr void emplace() {}
39
41 constexpr auto __try_did_succeed() && -> Expected { return Expected {}; }
42 constexpr void __try_move_out() && {}
43
44private:
45 template<typename G>
46 constexpr friend auto operator==(Expected const&, Expected<void, G> const& b) -> bool {
47 return b.has_value();
48 }
49
50 template<typename G>
51 constexpr friend auto operator==(Expected const&, Unexpected<G> const&) -> bool {
52 return false;
53 }
54
55 template<concepts::RemoveCVRefSameAs<Expected> Self, typename F,
56 typename U = meta::UnwrapRefDecay<meta::InvokeResult<F>>>
58 if constexpr (concepts::LanguageVoid<U>) {
59 function::invoke(util::forward<F>(function));
60 return {};
61 } else {
62 return function::invoke(util::forward<F>(function));
63 }
64 }
65
66 template<concepts::RemoveCVRefSameAs<Expected> Self, typename F, typename R = meta::InvokeResult<F>>
67 requires(concepts::Expected<R>)
68 constexpr friend auto tag_invoke(types::Tag<function::monad::bind>, Self&&, F&& function) -> R {
69 return function::invoke(util::forward<F>(function));
70 }
71
72 template<concepts::RemoveCVRefSameAs<Expected> Self, typename F>
74 constexpr friend auto tag_invoke(types::Tag<function::monad::fail>, Self&& self, F&&) -> Expected {
75 return util::forward<Self>(self);
76 }
77
78 template<concepts::RemoveCVRefSameAs<Expected> Self, typename F>
80 constexpr friend auto tag_invoke(types::Tag<function::monad::fmap_right>, Self&& self, F&&) -> Expected {
81 return util::forward<Self>(self);
82 }
83};
84}
Definition monad_interface.h:15
constexpr friend auto tag_invoke(types::Tag< function::monad::fmap_right >, Self &&self, F &&) -> Expected
Definition expected_void_void.h:80
auto __try_did_fail() &&-> Expected
Definition expected_void_void.h:40
constexpr void __try_move_out() &&
Definition expected_void_void.h:42
constexpr auto operator=(Expected const &) -> Expected &=default
constexpr friend auto operator==(Expected const &, Expected< void, G > const &b) -> bool
Definition expected_void_void.h:46
constexpr auto operator=(Expected &&) -> Expected &=default
constexpr friend auto operator==(Expected const &, Unexpected< G > const &) -> bool
Definition expected_void_void.h:51
constexpr friend auto tag_invoke(types::Tag< function::monad::bind >, Self &&, F &&function) -> R
Definition expected_void_void.h:68
constexpr void operator*() const &
Definition expected_void_void.h:32
constexpr void emplace()
Definition expected_void_void.h:38
constexpr Expected(types::InPlace)
Definition expected_void_void.h:22
constexpr Expected(Expected &)=default
constexpr void value() const &
Definition expected_void_void.h:35
constexpr Expected(Expected const &)=default
constexpr auto has_value() const -> bool
Definition expected_void_void.h:30
constexpr void operator*() &&
Definition expected_void_void.h:33
void Value
Definition expected_void_void.h:15
constexpr auto __try_did_succeed() &&-> Expected
Definition expected_void_void.h:41
void Error
Definition expected_void_void.h:16
constexpr friend auto tag_invoke(types::Tag< function::monad::fmap >, Self &&, F &&function) -> Expected< U, void >
Definition expected_void_void.h:57
constexpr void value() &&
Definition expected_void_void.h:36
constexpr friend auto tag_invoke(types::Tag< function::monad::fail >, Self &&self, F &&) -> Expected
Definition expected_void_void.h:74
Definition unexpected.h:14
Definition operations.h:11
Definition vocab.h:30
Definition core.h:128
Definition as_bool.h:8
constexpr auto invoke
Definition invoke.h:100
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
void unreachable()
Definition unreachable.h:4
Definition lazy.h:165
Definition in_place.h:4