Health-GPS  1.2.2.0
Global Health Policy Simulation model (Health-GPS)
thread_util.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <execution>
4 #include <future>
5 #include <mutex>
6 #include <numeric>
7 #include <thread>
8 
9 namespace hgps::core {
10 
12 inline constexpr auto execution_policy = std::execution::par;
13 
20 template <class F, class... Ts> auto run_async(F &&action, Ts &&...params) {
21  return std::async(std::launch::async, std::forward<F>(action), std::forward<Ts>(params)...);
22 };
23 
33 template <class Policy, class Index, class UnaryFunction>
34 auto parallel_for(Policy &&policy, Index first, Index last, UnaryFunction func) {
35  auto range = std::vector<size_t>(last - first + 1);
36  std::iota(range.begin(), range.end(), first);
37  std::for_each(policy, range.begin(), range.end(), std::move(func));
38 }
39 
48 template <class Policy, class T, class UnaryPredicate>
49 auto find_index_of_all(Policy &&policy, const T &data, UnaryPredicate pred) {
50  auto index_mutex = std::mutex{};
51  auto result = std::vector<size_t>{};
52  parallel_for(policy, size_t{0}, data.size() - 1, [&](size_t index) {
53  if (pred(data[index])) {
54  auto lock = std::unique_lock{index_mutex};
55  result.emplace_back(index);
56  }
57  });
58 
59  result.shrink_to_fit();
60  return result;
61 }
62 } // namespace hgps::core
Top-level namespace for Health-GPS Core C++ API.
Definition: analysis.h:7
auto run_async(F &&action, Ts &&...params)
Run a given function asynchronous.
Definition: thread_util.h:20
auto find_index_of_all(Policy &&policy, const T &data, UnaryPredicate pred)
Finds index of all occurrences in a container.
Definition: thread_util.h:49
constexpr auto execution_policy
Default execution policy.
Definition: thread_util.h:12
auto parallel_for(Policy &&policy, Index first, Index last, UnaryFunction func)
Parallel for each over an indexed accessed containers.
Definition: thread_util.h:34
@ result
Simulation result message.