61template<
typename F,
typename... Args>
79template<
typename F,
typename... Args>
81 std::is_void_v<std::invoke_result_t<F, Args...>>;
95template<
typename F,
typename R,
typename... Args>
97 std::convertible_to<std::invoke_result_t<F, Args...>, R>;
114template<
typename F,
typename... Args>
116 std::is_nothrow_invocable_v<F, Args...>;
136template<
typename F,
typename... Args>
138 std::convertible_to<std::invoke_result_t<F, Args...>,
bool>;
154template<
typename F,
typename Arg>
172template<
typename F,
typename Arg1,
typename Arg2>
195 { t.get_name() } -> std::convertible_to<std::string>;
196 { t.get_priority() } -> std::convertible_to<int>;
217concept ExecutorLike =
requires(T t, std::unique_ptr<interfaces::IJob> job,
bool wait) {
218 { t.worker_count() } -> std::convertible_to<size_t>;
219 { t.is_running() } -> std::convertible_to<bool>;
220 { t.pending_tasks() } -> std::convertible_to<size_t>;
221 { t.shutdown(wait) } -> std::same_as<void>;
239template<
typename F,
typename T>
241 std::convertible_to<std::invoke_result_t<F>, std::unique_ptr<T>>;
255template<
typename F,
typename R>
257 std::same_as<std::invoke_result_t<F>, R>;
276 std::move_constructible<std::decay_t<F>>;