From f25d7ac068927133eedfb5805c2491e8973cd93d Mon Sep 17 00:00:00 2001 From: Tomasz Grabiec Date: Fri, 6 Mar 2015 10:01:25 +0100 Subject: [PATCH] core: Add futurize::apply() Invokes given function wrapping the result in a future if necessary. --- core/future.hh | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/core/future.hh b/core/future.hh index 25ee4a1287..8f92915097 100644 --- a/core/future.hh +++ b/core/future.hh @@ -363,18 +363,36 @@ template struct futurize { using type = future; using promise_type = promise; + + template + static inline type apply(Func&& func, std::tuple&& args); + + template + static inline type apply(Func&& func, FuncArgs&&... args); }; template <> struct futurize { using type = future<>; using promise_type = promise<>; + + template + static inline type apply(Func&& func, std::tuple&& args); + + template + static inline type apply(Func&& func, FuncArgs&&... args); }; template struct futurize> { using type = future; using promise_type = promise; + + template + static inline type apply(Func&& func, std::tuple&& args); + + template + static inline type apply(Func&& func, FuncArgs&&... args); }; // Converts a type to a future type, if it isn't already. @@ -721,4 +739,40 @@ future make_exception_future(Exception&& ex) noexcept { return make_exception_future(std::make_exception_ptr(std::forward(ex))); } +template +template +typename futurize::type futurize::apply(Func&& func, std::tuple&& args) { + return make_ready_future(::apply(std::forward(func), std::move(args))); +} + +template +template +typename futurize::type futurize::apply(Func&& func, FuncArgs&&... args) { + return make_ready_future(func(std::forward(args)...)); +} + +template +typename futurize::type futurize::apply(Func&& func, std::tuple&& args) { + ::apply(std::forward(func), std::move(args)); + return make_ready_future<>(); +} + +template +typename futurize::type futurize::apply(Func&& func, FuncArgs&&... args) { + func(std::forward(args)...); + return make_ready_future<>(); +} + +template +template +typename futurize>::type futurize>::apply(Func&& func, std::tuple&& args) { + return ::apply(std::forward(func), std::move(args)); +} + +template +template +typename futurize>::type futurize>::apply(Func&& func, FuncArgs&&... args) { + return func(std::forward(args)...); +} + #endif /* FUTURE_HH_ */