summaryrefslogtreecommitdiffstats
path: root/async/src/async.h
diff options
context:
space:
mode:
authorDan Vrátil <dvratil@redhat.com>2015-03-30 15:47:45 +0200
committerDan Vrátil <dvratil@redhat.com>2015-03-30 15:47:45 +0200
commit1d946c166cc7a4a2556e8bfaab7dc66695b555e1 (patch)
treed51e2fd0cb83867243813feb4ea4ecace3ef2e60 /async/src/async.h
parent3b8ebe6d4235f5ba12bc9c9854a6dd28cbff06b5 (diff)
downloadsink-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.h37
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,
150public: 150public:
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
153private: 154private:
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();
172private: 175private:
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
615template<typename Out, typename ... In>
616void 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
622template<typename Out, typename ... In>
623void SyncThenExecutor<Out, In ...>::run(std::true_type)
624{
625 this->mFunc(this->mPrevFuture ? this->mPrevFuture->value() : In() ...);
609} 626}
610 627
611template<typename PrevOut, typename Out, typename In> 628template<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
651template<typename PrevOut, typename Out, typename In>
652void 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
657template<typename PrevOut, typename Out, typename In>
658void 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
634template<typename Out, typename In> 663template<typename Out, typename In>
635SyncReduceExecutor<Out, In>::SyncReduceExecutor(SyncReduceTask<Out, In> reduce, ErrorHandler errorHandler, const ExecutorBasePtr &parent) 664SyncReduceExecutor<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)