#include "wait.h" #include "wait_group.h" #include "wait_policy.h" namespace NThreading { namespace { template TFuture WaitGeneric(const TFuture& f1) { return f1; } template TFuture WaitGeneric(const TFuture& f1, const TFuture& f2) { TWaitGroup wg; wg.Add(f1).Add(f2); return std::move(wg).Finish(); } template TFuture WaitGeneric(TArrayRef> futures) { if (futures.empty()) { return MakeFuture(); } if (futures.size() == 1) { return futures.front(); } TWaitGroup wg; for (const auto& fut : futures) { wg.Add(fut); } return std::move(wg).Finish(); } } //////////////////////////////////////////////////////////////////////////////// TFuture WaitAll(const TFuture& f1) { return WaitGeneric(f1); } TFuture WaitAll(const TFuture& f1, const TFuture& f2) { return WaitGeneric(f1, f2); } TFuture WaitAll(TArrayRef> futures) { return WaitGeneric(futures); } //////////////////////////////////////////////////////////////////////////////// TFuture WaitExceptionOrAll(const TFuture& f1) { return WaitGeneric(f1); } TFuture WaitExceptionOrAll(const TFuture& f1, const TFuture& f2) { return WaitGeneric(f1, f2); } TFuture WaitExceptionOrAll(TArrayRef> futures) { return WaitGeneric(futures); } //////////////////////////////////////////////////////////////////////////////// TFuture WaitAny(const TFuture& f1) { return WaitGeneric(f1); } TFuture WaitAny(const TFuture& f1, const TFuture& f2) { return WaitGeneric(f1, f2); } TFuture WaitAny(TArrayRef> futures) { return WaitGeneric(futures); } }