clean up the helper funcs

master
Daniel Kolesa 2017-03-24 15:24:07 +01:00
parent c96d64e5ba
commit a1974ddf45
1 changed files with 11 additions and 35 deletions

View File

@ -547,23 +547,8 @@ using coroutine_scheduler =
using protected_coroutine_scheduler = using protected_coroutine_scheduler =
basic_coroutine_scheduler<stack_traits, true>; basic_coroutine_scheduler<stack_traits, true>;
namespace detail { template<typename F, typename ...A>
template<typename S> inline void spawn(scheduler &sched, F &&func, A &&...args) {
std::true_type has_spawn_test(decltype(
std::declval<S>().spawn(std::declval<std::function<void()>>())
) *);
template<typename>
std::false_type has_spawn_test(...);
template<typename S>
constexpr bool has_sched_spawn = decltype(has_spawn_test<S>(0))::value;
}
template<typename S, typename F, typename ...A>
inline auto spawn(S &sched, F &&func, A &&...args) -> std::enable_if_t<
std::is_base_of_v<scheduler, S>
> {
if constexpr(sizeof...(A) == 0) { if constexpr(sizeof...(A) == 0) {
sched.spawn(std::forward<F>(func)); sched.spawn(std::forward<F>(func));
} else { } else {
@ -572,20 +557,14 @@ inline auto spawn(S &sched, F &&func, A &&...args) -> std::enable_if_t<
} }
template<typename F, typename ...A> template<typename F, typename ...A>
inline auto spawn(F &&func, A &&...args) -> std::enable_if_t< inline void spawn(F &&func, A &&...args) {
!std::is_base_of_v<scheduler, F> spawn(
> { *detail::current_scheduler,
if constexpr(sizeof...(A) == 0) { std::forward<F>(func), std::forward<A>(args)...
detail::current_scheduler->spawn(std::forward<F>(func)); );
} else {
detail::current_scheduler->spawn(
std::bind(std::forward<F>(func), std::forward<A>(args)...)
);
}
} }
template<typename S> inline void yield(scheduler &sched) {
inline void yield(S &sched) {
sched.yield(); sched.yield();
} }
@ -593,8 +572,8 @@ inline void yield() {
detail::current_scheduler->yield(); detail::current_scheduler->yield();
} }
template<typename T, typename S> template<typename T>
inline channel<T> make_channel(S &sched) { inline channel<T> make_channel(scheduler &sched) {
return channel<T>{[&sched]() { return channel<T>{[&sched]() {
return sched.make_condition(); return sched.make_condition();
}}; }};
@ -602,10 +581,7 @@ inline channel<T> make_channel(S &sched) {
template<typename T> template<typename T>
inline channel<T> make_channel() { inline channel<T> make_channel() {
auto *curr = detail::current_scheduler; return make_channel<T>(*detail::current_scheduler);
return channel<T>{[curr]() {
return curr->make_condition();
}};
} }
} /* namespace ostd */ } /* namespace ostd */