LeechCraft  0.6.70-18450-gabe19ee3b0
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<
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 }
constexpr detail::AggregateType< detail::AggregateFunction::Count, Ptr > count
Definition: oral.h:1104
Task< QVector< T >, Exts... > InParallel(Cont< Task< T, Exts... >> tasks)
Definition: inparallel.h:21
STL namespace.
constexpr detail::ExprTree< detail::ExprType::LeafStaticPlaceholder, detail::MemberPtrs< Ptrs... > > tuple
Definition: oral.h:1086
requires(Tup1Size==Tup2Size) const expr auto ZipWith(Tup1 &&tup1
auto NCopies(size_t count, auto taskFactory, std::function< void()> finalizer={}) -> decltype(taskFactory())::template ApplyResult_t< QVector > requires(!std::is_same_v< void, typename decltype(taskFactory())::ResultType_t >)
Definition: inparallel.h:78