LeechCraft
0.6.70-18450-gabe19ee3b0
Modular cross-platform feature rich live environment.
Toggle main menu visibility
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
14
namespace
LC::Util
15
{
16
template
<
17
typename
T,
18
template
<
typename
>
typename
... Exts,
19
template
<
typename
...>
typename
Cont = std::initializer_list
20
>
21
Task<QVector<T>
, Exts...>
InParallel
(Cont<
Task<T, Exts...>
> tasks)
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
}
LC::Util::Task
Definition
task.h:155
LC::Util
Definition
icoreproxy.h:34
LC::Util::NCopies
auto NCopies(size_t count, auto taskFactory, std::function< void()> finalizer={}) -> decltype(taskFactory())::template ApplyResult_t< QVector >
Definition
inparallel.h:78
LC::Util::InParallel
Task< QVector< T >, Exts... > InParallel(Cont< Task< T, Exts... > > tasks)
Definition
inparallel.h:21
task.h
src
util
threads
coro
inparallel.h
Generated by
1.17.0