Github   Telegram
Loading...
Searching...
No Matches
get_all.hpp
Go to the documentation of this file.
1#pragma once
2
5
6#include <type_traits>
7#include <vector>
8
11
12USERVER_NAMESPACE_BEGIN
13
14namespace engine {
15
41template <typename... Tasks>
42auto GetAll(Tasks&... tasks);
43
44namespace impl {
45
46template <typename Container>
47auto GetAllResultsFromContainer(Container& tasks) {
48 using Result = decltype(std::begin(tasks)->Get());
49
50 if constexpr (std::is_void_v<Result>) {
51 for (auto& task : tasks) {
52 task.Get();
53 }
54 return;
55 } else {
56 std::vector<Result> results;
57 results.reserve(std::size(tasks));
58 for (auto& task : tasks) {
59 results.push_back(task.Get());
60 }
61 return results;
62 }
63}
64
65template <typename... Tasks>
66auto GetAllResultsFromTasks(Tasks&... tasks) {
67 using Result = decltype((void(), ..., tasks.Get()));
68
69 if constexpr (std::is_void_v<Result>) {
70 static_assert((true && ... && std::is_void_v<decltype(tasks.Get())>));
71 (tasks.Get(), ...);
72 return;
73 } else {
74 std::vector<Result> results;
75 results.reserve(sizeof...(tasks));
76 (results.push_back(tasks.Get()), ...);
77 return results;
78 }
79}
80
81} // namespace impl
82
83template <typename... Tasks>
84auto GetAll(Tasks&... tasks) {
85 engine::WaitAllChecked(tasks...);
86 if constexpr (meta::impl::IsSingleRange<Tasks...>()) {
87 return impl::GetAllResultsFromContainer(tasks...);
88 } else {
89 return impl::GetAllResultsFromTasks(tasks...);
90 }
91}
92
93} // namespace engine
94
95USERVER_NAMESPACE_END