Commit ff57e8ff authored by Eric Niebler's avatar Eric Niebler Committed by Facebook Github Bot

Cleanup any_time_executor and any_time_executor_ref

fbshipit-source-id: 57b9cddb7f3a2072bbf9335c3230a6f9c0219e77
parent 85207e0f
...@@ -1282,8 +1282,7 @@ class flow_single_deferred; ...@@ -1282,8 +1282,7 @@ class flow_single_deferred;
template< template<
class E = std::exception_ptr, class E = std::exception_ptr,
class TP = std::chrono::system_clock::time_point, class TP = std::chrono::system_clock::time_point>
int i = 0>
struct any_time_executor_ref; struct any_time_executor_ref;
namespace operators {} namespace operators {}
...@@ -3854,33 +3853,35 @@ time_single_deferred(Data, DSF, DNF) -> time_single_deferred<Data, DSF, DNF>; ...@@ -3854,33 +3853,35 @@ time_single_deferred(Data, DSF, DNF) -> time_single_deferred<Data, DSF, DNF>;
//#include "time_single_deferred.h" //#include "time_single_deferred.h"
namespace pushmi { namespace pushmi {
namespace detail { namespace detail {
template <class T, template <class...> class C>
using not_is_t = std::enable_if_t<!is_v<std::decay_t<T>, C>, std::decay_t<T>>;
template <class T>
using not_any_time_executor_ref_t = not_is_t<T, any_time_executor_ref>;
} // namespace detail
template<class E, class TP> template<class E, class TP>
struct any_time_executor_ref_base { struct any_time_executor_ref {
private: private:
friend any_time_executor_ref<E, TP, 0>; using This = any_time_executor_ref;
friend any_time_executor_ref<E, TP, 1>;
using Other = any_time_executor_ref<E, TP, 1>;
void* pobj_; void* pobj_;
struct vtable { struct vtable {
TP (*now_)(void*); TP (*now_)(void*);
void (*submit_)(void*, TP, void*); void (*submit_)(void*, TP, void*);
} const *vptr_; } const *vptr_;
template <class T, class U = std::decay_t<T>> template <class T>
using wrapped_t = using wrapped_t = detail::not_any_time_executor_ref_t<T>;
std::enable_if_t<!std::is_base_of<any_time_executor_ref_base, U>::value, U>;
public: public:
using properties = property_set<is_time<>, is_single<>>; using properties = property_set<is_time<>, is_single<>>;
any_time_executor_ref_base() = delete; any_time_executor_ref() = delete;
any_time_executor_ref_base(const any_time_executor_ref_base&) = default; any_time_executor_ref(const any_time_executor_ref&) = default;
PUSHMI_TEMPLATE (class Wrapped) PUSHMI_TEMPLATE (class Wrapped)
(requires TimeSender<wrapped_t<Wrapped>, is_single<>>) (requires TimeSender<wrapped_t<Wrapped>, is_single<>>)
// (requires TimeSenderTo<wrapped_t<Wrapped>, single<Other, E>>) // (requires TimeSenderTo<wrapped_t<Wrapped>, single<This, E>>)
any_time_executor_ref_base(Wrapped& w) { any_time_executor_ref(Wrapped& w) {
// This can't be a requirement because it asks if submit(w, now(w), single<T,E>) // This can't be a requirement because it asks if submit(w, now(w), single<T,E>)
// is well-formed (where T is an alias for any_time_executor_ref). If w // is well-formed (where T is an alias for any_time_executor_ref). If w
// has a submit that is constrained with SingleReceiver<single<T, E>, T'&, E'>, that // has a submit that is constrained with SingleReceiver<single<T, E>, T'&, E'>, that
...@@ -3888,9 +3889,9 @@ public: ...@@ -3888,9 +3889,9 @@ public:
// ask whether T'& is convertible to T. That brings us right back to this // ask whether T'& is convertible to T. That brings us right back to this
// constructor. Constraint recursion! // constructor. Constraint recursion!
static_assert( static_assert(
TimeSenderTo<Wrapped, single<Other, E>>, TimeSenderTo<Wrapped, single<This, E>>,
"Expecting to be passed a TimeSender that can send to a SingleReceiver" "Expecting to be passed a TimeSender that can send to a SingleReceiver"
" that accpets a value of type Other and an error of type E"); " that accpets a value of type This and an error of type E");
struct s { struct s {
static TP now(void* pobj) { static TP now(void* pobj) {
return ::pushmi::now(*static_cast<Wrapped*>(pobj)); return ::pushmi::now(*static_cast<Wrapped*>(pobj));
...@@ -3899,7 +3900,7 @@ public: ...@@ -3899,7 +3900,7 @@ public:
return ::pushmi::submit( return ::pushmi::submit(
*static_cast<Wrapped*>(pobj), *static_cast<Wrapped*>(pobj),
tp, tp,
std::move(*static_cast<single<Other, E>*>(s))); std::move(*static_cast<single<This, E>*>(s)));
} }
}; };
static const vtable vtbl{s::now, s::submit}; static const vtable vtbl{s::now, s::submit};
...@@ -3912,35 +3913,29 @@ public: ...@@ -3912,35 +3913,29 @@ public:
template<class SingleReceiver> template<class SingleReceiver>
void submit(TP tp, SingleReceiver&& sa) { void submit(TP tp, SingleReceiver&& sa) {
// static_assert( // static_assert(
// ConvertibleTo<SingleReceiver, any_single<Other, E>>, // ConvertibleTo<SingleReceiver, any_single<This, E>>,
// "requires any_single<any_time_executor_ref<E, TP>, E>"); // "requires any_single<any_time_executor_ref<E, TP>, E>");
any_single<Other, E> s{(SingleReceiver&&) sa}; any_single<This, E> s{(SingleReceiver&&) sa};
vptr_->submit_(pobj_, tp, &s); vptr_->submit_(pobj_, tp, &s);
} }
}; };
} // namespace detail
template<class E, class TP, int i>
struct any_time_executor_ref : detail::any_time_executor_ref_base<E, TP> {
using detail::any_time_executor_ref_base<E, TP>::any_time_executor_ref_base;
any_time_executor_ref(const detail::any_time_executor_ref_base<E, TP>& o)
: detail::any_time_executor_ref_base<E, TP>(o) {}
};
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// make_any_time_executor_ref // make_any_time_executor_ref
template < template <
class E = std::exception_ptr, class E = std::exception_ptr,
class TP = std::chrono::system_clock::time_point> class TP = std::chrono::system_clock::time_point>
auto make_any_time_executor_ref() -> any_time_executor_ref<E, TP> { auto make_any_time_executor_ref() {
return any_time_executor_ref<E, TP, 0>{}; return any_time_executor_ref<E, TP>{};
} }
template <
PUSHMI_TEMPLATE (
class E = std::exception_ptr, class E = std::exception_ptr,
class TP = std::chrono::system_clock::time_point, class TP = std::chrono::system_clock::time_point,
class Wrapped> class Wrapped)
auto make_any_time_executor_ref(Wrapped w) -> any_time_executor_ref<E, TP> { (requires TimeSender<detail::not_any_time_executor_ref_t<Wrapped>, is_single<>>)
return any_time_executor_ref<E, TP, 0>{std::move(w)}; auto make_any_time_executor_ref(Wrapped& w) {
return any_time_executor_ref<E, TP>{w};
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
...@@ -3951,19 +3946,30 @@ any_time_executor_ref() -> ...@@ -3951,19 +3946,30 @@ any_time_executor_ref() ->
std::exception_ptr, std::exception_ptr,
std::chrono::system_clock::time_point>; std::chrono::system_clock::time_point>;
template <class Wrapped> PUSHMI_TEMPLATE (class Wrapped)
any_time_executor_ref(Wrapped) -> (requires TimeSender<detail::not_any_time_executor_ref_t<Wrapped>, is_single<>>)
any_time_executor_ref(Wrapped&) ->
any_time_executor_ref< any_time_executor_ref<
std::exception_ptr, std::exception_ptr,
std::chrono::system_clock::time_point>; std::chrono::system_clock::time_point>;
#endif #endif
namespace detail {
template<class E, class TP> template<class E, class TP>
struct any_time_executor : using any_time_executor_base =
any_time_single_deferred<any_time_executor_ref<E, TP>, E, TP> { any_time_single_deferred<any_time_executor_ref<E, TP>, E, TP>;
template<class T, class E, class TP>
using not_any_time_executor =
std::enable_if_t<
!std::is_base_of<any_time_executor_base<E, TP>, std::decay_t<T>>::value,
std::decay_t<T>>;
} // namespace detail
template<class E, class TP>
struct any_time_executor : detail::any_time_executor_base<E, TP> {
constexpr any_time_executor() = default; constexpr any_time_executor() = default;
using any_time_single_deferred<any_time_executor_ref<E, TP>, E, TP>:: using detail::any_time_executor_base<E, TP>::any_time_executor_base;
any_time_single_deferred;
}; };
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
...@@ -3975,10 +3981,13 @@ auto make_any_time_executor() -> any_time_executor<E, TP> { ...@@ -3975,10 +3981,13 @@ auto make_any_time_executor() -> any_time_executor<E, TP> {
return any_time_executor<E, TP>{}; return any_time_executor<E, TP>{};
} }
template < PUSHMI_TEMPLATE(
class E = std::exception_ptr, class E = std::exception_ptr,
class TP = std::chrono::system_clock::time_point, class TP = std::chrono::system_clock::time_point,
class Wrapped> class Wrapped)
(requires TimeSenderTo<
detail::not_any_time_executor<Wrapped, E, TP>,
single<any_time_executor_ref<E, TP>, E>>)
auto make_any_time_executor(Wrapped w) -> any_time_executor<E, TP> { auto make_any_time_executor(Wrapped w) -> any_time_executor<E, TP> {
return any_time_executor<E, TP>{std::move(w)}; return any_time_executor<E, TP>{std::move(w)};
} }
...@@ -3991,7 +4000,17 @@ any_time_executor() -> ...@@ -3991,7 +4000,17 @@ any_time_executor() ->
std::exception_ptr, std::exception_ptr,
std::chrono::system_clock::time_point>; std::chrono::system_clock::time_point>;
template <class Wrapped> PUSHMI_TEMPLATE(class Wrapped)
(requires TimeSenderTo<
detail::not_any_time_executor<
Wrapped,
std::exception_ptr,
std::chrono::system_clock::time_point>,
single<
any_time_executor_ref<
std::exception_ptr,
std::chrono::system_clock::time_point>,
std::exception_ptr>>)
any_time_executor(Wrapped) -> any_time_executor(Wrapped) ->
any_time_executor< any_time_executor<
std::exception_ptr, std::exception_ptr,
......
...@@ -9,33 +9,35 @@ ...@@ -9,33 +9,35 @@
#include "time_single_deferred.h" #include "time_single_deferred.h"
namespace pushmi { namespace pushmi {
namespace detail { namespace detail {
template <class T, template <class...> class C>
using not_is_t = std::enable_if_t<!is_v<std::decay_t<T>, C>, std::decay_t<T>>;
template <class T>
using not_any_time_executor_ref_t = not_is_t<T, any_time_executor_ref>;
} // namespace detail
template<class E, class TP> template<class E, class TP>
struct any_time_executor_ref_base { struct any_time_executor_ref {
private: private:
friend any_time_executor_ref<E, TP, 0>; using This = any_time_executor_ref;
friend any_time_executor_ref<E, TP, 1>;
using Other = any_time_executor_ref<E, TP, 1>;
void* pobj_; void* pobj_;
struct vtable { struct vtable {
TP (*now_)(void*); TP (*now_)(void*);
void (*submit_)(void*, TP, void*); void (*submit_)(void*, TP, void*);
} const *vptr_; } const *vptr_;
template <class T, class U = std::decay_t<T>> template <class T>
using wrapped_t = using wrapped_t = detail::not_any_time_executor_ref_t<T>;
std::enable_if_t<!std::is_base_of<any_time_executor_ref_base, U>::value, U>;
public: public:
using properties = property_set<is_time<>, is_single<>>; using properties = property_set<is_time<>, is_single<>>;
any_time_executor_ref_base() = delete; any_time_executor_ref() = delete;
any_time_executor_ref_base(const any_time_executor_ref_base&) = default; any_time_executor_ref(const any_time_executor_ref&) = default;
PUSHMI_TEMPLATE (class Wrapped) PUSHMI_TEMPLATE (class Wrapped)
(requires TimeSender<wrapped_t<Wrapped>, is_single<>>) (requires TimeSender<wrapped_t<Wrapped>, is_single<>>)
// (requires TimeSenderTo<wrapped_t<Wrapped>, single<Other, E>>) // (requires TimeSenderTo<wrapped_t<Wrapped>, single<This, E>>)
any_time_executor_ref_base(Wrapped& w) { any_time_executor_ref(Wrapped& w) {
// This can't be a requirement because it asks if submit(w, now(w), single<T,E>) // This can't be a requirement because it asks if submit(w, now(w), single<T,E>)
// is well-formed (where T is an alias for any_time_executor_ref). If w // is well-formed (where T is an alias for any_time_executor_ref). If w
// has a submit that is constrained with SingleReceiver<single<T, E>, T'&, E'>, that // has a submit that is constrained with SingleReceiver<single<T, E>, T'&, E'>, that
...@@ -43,9 +45,9 @@ public: ...@@ -43,9 +45,9 @@ public:
// ask whether T'& is convertible to T. That brings us right back to this // ask whether T'& is convertible to T. That brings us right back to this
// constructor. Constraint recursion! // constructor. Constraint recursion!
static_assert( static_assert(
TimeSenderTo<Wrapped, single<Other, E>>, TimeSenderTo<Wrapped, single<This, E>>,
"Expecting to be passed a TimeSender that can send to a SingleReceiver" "Expecting to be passed a TimeSender that can send to a SingleReceiver"
" that accpets a value of type Other and an error of type E"); " that accpets a value of type This and an error of type E");
struct s { struct s {
static TP now(void* pobj) { static TP now(void* pobj) {
return ::pushmi::now(*static_cast<Wrapped*>(pobj)); return ::pushmi::now(*static_cast<Wrapped*>(pobj));
...@@ -54,7 +56,7 @@ public: ...@@ -54,7 +56,7 @@ public:
return ::pushmi::submit( return ::pushmi::submit(
*static_cast<Wrapped*>(pobj), *static_cast<Wrapped*>(pobj),
tp, tp,
std::move(*static_cast<single<Other, E>*>(s))); std::move(*static_cast<single<This, E>*>(s)));
} }
}; };
static const vtable vtbl{s::now, s::submit}; static const vtable vtbl{s::now, s::submit};
...@@ -67,35 +69,29 @@ public: ...@@ -67,35 +69,29 @@ public:
template<class SingleReceiver> template<class SingleReceiver>
void submit(TP tp, SingleReceiver&& sa) { void submit(TP tp, SingleReceiver&& sa) {
// static_assert( // static_assert(
// ConvertibleTo<SingleReceiver, any_single<Other, E>>, // ConvertibleTo<SingleReceiver, any_single<This, E>>,
// "requires any_single<any_time_executor_ref<E, TP>, E>"); // "requires any_single<any_time_executor_ref<E, TP>, E>");
any_single<Other, E> s{(SingleReceiver&&) sa}; any_single<This, E> s{(SingleReceiver&&) sa};
vptr_->submit_(pobj_, tp, &s); vptr_->submit_(pobj_, tp, &s);
} }
}; };
} // namespace detail
template<class E, class TP, int i>
struct any_time_executor_ref : detail::any_time_executor_ref_base<E, TP> {
using detail::any_time_executor_ref_base<E, TP>::any_time_executor_ref_base;
any_time_executor_ref(const detail::any_time_executor_ref_base<E, TP>& o)
: detail::any_time_executor_ref_base<E, TP>(o) {}
};
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// make_any_time_executor_ref // make_any_time_executor_ref
template < template <
class E = std::exception_ptr, class E = std::exception_ptr,
class TP = std::chrono::system_clock::time_point> class TP = std::chrono::system_clock::time_point>
auto make_any_time_executor_ref() -> any_time_executor_ref<E, TP> { auto make_any_time_executor_ref() {
return any_time_executor_ref<E, TP, 0>{}; return any_time_executor_ref<E, TP>{};
} }
template <
PUSHMI_TEMPLATE (
class E = std::exception_ptr, class E = std::exception_ptr,
class TP = std::chrono::system_clock::time_point, class TP = std::chrono::system_clock::time_point,
class Wrapped> class Wrapped)
auto make_any_time_executor_ref(Wrapped w) -> any_time_executor_ref<E, TP> { (requires TimeSender<detail::not_any_time_executor_ref_t<Wrapped>, is_single<>>)
return any_time_executor_ref<E, TP, 0>{std::move(w)}; auto make_any_time_executor_ref(Wrapped& w) {
return any_time_executor_ref<E, TP>{w};
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
...@@ -106,19 +102,30 @@ any_time_executor_ref() -> ...@@ -106,19 +102,30 @@ any_time_executor_ref() ->
std::exception_ptr, std::exception_ptr,
std::chrono::system_clock::time_point>; std::chrono::system_clock::time_point>;
template <class Wrapped> PUSHMI_TEMPLATE (class Wrapped)
any_time_executor_ref(Wrapped) -> (requires TimeSender<detail::not_any_time_executor_ref_t<Wrapped>, is_single<>>)
any_time_executor_ref(Wrapped&) ->
any_time_executor_ref< any_time_executor_ref<
std::exception_ptr, std::exception_ptr,
std::chrono::system_clock::time_point>; std::chrono::system_clock::time_point>;
#endif #endif
namespace detail {
template<class E, class TP> template<class E, class TP>
struct any_time_executor : using any_time_executor_base =
any_time_single_deferred<any_time_executor_ref<E, TP>, E, TP> { any_time_single_deferred<any_time_executor_ref<E, TP>, E, TP>;
template<class T, class E, class TP>
using not_any_time_executor =
std::enable_if_t<
!std::is_base_of<any_time_executor_base<E, TP>, std::decay_t<T>>::value,
std::decay_t<T>>;
} // namespace detail
template<class E, class TP>
struct any_time_executor : detail::any_time_executor_base<E, TP> {
constexpr any_time_executor() = default; constexpr any_time_executor() = default;
using any_time_single_deferred<any_time_executor_ref<E, TP>, E, TP>:: using detail::any_time_executor_base<E, TP>::any_time_executor_base;
any_time_single_deferred;
}; };
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
...@@ -130,10 +137,13 @@ auto make_any_time_executor() -> any_time_executor<E, TP> { ...@@ -130,10 +137,13 @@ auto make_any_time_executor() -> any_time_executor<E, TP> {
return any_time_executor<E, TP>{}; return any_time_executor<E, TP>{};
} }
template < PUSHMI_TEMPLATE(
class E = std::exception_ptr, class E = std::exception_ptr,
class TP = std::chrono::system_clock::time_point, class TP = std::chrono::system_clock::time_point,
class Wrapped> class Wrapped)
(requires TimeSenderTo<
detail::not_any_time_executor<Wrapped, E, TP>,
single<any_time_executor_ref<E, TP>, E>>)
auto make_any_time_executor(Wrapped w) -> any_time_executor<E, TP> { auto make_any_time_executor(Wrapped w) -> any_time_executor<E, TP> {
return any_time_executor<E, TP>{std::move(w)}; return any_time_executor<E, TP>{std::move(w)};
} }
...@@ -146,7 +156,17 @@ any_time_executor() -> ...@@ -146,7 +156,17 @@ any_time_executor() ->
std::exception_ptr, std::exception_ptr,
std::chrono::system_clock::time_point>; std::chrono::system_clock::time_point>;
template <class Wrapped> PUSHMI_TEMPLATE(class Wrapped)
(requires TimeSenderTo<
detail::not_any_time_executor<
Wrapped,
std::exception_ptr,
std::chrono::system_clock::time_point>,
single<
any_time_executor_ref<
std::exception_ptr,
std::chrono::system_clock::time_point>,
std::exception_ptr>>)
any_time_executor(Wrapped) -> any_time_executor(Wrapped) ->
any_time_executor< any_time_executor<
std::exception_ptr, std::exception_ptr,
......
...@@ -70,8 +70,7 @@ class flow_single_deferred; ...@@ -70,8 +70,7 @@ class flow_single_deferred;
template< template<
class E = std::exception_ptr, class E = std::exception_ptr,
class TP = std::chrono::system_clock::time_point, class TP = std::chrono::system_clock::time_point>
int i = 0>
struct any_time_executor_ref; struct any_time_executor_ref;
namespace operators {} namespace operators {}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment