Health-GPS 3.0.0.0
Global Health Policy Simulation model (Health-GPS)
Loading...
Searching...
No Matches
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#include <oneapi/tbb/parallel_for_each.h>
10
11namespace hgps::core {
12
19template <class F, class... Ts> auto run_async(F &&action, Ts &&...params) {
20 return std::async(std::launch::async, std::forward<F>(action), std::forward<Ts>(params)...);
21};
22
30template <class Index, class UnaryFunction>
31auto parallel_for(Index first, Index last, UnaryFunction func) {
32 auto range = std::vector<size_t>(last - first + 1);
33 std::iota(range.begin(), range.end(), first);
34 tbb::parallel_for_each(range.begin(), range.end(), std::move(func));
35}
36
43template <class T, class UnaryPredicate>
44auto find_index_of_all(const T &data, UnaryPredicate pred) {
45 auto index_mutex = std::mutex{};
46 auto result = std::vector<size_t>{};
47 parallel_for(size_t{0}, data.size() - 1, [&](size_t index) {
48 if (pred(data[index])) {
49 auto lock = std::unique_lock{index_mutex};
50 result.emplace_back(index);
51 }
52 });
53
54 result.shrink_to_fit();
55 return result;
56}
57
58} // namespace hgps::core
Top-level namespace for Health-GPS Core C++ API.
Definition analysis.h:7
auto find_index_of_all(const T &data, UnaryPredicate pred)
Finds index of all occurrences in a container.
Definition thread_util.h:44
auto run_async(F &&action, Ts &&...params)
Run a given function asynchronous.
Definition thread_util.h:19
auto parallel_for(Index first, Index last, UnaryFunction func)
Parallel for each over an indexed accessed containers.
Definition thread_util.h:31
@ result
Simulation result message.