LeechCraft  0.6.70-16373-g319c272718
Modular cross-platform feature rich live environment.
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<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 }
std::invoke_result_t< F, Input > TaskType_t
Definition: inparallel.h:30
auto InParallelSemigroup(QVector< Input > &&inputs, F &&mkTask) -> detail::ParallelTraits< F, Input >::TaskType_t
Definition: inparallel.h:47
Task< QVector< T >, Exts... > InParallel(QVector< Task< T, Exts... >> tasks)
Definition: inparallel.h:17
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