12345678910111213141516171819202122232425262728293031 |
- #pragma once
- #include "future.h"
- #include <util/generic/function.h>
- #include <util/thread/pool.h>
- namespace NThreading {
- /**
- * @brief Asynchronously executes @arg func in @arg queue returning a future for the result.
- *
- * @arg func should be a callable object with signature T().
- * @arg queue where @arg will be executed
- * @returns For @arg func with signature T() the function returns TFuture<T> unless T is TFuture<U>.
- * In this case the function returns TFuture<U>.
- *
- * If you want to use another queue for execution just write an overload, @see ExtensionExample
- * unittest.
- */
- template <typename Func>
- TFuture<TFutureType<TFunctionResult<Func>>> Async(Func&& func, IThreadPool& queue) {
- auto promise = NewPromise<TFutureType<TFunctionResult<Func>>>();
- auto lambda = [promise, func = std::forward<Func>(func)]() mutable {
- NImpl::SetValue(promise, func);
- };
- queue.SafeAddFunc(std::move(lambda));
- return promise.GetFuture();
- }
- }
|