39 #ifndef CGU_TASK_MANAGER_H
40 #define CGU_TASK_MANAGER_H
46 #include <type_traits>
63 virtual const char*
what()
const throw() {
return "TaskError\n";}
327 namespace TaskManagerHelper {
329 template <
class Ret,
class FType>
355 template <
class Ret,
class FType>
357 mutable FType functor;
363 template <
class FunctorArg>
377 typedef std::pair<std::unique_ptr<const Callback::Callback>,
378 std::unique_ptr<const Callback::Callback>> QueueItemType;
387 void set_max_threads_impl(
unsigned int max);
706 add_task(std::unique_ptr<const Callback::Callback>(task),
707 std::unique_ptr<const Callback::Callback>());
771 void add_task(std::unique_ptr<const Callback::Callback> task,
772 std::unique_ptr<const Callback::Callback> fail);
830 template <
class Task,
831 class =
typename std::enable_if<!std::is_convertible<typename std::remove_reference<Task>::type,
834 add_task(std::unique_ptr<const Callback::Callback>(Callback::lambda<>(std::forward<Task>(task))),
835 std::unique_ptr<const Callback::Callback>());
913 template <
class Task,
class Fail,
914 class =
typename std::enable_if<!std::is_convertible<Task, std::unique_ptr<const Callback::Callback>>::value
915 && !std::is_convertible<Fail, std::unique_ptr<const Callback::Callback>>::value>::type>
917 std::unique_ptr<const Callback::Callback> task_cb(
918 Callback::lambda<>(std::forward<Task>(task))
920 std::unique_ptr<const Callback::Callback> fail_cb(
921 Callback::lambda<>(std::forward<Fail>(fail))
923 add_task(std::move(task_cb), std::move(fail_cb));
996 template <
class Ret,
class... Params,
class... Args,
class T>
998 Ret (T::*func)(Params...),
1131 template <
class Ret,
class... Params,
class... Args,
class T>
1134 std::unique_ptr<const Cgu::Callback::Callback> fail,
1137 GMainContext* context,
1139 Ret (T::*func)(Params...),
1219 template <
class Ret,
class... Params,
class... Args,
class T>
1221 GMainContext* context,
1223 Ret (T::*func)(Params...),
1225 static_assert(
sizeof...(Args) < 4,
1226 "No greater than three bound arguments can be passed to "
1227 "TaskManager::make_task_when() taking a member function.");
1231 std::unique_ptr<const Cgu::Callback::Callback>(),
1237 std::forward<Args>(args)...);
1292 template <
class Ret,
class... Params,
class... Args,
class T>
1294 Ret (T::*func)(Params...)
const,
1427 template <
class Ret,
class... Params,
class... Args,
class T>
1430 std::unique_ptr<const Cgu::Callback::Callback> fail,
1433 GMainContext* context,
1435 Ret (T::*func)(Params...)
const,
1515 template <
class Ret,
class... Params,
class... Args,
class T>
1517 GMainContext* context,
1519 Ret (T::*func)(Params...)
const,
1521 static_assert(
sizeof...(Args) < 4,
1522 "No greater than three bound arguments can be passed to "
1523 "TaskManager::make_task_when() taking a member function.");
1527 std::unique_ptr<const Cgu::Callback::Callback>(),
1533 std::forward<Args>(args)...);
1585 template <
class Ret,
class... Params,
class... Args>
1716 template <
class Ret,
class... Params,
class... Args>
1719 std::unique_ptr<const Cgu::Callback::Callback> fail,
1722 GMainContext* context,
1723 Ret (*func)(Params...),
1800 template <
class Ret,
class... Params,
class... Args>
1802 GMainContext* context,
1803 Ret (*func)(Params...),
1805 static_assert(
sizeof...(Args) < 5,
1806 "No greater than four bound arguments can be passed to "
1807 "TaskManager::make_task_when() taking a function.");
1811 std::unique_ptr<const Cgu::Callback::Callback>(),
1816 std::forward<Args>(args)...);
1884 template <
class Ret,
class Func>
1890 #ifndef DOXYGEN_PARSING
1891 template <
class Func>
1910 typedef typename std::remove_const<typename std::remove_reference<Func>::type>::type FType;
1911 typedef decltype(f()) Ret;
1915 CbPtr exec_cb(
new TaskManagerHelper::FunctorResultExec<Ret, FType>(std::forward<Func>(f), ret));
1916 CbPtr do_fail_cb(
Callback::make_ref(&TaskManagerHelper::FunctorResultWrapper<Ret, FType>::do_fail,
1918 add_task(std::move(exec_cb), std::move(do_fail_cb));
2052 template <
class Ret,
class Func>
2055 std::unique_ptr<const Cgu::Callback::Callback> fail,
2058 GMainContext* context,
2198 template <
class When,
class Fail,
class Func,
2199 class =
typename std::enable_if<!std::is_convertible<When, std::unique_ptr<const Callback::CallbackArg<const typename std::result_of<Func()>::type&>>>::value
2200 && !std::is_convertible<Fail, std::unique_ptr<const Callback::Callback>>::value>::type>
2206 GMainContext* context,
2208 typedef decltype(func()) Ret;
2209 std::unique_ptr<const Callback::CallbackArg<const Ret&>> when_ptr(
2210 Callback::lambda<const Ret&>(std::forward<When>(when))
2212 std::unique_ptr<const Callback::Callback> fail_ptr(
2213 Callback::lambda<>(std::forward<Fail>(fail))
2217 std::move(fail_ptr),
2221 std::forward<Func>(func));
2299 template <
class Ret,
class Func>
2301 GMainContext* context,
2305 std::unique_ptr<const Cgu::Callback::Callback>(),
2309 std::forward<Func>(f));
2398 template <
class When,
class Func,
2399 class =
typename std::enable_if<!std::is_convertible<When, std::unique_ptr<const Callback::CallbackArg<const typename std::result_of<Func()>::type&>>>::value>::type>
2401 GMainContext* context,
2403 typedef decltype(func()) Ret;
2404 std::unique_ptr<const Callback::CallbackArg<const Ret&>> when_ptr(
2405 Callback::lambda<const Ret&>(std::forward<When>(when))
2409 std::unique_ptr<const Cgu::Callback::Callback>(),
2413 std::forward<Func>(func));
2492 template <
class Ret,
class Func>
2494 GMainContext* context,
2498 std::unique_ptr<const Cgu::Callback::Callback>(),
2502 std::forward<Func>(f));
2593 template <
class Func,
class When,
2594 class =
typename std::enable_if<!std::is_convertible<When, std::unique_ptr<const Callback::CallbackArg<const typename std::result_of<Func()>::type&>>>::value>::type>
2596 GMainContext* context,
2598 typedef decltype(func()) Ret;
2599 std::unique_ptr<const Callback::CallbackArg<const Ret&>> when_ptr(
2600 Callback::lambda<const Ret&>(std::forward<When>(when))
2604 std::unique_ptr<const Cgu::Callback::Callback>(),
2608 std::forward<Func>(func));
2656 TaskManager(
unsigned int max = 8,
unsigned int min = 0,
2657 unsigned int idle = 10000,
bool blocking =
true,
2799 #include <c++-gtk-utils/task_manager.tpp>