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";}
324 namespace TaskManagerHelper {
326 template <
class Ret,
class FType>
352 template <
class Ret,
class FType>
354 mutable FType functor;
360 template <
class FunctorArg>
374 typedef std::pair<std::unique_ptr<const Callback::Callback>,
375 std::unique_ptr<const Callback::Callback>> QueueItemType;
384 void set_max_threads_impl(
unsigned int max);
703 add_task(std::unique_ptr<const Callback::Callback>(task),
704 std::unique_ptr<const Callback::Callback>());
768 void add_task(std::unique_ptr<const Callback::Callback> task,
769 std::unique_ptr<const Callback::Callback> fail);
827 template <
class Task,
828 class =
typename std::enable_if<!std::is_convertible<typename std::remove_reference<Task>::type,
831 add_task(std::unique_ptr<const Callback::Callback>(Callback::lambda<>(std::forward<Task>(task))),
832 std::unique_ptr<const Callback::Callback>());
910 template <
class Task,
class Fail,
911 class =
typename std::enable_if<!std::is_convertible<Task, std::unique_ptr<const Callback::Callback>>::value
912 && !std::is_convertible<Fail, std::unique_ptr<const Callback::Callback>>::value>::type>
914 std::unique_ptr<const Callback::Callback> task_cb(
915 Callback::lambda<>(std::forward<Task>(task))
917 std::unique_ptr<const Callback::Callback> fail_cb(
918 Callback::lambda<>(std::forward<Fail>(fail))
920 add_task(std::move(task_cb), std::move(fail_cb));
993 template <
class Ret,
class... Params,
class... Args,
class T>
995 Ret (T::*func)(Params...),
1128 template <
class Ret,
class... Params,
class... Args,
class T>
1131 std::unique_ptr<const Cgu::Callback::Callback> fail,
1134 GMainContext* context,
1136 Ret (T::*func)(Params...),
1216 template <
class Ret,
class... Params,
class... Args,
class T>
1218 GMainContext* context,
1220 Ret (T::*func)(Params...),
1222 static_assert(
sizeof...(Args) < 4,
1223 "No greater than three bound arguments can be passed to "
1224 "TaskManager::make_task_when() taking a member function.");
1228 std::unique_ptr<const Cgu::Callback::Callback>(),
1234 std::forward<Args>(args)...);
1289 template <
class Ret,
class... Params,
class... Args,
class T>
1291 Ret (T::*func)(Params...)
const,
1424 template <
class Ret,
class... Params,
class... Args,
class T>
1427 std::unique_ptr<const Cgu::Callback::Callback> fail,
1430 GMainContext* context,
1432 Ret (T::*func)(Params...)
const,
1512 template <
class Ret,
class... Params,
class... Args,
class T>
1514 GMainContext* context,
1516 Ret (T::*func)(Params...)
const,
1518 static_assert(
sizeof...(Args) < 4,
1519 "No greater than three bound arguments can be passed to "
1520 "TaskManager::make_task_when() taking a member function.");
1524 std::unique_ptr<const Cgu::Callback::Callback>(),
1530 std::forward<Args>(args)...);
1582 template <
class Ret,
class... Params,
class... Args>
1713 template <
class Ret,
class... Params,
class... Args>
1716 std::unique_ptr<const Cgu::Callback::Callback> fail,
1719 GMainContext* context,
1720 Ret (*func)(Params...),
1797 template <
class Ret,
class... Params,
class... Args>
1799 GMainContext* context,
1800 Ret (*func)(Params...),
1802 static_assert(
sizeof...(Args) < 5,
1803 "No greater than four bound arguments can be passed to "
1804 "TaskManager::make_task_when() taking a function.");
1808 std::unique_ptr<const Cgu::Callback::Callback>(),
1813 std::forward<Args>(args)...);
1881 template <
class Ret,
class Func>
1887 #ifndef DOXYGEN_PARSING
1888 template <
class Func>
1907 typedef typename std::remove_const<typename std::remove_reference<Func>::type>::type FType;
1908 typedef decltype(f()) Ret;
1912 CbPtr exec_cb(
new TaskManagerHelper::FunctorResultExec<Ret, FType>(std::forward<Func>(f), ret));
1913 CbPtr do_fail_cb(
Callback::make_ref(&TaskManagerHelper::FunctorResultWrapper<Ret, FType>::do_fail,
1915 add_task(std::move(exec_cb), std::move(do_fail_cb));
2049 template <
class Ret,
class Func>
2052 std::unique_ptr<const Cgu::Callback::Callback> fail,
2055 GMainContext* context,
2195 template <
class When,
class Fail,
class Func,
2196 class =
typename std::enable_if<!std::is_convertible<When, std::unique_ptr<const Callback::CallbackArg<const typename std::result_of<Func()>::type&>>>::value
2197 && !std::is_convertible<Fail, std::unique_ptr<const Callback::Callback>>::value>::type>
2203 GMainContext* context,
2205 typedef decltype(func()) Ret;
2206 std::unique_ptr<const Callback::CallbackArg<const Ret&>> when_ptr(
2207 Callback::lambda<const Ret&>(std::forward<When>(when))
2209 std::unique_ptr<const Callback::Callback> fail_ptr(
2210 Callback::lambda<>(std::forward<Fail>(fail))
2214 std::move(fail_ptr),
2218 std::forward<Func>(func));
2296 template <
class Ret,
class Func>
2298 GMainContext* context,
2302 std::unique_ptr<const Cgu::Callback::Callback>(),
2306 std::forward<Func>(f));
2395 template <
class When,
class Func,
2396 class =
typename std::enable_if<!std::is_convertible<When, std::unique_ptr<const Callback::CallbackArg<const typename std::result_of<Func()>::type&>>>::value>::type>
2398 GMainContext* context,
2400 typedef decltype(func()) Ret;
2401 std::unique_ptr<const Callback::CallbackArg<const Ret&>> when_ptr(
2402 Callback::lambda<const Ret&>(std::forward<When>(when))
2406 std::unique_ptr<const Cgu::Callback::Callback>(),
2410 std::forward<Func>(func));
2489 template <
class Ret,
class Func>
2491 GMainContext* context,
2495 std::unique_ptr<const Cgu::Callback::Callback>(),
2499 std::forward<Func>(f));
2590 template <
class Func,
class When,
2591 class =
typename std::enable_if<!std::is_convertible<When, std::unique_ptr<const Callback::CallbackArg<const typename std::result_of<Func()>::type&>>>::value>::type>
2593 GMainContext* context,
2595 typedef decltype(func()) Ret;
2596 std::unique_ptr<const Callback::CallbackArg<const Ret&>> when_ptr(
2597 Callback::lambda<const Ret&>(std::forward<When>(when))
2601 std::unique_ptr<const Cgu::Callback::Callback>(),
2605 std::forward<Func>(func));
2653 TaskManager(
unsigned int max = 8,
unsigned int min = 0,
2654 unsigned int idle = 10000,
bool blocking =
true,
2796 #include <c++-gtk-utils/task_manager.tpp>