3 #include <tbb/task.h>
\r
4 #include <tbb/concurrent_queue.h>
\r
5 #include <boost/thread/future.hpp>
\r
7 namespace caspar { namespace common { namespace function_task {
\r
11 template<typename Func>
\r
12 class packaged_task : public tbb::task
\r
15 packaged_task(boost::packaged_task<Func>&& task) : task_(std::forward<boost::packaged_task<Func>>(task)) {}
\r
18 tbb::task* execute()
\r
24 boost::packaged_task<Func> task_;
\r
27 template<typename Func>
\r
28 class internal_function_task : public tbb::task
\r
31 internal_function_task(Func&& func) : func_(std::forward<Func>(func)) {}
\r
33 tbb::task* execute()
\r
43 template <typename Func>
\r
44 void enqueue(Func&& func)
\r
46 tbb::task::enqueue(*new(tbb::task::allocate_root()) detail::internal_function_task<Func>(std::forward<Func>(func)));
\r
49 template<typename Func>
\r
50 auto begin_invoke(Func&& func) -> boost::unique_future<decltype(func())>
\r
52 auto task = boost::packaged_task<decltype(func())>(std::forward<Func>(func));
\r
53 auto future = task.get_future();
\r
54 tbb::task::enqueue(*new(tbb::task::allocate_root()) detail::packaged_task<decltype(func())>(boost::move(task)));
\r
55 return std::move(future);
\r
58 template<typename Func>
\r
59 auto invoke(Func&& func) -> decltype(func())
\r
61 return function_task::begin_invoke(std::forward<Func>(func)).get();
\r