LeechCraft 0.6.70-18450-gabe19ee3b0
Modular cross-platform feature rich live environment.
Loading...
Searching...
No Matches
inparallel.h
Go to the documentation of this file.
1/**********************************************************************
2 * LeechCraft - modular cross-platform feature rich internet client.
3 * Copyright (C) 2006-2014 Georg Rudoy
4 *
5 * Distributed under the Boost Software License, Version 1.0.
6 * (See accompanying file LICENSE or copy at https://www.boost.org/LICENSE_1_0.txt)
7 **********************************************************************/
8
9#pragma once
10
11#include <QVector>
12#include "task.h"
13
14namespace LC::Util
15{
16 template<
17 typename T,
18 template<typename> typename... Exts,
19 template<typename...> typename Cont = std::initializer_list
20 >
22 {
23 QVector<T> result;
24 for (auto& task : tasks)
25 result << co_await task;
26 co_return result;
27 }
28
29 template<
30 template<typename> typename... Exts,
31 template<typename...> typename Cont = std::initializer_list
32 >
33 Task<void, Exts...> InParallel (Cont<Task<void, Exts...>> tasks)
34 {
35 for (auto& task : tasks)
36 co_await task;
37 }
38
39 template<
40 typename Inputs,
41 typename F,
42 typename... MkTaskArgs,
43 typename Task = std::invoke_result_t<F&,
44 std::add_rvalue_reference_t<typename std::decay_t<Inputs>::value_type>,
45 MkTaskArgs&&...
46 >,
47 bool IsVoid = std::is_same_v<typename Task::ResultType_t, void>
48 >
49 auto InParallel (Inputs inputs, F mkTask, MkTaskArgs&&... mkTaskArgs) ->
50 std::conditional_t<
51 IsVoid,
52 typename Task::template ReplaceResult_t<void>,
53 typename Task::template ApplyResult_t<QVector>
54 >
55 {
56 QVector<Task> tasks;
57 for (auto&& input : inputs)
58 tasks << std::invoke (mkTask, std::move (input), std::forward<MkTaskArgs> (mkTaskArgs)...);
59
60 if constexpr (IsVoid)
61 for (const auto& task : tasks)
62 co_await task;
63 else
64 {
65 QVector<typename Task::ResultType_t> result;
66 for (const auto& task : tasks)
67 result << co_await task;
68 co_return result;
69 }
70 }
71
72 template<typename... Ts, template<typename> typename... Exts>
73 Task<std::tuple<Ts...>, Exts...> InParallel (Task<Ts, Exts...>... tasks)
74 {
75 co_return std::tuple<Ts...> { co_await tasks... };
76 }
77
78 auto NCopies (size_t count, auto taskFactory, std::function<void ()> finalizer = {})
79 -> decltype (taskFactory ())::template ApplyResult_t<QVector>
80 requires (!std::is_same_v<void, typename decltype (taskFactory ())::ResultType_t>)
81 {
82 using Task_t = decltype (taskFactory ());
83
84 QVector<Task_t> tasks;
85 std::generate_n (std::back_inserter (tasks), count, taskFactory);
86
87 QVector<typename Task_t::ResultType_t> results;
88 for (auto& task : tasks)
89 results << co_await task;
90 if (finalizer)
91 finalizer ();
92 co_return results;
93 }
94
95 auto NCopies (size_t count, auto taskFactory, std::function<void ()> finalizer = {})
96 -> decltype (taskFactory ())::template ReplaceResult_t<void>
97 requires (std::is_same_v<void, typename decltype (taskFactory ())::ResultType_t>)
98 {
99 using Task_t = decltype (taskFactory ());
100
101 QVector<Task_t> tasks;
102 std::generate_n (std::back_inserter (tasks), count, taskFactory);
103 for (auto& task : tasks)
104 co_await task;
105
106 if (finalizer)
107 finalizer ();
108 }
109}
auto NCopies(size_t count, auto taskFactory, std::function< void()> finalizer={}) -> decltype(taskFactory())::template ApplyResult_t< QVector >
Definition inparallel.h:78
Task< QVector< T >, Exts... > InParallel(Cont< Task< T, Exts... > > tasks)
Definition inparallel.h:21