55 static auto get_base(S&& self) -> BaseType<S> {
56 if constexpr (!has_base) {
57 return util::forward<S>(self).base();
63 auto base() & -> Base&
requires(has_base) {
return this->m_base.value; }
auto base()
const& -> Base
const&
66 return this->m_base.value;
68 auto base() && -> Base&&
requires(has_base) {
69 return util::move(this->m_base).value;
70 }
auto base()
const&& -> Base
const&&
73 return util::move(this->m_base).value;
83 explicit Type(T&& value) : m_base(util::forward<T>(value)) {}
102 constexpr static int get_env = 1;
105 constexpr static auto missing_set_value() ->
bool {
106 return requires {
requires bool(
int(S::set_value)); };
109 constexpr static auto missing_set_error() ->
bool {
110 return requires {
requires bool(
int(S::set_error)); };
113 constexpr static auto missing_set_stopped() ->
bool {
114 return requires {
requires bool(
int(S::set_stopped)); };
117 constexpr static auto missing_set_next() ->
bool {
118 return requires {
requires bool(
int(S::set_next)); };
121 constexpr static auto missing_get_env() ->
bool {
122 return requires {
requires bool(
int(S::get_env)); };
125 template<
typename S,
typename... Args>
126 static auto do_set_value(S&& self, Args&&... args)
127 ->
decltype(util::forward<S>(self).set_value(util::forward<Args>(args)...)) {
128 return util::forward<S>(self).set_value(util::forward<Args>(args)...);
130 template<
typename S,
typename... Args>
131 static auto do_set_error(S&& self, Args&&... args)
132 ->
decltype(util::forward<S>(self).set_error(util::forward<Args>(args)...)) {
133 return util::forward<S>(self).set_error(util::forward<Args>(args)...);
135 template<
typename S,
typename... Args>
136 static auto do_set_stopped(S&& self, Args&&... args)
137 ->
decltype(util::forward<S>(self).set_stopped(util::forward<Args>(args)...)) {
138 return util::forward<S>(self).set_stopped(util::forward<Args>(args)...);
140 template<
typename S,
typename... Args>
141 static auto do_set_next(S& self, Args&&... args) ->
decltype(self.set_next(util::forward<Args>(args)...)) {
142 return self.set_next(util::forward<Args>(args)...);
144 template<
typename S,
typename... Args>
145 static auto do_get_env(S&& self, Args&&... args)
146 ->
decltype(util::forward<S>(self).get_env(util::forward<Args>(args)...)) {
147 return util::forward<S>(self).get_env(util::forward<Args>(args)...);
150 template<concepts::SameAs<SetValue> Tag,
typename S = Self,
typename... Args>
153 requires { Type::do_set_value(util::move(self), util::forward<Args>(args)...); } ||
155 requires missing_set_value<S>();
159 if constexpr (
requires { Type::do_set_value(util::move(self), util::forward<Args>(args)...); }) {
160 Type::do_set_value(util::move(self), util::forward<Args>(args)...);
166 template<concepts::SameAs<SetError> Tag,
typename Arg,
typename S = Self>
169 requires { Type::do_set_error(util::move(self), util::forward<Arg>(arg)); } ||
171 requires missing_set_error<S>();
175 if constexpr (
requires { Type::do_set_error(util::move(self), util::forward<Arg>(arg)); }) {
176 Type::do_set_error(util::move(self), util::forward<Arg>(arg));
182 template<concepts::SameAs<SetStopped> Tag,
typename S = Self>
185 requires { Type::do_set_stopped(util::move(self)); } ||
187 requires missing_set_stopped<S>();
191 if constexpr (
requires { Type::do_set_stopped(util::move(self)); }) {
192 Type::do_set_stopped(util::move(self));
198 template<concepts::SameAs<types::Tag<execution::set_next>> Tag,
typename N,
typename S = Self>
201 requires { Type::do_set_next(self, util::forward<N>(
next)); } ||
203 requires missing_set_next<S>();
207 if constexpr (
requires { Type::do_set_next(self, util::forward<N>(
next)); }) {
208 return Type::do_set_next(self, util::forward<N>(
next));
214 template<concepts::SameAs<types::Tag<execution::get_env>> Tag,
typename S = Self>
215 friend auto tag_invoke(Tag, Self
const& self) ->
decltype(
auto)
217 requires { Type::do_get_env(util::move(self)); } ||
219 requires missing_get_env<S>();
220 execution::get_env(Type::get_base(self));
223 if constexpr (
requires { Type::do_get_env(util::move(self)); }) {
224 return Type::do_get_env(util::move(self));
226 return make_env(execution::get_env(Type::get_base(self)));
230 [[no_unique_address]] util::StoreIf<Base, has_base> m_base;