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;
705 add_task(std::unique_ptr<const Callback::Callback>(task),
706 std::unique_ptr<const Callback::Callback>());
770 void add_task(std::unique_ptr<const Callback::Callback> task,
771 std::unique_ptr<const Callback::Callback> fail);
829 template <
class Task,
830 class =
typename std::enable_if<!std::is_convertible<typename std::remove_reference<Task>::type,
833 add_task(std::unique_ptr<const Callback::Callback>(Callback::lambda<>(std::forward<Task>(task))),
834 std::unique_ptr<const Callback::Callback>());
912 template <
class Task,
class Fail,
913 class =
typename std::enable_if<!std::is_convertible<Task, std::unique_ptr<const Callback::Callback>>::value
914 && !std::is_convertible<Fail, std::unique_ptr<const Callback::Callback>>::value>::type>
916 std::unique_ptr<const Callback::Callback> task_cb(
917 Callback::lambda<>(std::forward<Task>(task))
919 std::unique_ptr<const Callback::Callback> fail_cb(
920 Callback::lambda<>(std::forward<Fail>(fail))
922 add_task(std::move(task_cb), std::move(fail_cb));
995 template <
class Ret,
class... Params,
class... Args,
class T>
997 Ret (T::*func)(Params...),
1130 template <
class Ret,
class... Params,
class... Args,
class T>
1133 std::unique_ptr<const Cgu::Callback::Callback> fail,
1136 GMainContext* context,
1138 Ret (T::*func)(Params...),
1218 template <
class Ret,
class... Params,
class... Args,
class T>
1220 GMainContext* context,
1222 Ret (T::*func)(Params...),
1224 static_assert(
sizeof...(Args) < 4,
1225 "No greater than three bound arguments can be passed to "
1226 "TaskManager::make_task_when() taking a member function.");
1230 std::unique_ptr<const Cgu::Callback::Callback>(),
1236 std::forward<Args>(args)...);
1291 template <
class Ret,
class... Params,
class... Args,
class T>
1293 Ret (T::*func)(Params...)
const,
1426 template <
class Ret,
class... Params,
class... Args,
class T>
1429 std::unique_ptr<const Cgu::Callback::Callback> fail,
1432 GMainContext* context,
1434 Ret (T::*func)(Params...)
const,
1514 template <
class Ret,
class... Params,
class... Args,
class T>
1516 GMainContext* context,
1518 Ret (T::*func)(Params...)
const,
1520 static_assert(
sizeof...(Args) < 4,
1521 "No greater than three bound arguments can be passed to "
1522 "TaskManager::make_task_when() taking a member function.");
1526 std::unique_ptr<const Cgu::Callback::Callback>(),
1532 std::forward<Args>(args)...);
1584 template <
class Ret,
class... Params,
class... Args>
1715 template <
class Ret,
class... Params,
class... Args>
1718 std::unique_ptr<const Cgu::Callback::Callback> fail,
1721 GMainContext* context,
1722 Ret (*func)(Params...),
1799 template <
class Ret,
class... Params,
class... Args>
1801 GMainContext* context,
1802 Ret (*func)(Params...),
1804 static_assert(
sizeof...(Args) < 5,
1805 "No greater than four bound arguments can be passed to "
1806 "TaskManager::make_task_when() taking a function.");
1810 std::unique_ptr<const Cgu::Callback::Callback>(),
1815 std::forward<Args>(args)...);
1883 template <
class Ret,
class Func>
1889 #ifndef DOXYGEN_PARSING
1890 template <
class Func>
1909 typedef typename std::remove_const<typename std::remove_reference<Func>::type>::type FType;
1910 typedef decltype(f()) Ret;
1914 CbPtr exec_cb(
new TaskManagerHelper::FunctorResultExec<Ret, FType>(std::forward<Func>(f), ret));
1915 CbPtr do_fail_cb(
Callback::make_ref(&TaskManagerHelper::FunctorResultWrapper<Ret, FType>::do_fail,
1917 add_task(std::move(exec_cb), std::move(do_fail_cb));
2051 template <
class Ret,
class Func>
2054 std::unique_ptr<const Cgu::Callback::Callback> fail,
2057 GMainContext* context,
2197 template <
class When,
class Fail,
class Func,
2198 class =
typename std::enable_if<!std::is_convertible<When, std::unique_ptr<const Callback::CallbackArg<const typename std::result_of<Func()>::type&>>>::value
2199 && !std::is_convertible<Fail, std::unique_ptr<const Callback::Callback>>::value>::type>
2205 GMainContext* context,
2207 typedef decltype(func()) Ret;
2208 std::unique_ptr<const Callback::CallbackArg<const Ret&>> when_ptr(
2209 Callback::lambda<const Ret&>(std::forward<When>(when))
2211 std::unique_ptr<const Callback::Callback> fail_ptr(
2212 Callback::lambda<>(std::forward<Fail>(fail))
2216 std::move(fail_ptr),
2220 std::forward<Func>(func));
2298 template <
class Ret,
class Func>
2300 GMainContext* context,
2304 std::unique_ptr<const Cgu::Callback::Callback>(),
2308 std::forward<Func>(f));
2397 template <
class When,
class Func,
2398 class =
typename std::enable_if<!std::is_convertible<When, std::unique_ptr<const Callback::CallbackArg<const typename std::result_of<Func()>::type&>>>::value>::type>
2400 GMainContext* context,
2402 typedef decltype(func()) Ret;
2403 std::unique_ptr<const Callback::CallbackArg<const Ret&>> when_ptr(
2404 Callback::lambda<const Ret&>(std::forward<When>(when))
2408 std::unique_ptr<const Cgu::Callback::Callback>(),
2412 std::forward<Func>(func));
2491 template <
class Ret,
class Func>
2493 GMainContext* context,
2497 std::unique_ptr<const Cgu::Callback::Callback>(),
2501 std::forward<Func>(f));
2592 template <
class Func,
class When,
2593 class =
typename std::enable_if<!std::is_convertible<When, std::unique_ptr<const Callback::CallbackArg<const typename std::result_of<Func()>::type&>>>::value>::type>
2595 GMainContext* context,
2597 typedef decltype(func()) Ret;
2598 std::unique_ptr<const Callback::CallbackArg<const Ret&>> when_ptr(
2599 Callback::lambda<const Ret&>(std::forward<When>(when))
2603 std::unique_ptr<const Cgu::Callback::Callback>(),
2607 std::forward<Func>(func));
2655 TaskManager(
unsigned int max = 8,
unsigned int min = 0,
2656 unsigned int idle = 10000,
bool blocking =
true,
2798 #include <c++-gtk-utils/task_manager.tpp>