YOrch 1.0.0
Loading...
Searching...
No Matches
task.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <type_traits>
4#include <utility>
5
6#include "../detail/executor/result.hpp"
7#include "../detail/task_adapters/traits.hpp"
8#include "../slots/direct_out.hpp"
9#include "concepts.hpp" // IWYU pragma: keep
10
11namespace yorch {
12
31template <typename Task, typename Ctx, typename Prev = no_prev>
32 requires executable_task<Task, Ctx, Prev>
33[[nodiscard]] constexpr step_result run_task(Task&& task, exec_context<Ctx, Prev>& ec)
34 noexcept(
35 noexcept(std::forward<Task>(task).invoke_raw(ec)) &&
38 std::forward<Task>(task).invoke_raw(ec)))))
39{
41
43 "Task raw_result_type must match invoke_raw(exec_context<...>&) return type");
44
45 if constexpr (std::is_void_v<raw_result_t>) {
46 std::forward<Task>(task).invoke_raw(ec);
47 return step_result::success();
48 } else {
50 std::forward<Task>(task).invoke_raw(ec)
51 );
52 }
53}
54
71template <typename Task, typename Ctx, typename Prev = no_prev>
72 requires executable_direct_output_task<Task, Ctx, Prev>
73[[nodiscard]] constexpr step_result run_task_into(
74 Task&& task,
77 noexcept(noexcept(std::forward<Task>(task).invoke_into(ec, out)))
78{
79 const auto step = std::forward<Task>(task).invoke_into(ec, out);
80
81 if (step.ok()) {
82 YORCH_ASSERT(out.has_value());
83 } else if (out.has_value()) {
84 out.destroy();
85 }
86
87 return step;
88}
89
90} // namespace yorch
#define YORCH_ASSERT(condition)
Definition assert.hpp:10
typename declared_task_output< Task >::type declared_task_output_t
Definition traits.hpp:41
decltype(std::declval< Task >().invoke_raw(std::declval< exec_context< Ctx, Prev > & >())) raw_task_result_t
Definition traits.hpp:16
constexpr step_result normalize_task_result(R &&r)
Normalizes a raw task return into scheduler-facing step_result.
Definition result.hpp:24
constexpr bool is_adapter_descriptor_v
Definition adapters.hpp:63
constexpr step_result run_task_into(Task &&task, exec_context< Ctx, Prev > &ec, direct_out< detail::declared_task_output_t< Task > > out) noexcept(noexcept(std::forward< Task >(task).invoke_into(ec, out)))
Executes a direct-output task against the provided execution context.
Definition task.hpp:73
constexpr step_result run_task(Task &&task, exec_context< Ctx, Prev > &ec) noexcept(noexcept(std::forward< Task >(task).invoke_raw(ec)) &&(std::is_void_v< detail::raw_task_result_t< Task &&, Ctx, Prev > >||noexcept(detail::normalize_task_result(std::forward< Task >(task).invoke_raw(ec)))))
Executes a ready-to-run task against the provided execution context.
Definition task.hpp:33
constexpr auto task(F &&f)
Definition core.hpp:207
Output sink passed to direct-output tasks.
Lightweight borrowed view used during execution.
Definition context.hpp:187
Represents the basic outcome of a task step.
Definition result.hpp:42
static constexpr step_result success() noexcept
Creates a successful result.
Definition result.hpp:46