LeechCraft 0.6.70-17609-g3dde4097dd
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<typename T, template<typename> typename... Exts>
17 Task<QVector<T>, Exts...> InParallel (QVector<Task<T, Exts...>> tasks)
18 {
19 QVector<T> result;
20 for (auto& task : tasks)
21 result << co_await task;
22 co_return result;
23 }
24
25 namespace detail
26 {
27 template<typename F, typename Input>
29 {
30 using TaskType_t = std::invoke_result_t<F, Input>;
31
32 using OrigResultType_t = typename TaskType_t::ResultType_t;
33 using ResultType_t = TaskType_t::template ReplaceResult_t<QVector<OrigResultType_t>>;
34 };
35 }
36
37 template<typename Input, typename F>
38 auto InParallel (QVector<Input>&& inputs, F&& mkTask) -> detail::ParallelTraits<F, Input>::ResultType_t
39 {
40 QVector<typename detail::ParallelTraits<F, Input>::OrigResultType_t> result;
41 for (auto&& input : inputs)
42 result << co_await mkTask (std::move (input));
43 co_return result;
44 }
45
46 template<typename Input, typename F>
47 auto InParallelSemigroup (QVector<Input>&& inputs, F&& mkTask) -> detail::ParallelTraits<F, Input>::TaskType_t
48 {
50 for (auto&& input : inputs)
51 result += co_await mkTask (std::move (input));
52 co_return result;
53 }
54
55 template<typename... Ts, template<typename> typename... Exts>
56 Task<std::tuple<Ts...>, Exts...> InParallel (Task<Ts, Exts...>... tasks)
57 {
58 co_return std::tuple<Ts...> { co_await tasks... };
59 }
60}
Task< QVector< T >, Exts... > InParallel(QVector< Task< T, Exts... > > tasks)
Definition inparallel.h:17
auto InParallelSemigroup(QVector< Input > &&inputs, F &&mkTask) -> detail::ParallelTraits< F, Input >::TaskType_t
Definition inparallel.h:47
std::invoke_result_t< F, Input > TaskType_t
Definition inparallel.h:30
typename TaskType_t::ResultType_t OrigResultType_t
Definition inparallel.h:32
TaskType_t::template ReplaceResult_t< QVector< OrigResultType_t > > ResultType_t
Definition inparallel.h:33