IceShard 1
A personal game engine project, with development focused on 2D/2.5D games.
Loading...
Searching...
No Matches
task_utils.inl
Go to the documentation of this file.
1
3
4
5namespace ice
6{
7
8 namespace detail
9 {
10
11 template<typename T>
12 auto output_result_task(ice::Task<T> task, T& out_result) noexcept -> ice::Task<>
13 {
14 out_result = co_await ice::move(task);
15 }
16
17 template<typename T>
19 {
20 out_result = co_await ice::move(task);
21 }
22
23 } // namespace detail
24
25 inline auto resume_on(ice::TaskScheduler& scheduler) noexcept
26 {
27 return scheduler.operator co_await();
28 }
29
30 inline auto await_tasks(ice::Span<ice::Task<>> tasks) noexcept -> ice::Task<>
31 {
32 for (ice::Task<>& task : tasks)
33 {
34 co_await task;
35 }
36 }
37
38 template<typename T>
39 inline auto await_on(ice::Task<T> task, ice::TaskScheduler& resumer) noexcept -> ice::Task<T>
40 {
41 T result;
42 co_await ice::await_on(ice::detail::output_result_task(ice::move(task), result), resumer);
43 co_return result;
44 }
45
46 template<typename T>
47 inline auto await_scheduled(ice::Task<T> task, ice::TaskScheduler& scheduler) noexcept -> ice::Task<T>
48 {
49 T result;
50 co_await ice::await_scheduled(ice::detail::output_result_task(ice::move(task), result), scheduler);
51 co_return result;
52 }
53
54 template<typename T>
55 inline auto await_scheduled_on(ice::Task<> task, ice::TaskScheduler& scheduler, ice::TaskScheduler& resumer) noexcept -> ice::Task<T>
56 {
57 T result;
58 co_await ice::await_scheduled_on(ice::detail::output_result_task(ice::move(task), result), scheduler, resumer);
59 co_return result;
60 }
61
62 template<typename T>
63 inline auto wait_for_result(ice::Task<T> task) noexcept -> T
64 {
65 T result{};
66 ice::wait_for(ice::detail::output_result_task(ice::move(task), result));
67 return result;
68 }
69
70 template<typename T>
71 inline void wait_for_result(ice::Task<T> task, T& out_result) noexcept
72 {
73 ice::wait_for(ice::detail::output_result_task(ice::move(task), out_result));
74 }
75
76 template<typename T>
77 inline void wait_for_result(ice::Span<ice::Task<T>> tasks, ice::Span<T> out_results) noexcept
78 {
79 ICE_ASSERT_CORE(ice::count(tasks) == ice::count(out_results));
80
81 // Reset barrier to number of tasks
83 barrier.reset(ice::count(tasks));
84
85 for (ice::u32 idx = 0; idx < ice::count(tasks); ++idx)
86 {
87 // Wait for each started task manually. So we can await completion after the loop
89 barrier,
90 ice::detail::output_result_task(ice::move(tasks[idx]), out_results[idx])
91 );
92 }
93
94 // Await tasks to finish
95 barrier.wait();
96 }
97
98 template<typename T>
99 inline void wait_for_result_scheduled(ice::Task<T> task, ice::TaskScheduler& scheduler, T& out_result) noexcept
100 {
101 ice::wait_for_scheduled(ice::detail::output_result_task(ice::move(task), out_result), scheduler);
102 }
103
104 template<typename T>
105 inline void wait_for_result_scheduled(ice::Span<ice::Task<T>> tasks, ice::TaskScheduler& scheduler, ice::Span<T> out_results) noexcept
106 {
107 ICE_ASSERT_CORE(ice::count(tasks) == ice::count(out_results));
108
109 // Reset barrier to number of tasks
110 ice::ManualResetBarrier barrier{};
111 barrier.reset(ice::count(tasks));
112
113 for (ice::u32 idx = 0; idx < ice::count(tasks); ++idx)
114 {
115 // Wait for each started task manually. So we can await completion after the loop
117 barrier,
118 ice::detail::output_result_task(ice::move(tasks[idx]), out_results[idx]),
119 scheduler
120 );
121 }
122
123 // Await tasks to finish
124 barrier.wait();
125 }
126
127 template<typename T>
129 {
130 ice::Expected<T> result;
131 ice::wait_for(ice::detail::output_result_task(ice::move(task), result));
132 return result;
133 }
134
135} // namespace ice
136
#define ICE_ASSERT_CORE(expression)
Definition assert_core.hxx:43
Definition expected.hxx:16
Definition sync_manual_events.hxx:32
void wait() noexcept
void reset(ice::u8 num_awaited) noexcept
Definition task.hxx:12
Definition task_scheduler.hxx:13
Definition hashmap_details.hxx:13
auto output_result_task(ice::Task< T > task, T &out_result) noexcept -> ice::Task<>
Definition task_utils.inl:12
SPDX-License-Identifier: MIT.
Definition array.hxx:12
auto resume_on(ice::TaskScheduler &scheduler) noexcept
Definition task_utils.inl:25
auto wait_for_expected(ice::TaskExpected< T > task) noexcept -> ice::Expected< T >
Definition task_utils.inl:128
void manual_wait_for(ice::ManualResetEvent &evnt, ice::Task<> task) noexcept
void wait_for_result_scheduled(ice::Task< T > task, ice::TaskScheduler &scheduler, T &out_result) noexcept
Definition task_utils.inl:99
auto await_tasks(ice::Span< ice::Task<> > tasks) noexcept -> ice::Task<>
Definition task_utils.inl:30
auto await_scheduled_on(ice::Task<> task, ice::TaskScheduler &scheduler, ice::TaskScheduler &resumer) noexcept -> ice::Task< T >
Definition task_utils.inl:55
constexpr auto count(T const (&)[Size]) noexcept -> ice::u32
Definition base.hxx:43
void wait_for(ice::Task<> task) noexcept
std::uint32_t u32
Definition types.hxx:26
auto wait_for_result(ice::Task< T > task) noexcept -> T
Definition task_utils.inl:63
void wait_for_scheduled(ice::Task<> task, ice::TaskScheduler &scheduler) noexcept
void manual_wait_for_scheduled(ice::ManualResetEvent &evnt, ice::Task<> task, ice::TaskScheduler &scheduler) noexcept
auto await_on(ice::Task< T > task, ice::TaskScheduler &resumer) noexcept -> ice::Task< T >
Definition task_utils.inl:39
auto await_scheduled(ice::Task< T > task, ice::TaskScheduler &scheduler) noexcept -> ice::Task< T >
Definition task_utils.inl:47
A view into an array of objects laid out in contiguous memory.
Definition span.hxx:17
Definition task_expected.hxx:12