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&
66 return this->m_base.value;
68 auto base()
const& -> Base
const&
71 return this->m_base.value;
73 auto base() && -> Base&&
requires(has_base) {
74 return util::move(this->m_base).value;
75 }
auto base()
const&& -> Base
const&&
78 return util::move(this->m_base).value;
88 explicit Type(T&& value) : m_base(util::forward<T>(value)) {}
107 constexpr static int get_env = 1;
110 constexpr static auto missing_set_value() ->
bool {
111 return requires {
requires bool(
int(S::set_value)); };
114 constexpr static auto missing_set_error() ->
bool {
115 return requires {
requires bool(
int(S::set_error)); };
118 constexpr static auto missing_set_stopped() ->
bool {
119 return requires {
requires bool(
int(S::set_stopped)); };
122 constexpr static auto missing_set_next() ->
bool {
123 return requires {
requires bool(
int(S::set_next)); };
126 constexpr static auto missing_get_env() ->
bool {
127 return requires {
requires bool(
int(S::get_env)); };
130 template<
typename S,
typename... Args>
131 static auto do_set_value(S&& self, Args&&... args)
132 ->
decltype(util::forward<S>(self).set_value(util::forward<Args>(args)...)) {
133 return util::forward<S>(self).set_value(util::forward<Args>(args)...);
135 template<
typename S,
typename... Args>
136 static auto do_set_error(S&& self, Args&&... args)
137 ->
decltype(util::forward<S>(self).set_error(util::forward<Args>(args)...)) {
138 return util::forward<S>(self).set_error(util::forward<Args>(args)...);
140 template<
typename S,
typename... Args>
141 static auto do_set_stopped(S&& self, Args&&... args)
142 ->
decltype(util::forward<S>(self).set_stopped(util::forward<Args>(args)...)) {
143 return util::forward<S>(self).set_stopped(util::forward<Args>(args)...);
145 template<
typename S,
typename... Args>
146 static auto do_set_next(S& self, Args&&... args) ->
decltype(self.set_next(util::forward<Args>(args)...)) {
147 return self.set_next(util::forward<Args>(args)...);
149 template<
typename S,
typename... Args>
150 static auto do_get_env(S&& self, Args&&... args)
151 ->
decltype(util::forward<S>(self).get_env(util::forward<Args>(args)...)) {
152 return util::forward<S>(self).get_env(util::forward<Args>(args)...);
155 template<concepts::SameAs<SetValue> Tag,
typename S = Self,
typename... Args>
158 requires { Type::do_set_value(util::move(self), util::forward<Args>(args)...); } ||
160 requires missing_set_value<S>();
164 if constexpr (
requires { Type::do_set_value(util::move(self), util::forward<Args>(args)...); }) {
165 Type::do_set_value(util::move(self), util::forward<Args>(args)...);
171 template<concepts::SameAs<SetError> Tag,
typename Arg,
typename S = Self>
174 requires { Type::do_set_error(util::move(self), util::forward<Arg>(arg)); } ||
176 requires missing_set_error<S>();
180 if constexpr (
requires { Type::do_set_error(util::move(self), util::forward<Arg>(arg)); }) {
181 Type::do_set_error(util::move(self), util::forward<Arg>(arg));
187 template<concepts::SameAs<SetStopped> Tag,
typename S = Self>
190 requires { Type::do_set_stopped(util::move(self)); } ||
192 requires missing_set_stopped<S>();
196 if constexpr (
requires { Type::do_set_stopped(util::move(self)); }) {
197 Type::do_set_stopped(util::move(self));
203 template<concepts::SameAs<types::Tag<execution::set_next>> Tag,
typename N,
typename S = Self>
206 requires { Type::do_set_next(self, util::forward<N>(
next)); } ||
208 requires missing_set_next<S>();
212 if constexpr (
requires { Type::do_set_next(self, util::forward<N>(
next)); }) {
213 return Type::do_set_next(self, util::forward<N>(
next));
219 template<concepts::SameAs<types::Tag<execution::get_env>> Tag,
typename S = Self>
220 friend auto tag_invoke(Tag, Self
const& self) ->
decltype(
auto)
222 requires { Type::do_get_env(util::move(self)); } ||
224 requires missing_get_env<S>();
225 execution::get_env(Type::get_base(self));
228 if constexpr (
requires { Type::do_get_env(util::move(self)); }) {
229 return Type::do_get_env(util::move(self));
231 return make_env(execution::get_env(Type::get_base(self)));
235 [[no_unique_address]] util::StoreIf<Base, has_base> m_base;