diff options
author | Dan Vrátil <dvratil@redhat.com> | 2015-03-30 15:47:45 +0200 |
---|---|---|
committer | Dan Vrátil <dvratil@redhat.com> | 2015-03-30 15:47:45 +0200 |
commit | 1d946c166cc7a4a2556e8bfaab7dc66695b555e1 (patch) | |
tree | d51e2fd0cb83867243813feb4ea4ecace3ef2e60 /async/src/async.h | |
parent | 3b8ebe6d4235f5ba12bc9c9854a6dd28cbff06b5 (diff) | |
download | sink-1d946c166cc7a4a2556e8bfaab7dc66695b555e1.tar.gz sink-1d946c166cc7a4a2556e8bfaab7dc66695b555e1.zip |
Async: allow consumer continuation without arguments
It is now possible to chain a job that takes no arguments after a job
that returns void.
Unfortunatelly it is not yet possible to disregard return value of a
previous job.
Diffstat (limited to 'async/src/async.h')
-rw-r--r-- | async/src/async.h | 37 |
1 files changed, 33 insertions, 4 deletions
diff --git a/async/src/async.h b/async/src/async.h index 8296fbc..2be1260 100644 --- a/async/src/async.h +++ b/async/src/async.h | |||
@@ -150,7 +150,10 @@ class SyncThenExecutor : public Executor<typename detail::prevOut<In ...>::type, | |||
150 | public: | 150 | public: |
151 | SyncThenExecutor(SyncThenTask<Out, In ...> then, ErrorHandler errorHandler, const ExecutorBasePtr &parent); | 151 | SyncThenExecutor(SyncThenTask<Out, In ...> then, ErrorHandler errorHandler, const ExecutorBasePtr &parent); |
152 | void previousFutureReady(); | 152 | void previousFutureReady(); |
153 | |||
153 | private: | 154 | private: |
155 | void run(std::false_type); // !std::is_void<Out> | ||
156 | void run(std::true_type); // std::is_void<Out> | ||
154 | SyncThenTask<Out, In ...> mFunc; | 157 | SyncThenTask<Out, In ...> mFunc; |
155 | }; | 158 | }; |
156 | 159 | ||
@@ -170,6 +173,8 @@ public: | |||
170 | SyncEachExecutor(SyncEachTask<Out, In> each, ErrorHandler errorHandler, const ExecutorBasePtr &parent); | 173 | SyncEachExecutor(SyncEachTask<Out, In> each, ErrorHandler errorHandler, const ExecutorBasePtr &parent); |
171 | void previousFutureReady(); | 174 | void previousFutureReady(); |
172 | private: | 175 | private: |
176 | void run(Async::Future<Out> *future, const typename PrevOut::value_type &arg, std::false_type); // !std::is_void<Out> | ||
177 | void run(Async::Future<Out> *future, const typename PrevOut::value_type &arg, std::true_type); // std::is_void<Out> | ||
173 | SyncEachTask<Out, In> mFunc; | 178 | SyncEachTask<Out, In> mFunc; |
174 | }; | 179 | }; |
175 | 180 | ||
@@ -386,8 +391,8 @@ private: | |||
386 | { | 391 | { |
387 | static_assert(detail::isIterable<Out>::value, | 392 | static_assert(detail::isIterable<Out>::value, |
388 | "The 'Each' task can only be connected to a job that returns a list or an array."); | 393 | "The 'Each' task can only be connected to a job that returns a list or an array."); |
389 | static_assert(detail::isIterable<OutOther>::value, | 394 | static_assert(std::is_void<OutOther>::value || detail::isIterable<OutOther>::value, |
390 | "The result type of 'Each' task must be a list or an array."); | 395 | "The result type of 'Each' task must be void, a list or an array."); |
391 | } | 396 | } |
392 | 397 | ||
393 | template<typename InOther> | 398 | template<typename InOther> |
@@ -603,9 +608,21 @@ void SyncThenExecutor<Out, In ...>::previousFutureReady() | |||
603 | assert(this->mPrevFuture->isFinished()); | 608 | assert(this->mPrevFuture->isFinished()); |
604 | } | 609 | } |
605 | 610 | ||
611 | run(std::is_void<Out>()); | ||
612 | this->mResult->setFinished(); | ||
613 | } | ||
614 | |||
615 | template<typename Out, typename ... In> | ||
616 | void SyncThenExecutor<Out, In ...>::run(std::false_type) | ||
617 | { | ||
606 | Out result = this->mFunc(this->mPrevFuture ? this->mPrevFuture->value() : In() ...); | 618 | Out result = this->mFunc(this->mPrevFuture ? this->mPrevFuture->value() : In() ...); |
607 | static_cast<Async::Future<Out>*>(this->mResult)->setValue(result); | 619 | static_cast<Async::Future<Out>*>(this->mResult)->setValue(result); |
608 | this->mResult->setFinished(); | 620 | } |
621 | |||
622 | template<typename Out, typename ... In> | ||
623 | void SyncThenExecutor<Out, In ...>::run(std::true_type) | ||
624 | { | ||
625 | this->mFunc(this->mPrevFuture ? this->mPrevFuture->value() : In() ...); | ||
609 | } | 626 | } |
610 | 627 | ||
611 | template<typename PrevOut, typename Out, typename In> | 628 | template<typename PrevOut, typename Out, typename In> |
@@ -626,11 +643,23 @@ void SyncEachExecutor<PrevOut, Out, In>::previousFutureReady() | |||
626 | } | 643 | } |
627 | 644 | ||
628 | for (auto arg : this->mPrevFuture->value()) { | 645 | for (auto arg : this->mPrevFuture->value()) { |
629 | out->setValue(out->value() + this->mFunc(arg)); | 646 | run(out, arg, std::is_void<Out>()); |
630 | } | 647 | } |
631 | out->setFinished(); | 648 | out->setFinished(); |
632 | } | 649 | } |
633 | 650 | ||
651 | template<typename PrevOut, typename Out, typename In> | ||
652 | void SyncEachExecutor<PrevOut, Out, In>::run(Async::Future<Out> *out, const typename PrevOut::value_type &arg, std::false_type) | ||
653 | { | ||
654 | out->setValue(out->value() + this->mFunc(arg)); | ||
655 | } | ||
656 | |||
657 | template<typename PrevOut, typename Out, typename In> | ||
658 | void SyncEachExecutor<PrevOut, Out, In>::run(Async::Future<Out> * /* unushed */, const typename PrevOut::value_type &arg, std::true_type) | ||
659 | { | ||
660 | this->mFunc(arg); | ||
661 | } | ||
662 | |||
634 | template<typename Out, typename In> | 663 | template<typename Out, typename In> |
635 | SyncReduceExecutor<Out, In>::SyncReduceExecutor(SyncReduceTask<Out, In> reduce, ErrorHandler errorHandler, const ExecutorBasePtr &parent) | 664 | SyncReduceExecutor<Out, In>::SyncReduceExecutor(SyncReduceTask<Out, In> reduce, ErrorHandler errorHandler, const ExecutorBasePtr &parent) |
636 | : SyncThenExecutor<Out, In>(reduce, errorHandler, parent) | 665 | : SyncThenExecutor<Out, In>(reduce, errorHandler, parent) |