Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
109 changes: 28 additions & 81 deletions include/ustdex/detail/rcvr_with_env.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,107 +28,54 @@ namespace ustdex
template <class Rcvr, class Env>
struct _rcvr_with_env_t : Rcvr
{
using _env_t = _rcvr_with_env_t const&;

USTDEX_TRIVIAL_API auto _rcvr() noexcept -> Rcvr&
{
return *this;
}

USTDEX_TRIVIAL_API auto _rcvr() const noexcept -> const Rcvr&
struct _env_t
{
return *this;
}

USTDEX_TRIVIAL_API auto get_env() const noexcept -> _env_t
{
return _env_t{*this};
}

template <class Query>
USTDEX_TRIVIAL_API static constexpr decltype(auto) _get_1st(const _rcvr_with_env_t& _self) noexcept
{
if constexpr (_queryable_with<Env, Query>)
template <class Query>
USTDEX_TRIVIAL_API static constexpr decltype(auto) _get_1st(const _env_t& self) noexcept
{
return (_self._env_);
if constexpr (_queryable_with<Env, Query>)
{
return (self._rcvr_->_env_);
}
else if constexpr (_queryable_with<env_of_t<Rcvr>, Query>)
{
return ustdex::get_env(static_cast<const Rcvr&>(*self._rcvr_));
}
}
else if constexpr (_queryable_with<env_of_t<Rcvr>, Query>)
{
return ustdex::get_env(static_cast<const Rcvr&>(_self));
}
}

template <class Query>
using _1st_env_t = decltype(_rcvr_with_env_t::_get_1st<Query>(declval<const _rcvr_with_env_t&>()));
template <class Query>
using _1st_env_t = decltype(_env_t::_get_1st<Query>(declval<const _env_t&>()));

template <class Query>
USTDEX_TRIVIAL_API constexpr auto query(Query _query) const
noexcept(_nothrow_queryable_with<_1st_env_t<Query>, Query>) //
-> _query_result_t<_1st_env_t<Query>, Query>
{
return _rcvr_with_env_t::_get_1st<Query>(*this).query(_query);
}

Env _env_;
};

template <class Rcvr, class Env>
struct _rcvr_with_env_t<Rcvr*, Env>
{
using _env_t = _rcvr_with_env_t const&;
template <class Query>
USTDEX_TRIVIAL_API constexpr auto query(Query) const noexcept(_nothrow_queryable_with<_1st_env_t<Query>, Query>) //
-> _query_result_t<_1st_env_t<Query>, Query>
{
return _env_t::_get_1st<Query>(*this);
}

USTDEX_TRIVIAL_API auto _rcvr() const noexcept -> Rcvr*
{
return _rcvr_;
}
_rcvr_with_env_t const* _rcvr_;
};

template <class... As>
USTDEX_TRIVIAL_API void set_value(As&&... _as) && noexcept
USTDEX_TRIVIAL_API auto base() && noexcept -> Rcvr&&
{
ustdex::set_value(_rcvr_, static_cast<As&&>(_as)...);
return static_cast<Rcvr&&>(*this);
}

template <class Error>
USTDEX_TRIVIAL_API void set_error(Error&& _error) && noexcept
USTDEX_TRIVIAL_API auto base() & noexcept -> Rcvr&
{
ustdex::set_error(_rcvr_, static_cast<Error&&>(_error));
return *this;
}

USTDEX_TRIVIAL_API void set_stopped() && noexcept
USTDEX_TRIVIAL_API auto base() const& noexcept -> Rcvr const&
{
ustdex::set_stopped(_rcvr_);
return *this;
}

USTDEX_TRIVIAL_API auto get_env() const noexcept -> _env_t
{
return _env_t{*this};
}

template <class Query>
USTDEX_TRIVIAL_API constexpr decltype(auto) _get_1st(Query) const noexcept
{
if constexpr (_queryable_with<Env, Query>)
{
return (_env_);
}
else if constexpr (_queryable_with<env_of_t<Rcvr>, Query>)
{
return ustdex::get_env(_rcvr_);
}
}

template <class Query, class Self = _rcvr_with_env_t>
using _1st_env_t = decltype(declval<const Self&>()._get_1st(Query{}));

template <class Query>
USTDEX_TRIVIAL_API constexpr auto query(Query _query) const
noexcept(_nothrow_queryable_with<_1st_env_t<Query>, Query>) //
-> _query_result_t<_1st_env_t<Query>, Query>
{
return _get_1st(_query).query(_query);
return _env_t{this};
}

Rcvr* _rcvr_;
Env _env_;
};

Expand Down
133 changes: 0 additions & 133 deletions include/ustdex/detail/receiver_with_env.hpp

This file was deleted.

27 changes: 8 additions & 19 deletions include/ustdex/detail/starts_on.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,15 +43,16 @@ inline constexpr struct start_on_t
{
private:
template <class Rcvr, class Sch, class CvSndr>
struct USTDEX_TYPE_VISIBILITY_DEFAULT _opstate_t
struct USTDEX_TYPE_VISIBILITY_DEFAULT _opstate_t : _rcvr_with_env_t<Rcvr, _sch_env_t<Sch>>
{
using operation_state_concept = operation_state_t;
using _env_t = env_of_t<Rcvr>;
using _rcvr_with_sch_t = _rcvr_with_env_t<Rcvr, _sch_env_t<Sch>>;

USTDEX_API _opstate_t(Sch _sch, Rcvr _rcvr, CvSndr&& _sndr)
: _env_rcvr_{static_cast<Rcvr&&>(_rcvr), {_sch}}
, _opstate1_{connect(schedule(_env_rcvr_._env_._sch_), _rcvr_ref{*this})}
, _opstate2_{connect(static_cast<CvSndr&&>(_sndr), _rcvr_ref{_env_rcvr_})}
: _rcvr_with_sch_t{static_cast<Rcvr&&>(_rcvr), {_sch}}
, _opstate1_{connect(schedule(this->_env_._sch_), _rcvr_ref<_opstate_t>{*this})}
, _opstate2_{connect(static_cast<CvSndr&&>(_sndr), _rcvr_ref<_rcvr_with_sch_t>{*this})}
{}

USTDEX_IMMOVABLE(_opstate_t);
Expand All @@ -66,25 +67,13 @@ inline constexpr struct start_on_t
ustdex::start(_opstate2_);
}

template <class Error>
USTDEX_API void set_error(Error&& _error) noexcept
{
ustdex::set_error(static_cast<Rcvr&&>(_env_rcvr_._rcvr()), static_cast<Error&&>(_error));
}

USTDEX_API void set_stopped() noexcept
{
ustdex::set_stopped(static_cast<Rcvr&&>(_env_rcvr_._rcvr()));
}

USTDEX_API auto get_env() const noexcept -> _env_t
{
return ustdex::get_env(_env_rcvr_._rcvr());
return ustdex::get_env(this->base());
}

_rcvr_with_env_t<Rcvr, _sch_env_t<Sch>> _env_rcvr_;
connect_result_t<schedule_result_t<Sch>, _rcvr_ref<_opstate_t, _env_t>> _opstate1_;
connect_result_t<CvSndr, _rcvr_ref<_rcvr_with_env_t<Rcvr, _sch_env_t<Sch>>>> _opstate2_;
connect_result_t<schedule_result_t<Sch&>, _rcvr_ref<_opstate_t, _env_t>> _opstate1_;
connect_result_t<CvSndr, _rcvr_ref<_rcvr_with_sch_t>> _opstate2_;
};

template <class Sch, class Sndr>
Expand Down