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";}
248 namespace TaskManagerHelper {
250 template <
class Ret,
class FType>
276 template <
class Ret,
class FType>
278 mutable FType functor;
284 template <
class FunctorArg>
297 typedef std::pair<std::unique_ptr<const Callback::Callback>,
298 std::unique_ptr<const Callback::Callback>> QueueItemType;
307 void set_max_threads_impl(
unsigned int max);
610 add_task(std::unique_ptr<const Callback::Callback>(task),
611 std::unique_ptr<const Callback::Callback>());
670 void add_task(std::unique_ptr<const Callback::Callback> task,
671 std::unique_ptr<const Callback::Callback> fail);
724 template <
class Task,
725 class =
typename std::enable_if<!std::is_convertible<typename std::remove_reference<Task>::type,
728 add_task(std::unique_ptr<const Callback::Callback>(Callback::lambda<>(std::forward<Task>(task))),
729 std::unique_ptr<const Callback::Callback>());
800 template <
class Task,
class Fail,
801 class =
typename std::enable_if<!std::is_convertible<Task, std::unique_ptr<const Callback::Callback>>::value
802 && !std::is_convertible<Fail, std::unique_ptr<const Callback::Callback>>::value>::type>
804 add_task(std::unique_ptr<const Callback::Callback>(Callback::lambda<>(std::forward<Task>(task))),
805 std::unique_ptr<const Callback::Callback>(Callback::lambda<>(std::forward<Fail>(fail))));
876 template <
class Ret,
class... Params,
class... Args,
class T>
878 Ret (T::*func)(Params...),
1003 template <
class Ret,
class... Params,
class... Args,
class T>
1006 std::unique_ptr<const Cgu::Callback::Callback> fail,
1009 GMainContext* context,
1011 Ret (T::*func)(Params...),
1083 template <
class Ret,
class... Params,
class... Args,
class T>
1085 GMainContext* context,
1087 Ret (T::*func)(Params...),
1089 static_assert(
sizeof...(Args) < 4,
1090 "No greater than three bound arguments can be passed to "
1091 "TaskManager::make_task_when() taking a member function.");
1095 std::unique_ptr<const Cgu::Callback::Callback>(),
1101 std::forward<Args>(args)...);
1154 template <
class Ret,
class... Params,
class... Args,
class T>
1156 Ret (T::*func)(Params...)
const,
1281 template <
class Ret,
class... Params,
class... Args,
class T>
1284 std::unique_ptr<const Cgu::Callback::Callback> fail,
1287 GMainContext* context,
1289 Ret (T::*func)(Params...)
const,
1361 template <
class Ret,
class... Params,
class... Args,
class T>
1363 GMainContext* context,
1365 Ret (T::*func)(Params...)
const,
1367 static_assert(
sizeof...(Args) < 4,
1368 "No greater than three bound arguments can be passed to "
1369 "TaskManager::make_task_when() taking a member function.");
1373 std::unique_ptr<const Cgu::Callback::Callback>(),
1379 std::forward<Args>(args)...);
1429 template <
class Ret,
class... Params,
class... Args>
1552 template <
class Ret,
class... Params,
class... Args>
1555 std::unique_ptr<const Cgu::Callback::Callback> fail,
1558 GMainContext* context,
1559 Ret (*func)(Params...),
1628 template <
class Ret,
class... Params,
class... Args>
1630 GMainContext* context,
1631 Ret (*func)(Params...),
1633 static_assert(
sizeof...(Args) < 5,
1634 "No greater than four bound arguments can be passed to "
1635 "TaskManager::make_task_when() taking a function.");
1639 std::unique_ptr<const Cgu::Callback::Callback>(),
1644 std::forward<Args>(args)...);
1710 template <
class Ret,
class Func>
1716 #ifndef DOXYGEN_PARSING
1717 template <
class Func>
1736 typedef typename std::remove_const<typename std::remove_reference<Func>::type>::type FType;
1737 typedef decltype(f()) Ret;
1741 CbPtr exec_cb(
new TaskManagerHelper::FunctorResultExec<Ret, FType>(std::forward<Func>(f), ret));
1742 CbPtr do_fail_cb(
Callback::make_ref(&TaskManagerHelper::FunctorResultWrapper<Ret, FType>::do_fail,
1744 add_task(std::move(exec_cb), std::move(do_fail_cb));
1869 template <
class Ret,
class Func>
1872 std::unique_ptr<const Cgu::Callback::Callback> fail,
1875 GMainContext* context,
2007 template <
class When,
class Fail,
class Func,
2008 class =
typename std::enable_if<!std::is_convertible<When, std::unique_ptr<const Callback::CallbackArg<const typename std::result_of<Func()>::type&>>>::value
2009 && !std::is_convertible<Fail, std::unique_ptr<const Callback::Callback>>::value>::type>
2015 GMainContext* context,
2017 typedef decltype(func()) Ret;
2018 std::unique_ptr<const Callback::CallbackArg<const Ret&>> when_ptr(
2019 Callback::lambda<const Ret&>(std::forward<When>(when))
2021 std::unique_ptr<const Callback::Callback> fail_ptr(
2022 Callback::lambda<>(std::forward<Fail>(fail))
2026 std::move(fail_ptr),
2030 std::forward<Func>(func));
2099 template <
class Ret,
class Func>
2101 GMainContext* context,
2105 std::unique_ptr<const Cgu::Callback::Callback>(),
2109 std::forward<Func>(f));
2190 template <
class When,
class Func,
2191 class =
typename std::enable_if<!std::is_convertible<When, std::unique_ptr<const Callback::CallbackArg<const typename std::result_of<Func()>::type&>>>::value>::type>
2193 GMainContext* context,
2195 typedef decltype(func()) Ret;
2196 std::unique_ptr<const Callback::CallbackArg<const Ret&>> when_ptr(
2197 Callback::lambda<const Ret&>(std::forward<When>(when))
2201 std::unique_ptr<const Cgu::Callback::Callback>(),
2205 std::forward<Func>(func));
2275 template <
class Ret,
class Func>
2277 GMainContext* context,
2281 std::unique_ptr<const Cgu::Callback::Callback>(),
2285 std::forward<Func>(f));
2368 template <
class Func,
class When,
2369 class =
typename std::enable_if<!std::is_convertible<When, std::unique_ptr<const Callback::CallbackArg<const typename std::result_of<Func()>::type&>>>::value>::type>
2371 GMainContext* context,
2373 typedef decltype(func()) Ret;
2374 std::unique_ptr<const Callback::CallbackArg<const Ret&>> when_ptr(
2375 Callback::lambda<const Ret&>(std::forward<When>(when))
2379 std::unique_ptr<const Cgu::Callback::Callback>(),
2383 std::forward<Func>(func));
2431 TaskManager(
unsigned int max = 8,
unsigned int min = 0,
2432 unsigned int idle = 10000,
bool blocking =
true,
2494 #include <c++-gtk-utils/task_manager.tpp>