YOrch 1.0.0
Loading...
Searching...
No Matches
prev_access_plan_validation.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <concepts> // IWYU pragma: keep
4#include <cstddef>
5#include <type_traits>
6#include <utility>
7
9
10namespace yorch::detail {
11
16template <typename Plan, std::size_t I>
18 requires {
19 { Plan::no_parent } -> std::convertible_to<std::size_t>;
20 { Plan::template parent_index<I> } -> std::convertible_to<std::size_t>;
21 { Plan::template child_count<I> } -> std::convertible_to<std::size_t>;
22 typename Plan::template task_type<I>;
23 };
24
29template <typename Plan, std::size_t I>
31[[nodiscard]] consteval bool node_prev_source_valid() {
32 using task_t = typename Plan::template task_type<I>;
33
34 // if the task uses the forward-prev-output protocol, check will be deferred to the forward-prev-source validation step, so we can allow prev access here regardless of parentage
36 return true;
37 }
38
39 if constexpr (Plan::template parent_index<I> == Plan::no_parent) {
41 } else {
42 constexpr auto parent = Plan::template parent_index<I>;
43
44 if constexpr (std::is_void_v<typename Plan::template output_type<parent>>) {
46 } else {
47 return true;
48 }
49 }
50}
51
57template <typename Plan, std::size_t I>
59[[nodiscard]] consteval bool node_prev_access_valid() {
60 using task_t = typename Plan::template task_type<I>;
61
63}
64
65template <typename Plan, std::size_t I>
68 using task_t = typename Plan::template task_type<I>;
69
71 return true;
72 } else if constexpr (Plan::template parent_index<I> == Plan::no_parent) {
73 return false;
74 } else {
75 constexpr auto parent = Plan::template parent_index<I>;
76 return !std::is_void_v<typename Plan::template output_type<parent>>;
77 }
78}
79
80template <typename Plan, std::size_t... I>
82[[nodiscard]] consteval bool plan_prev_source_valid_impl(std::index_sequence<I...>) {
83 return (node_prev_source_valid<Plan, I>() && ...);
84}
85
86template <typename Plan, std::size_t... I>
88[[nodiscard]] consteval bool plan_prev_access_valid_impl(std::index_sequence<I...>) {
89 return (node_prev_access_valid<Plan, I>() && ...);
90}
91
92template <typename Plan, std::size_t... I>
94[[nodiscard]] consteval bool plan_forward_prev_source_valid_impl(std::index_sequence<I...>) {
96}
97
98template <typename Plan>
99inline constexpr bool plan_prev_source_valid_v =
100 plan_prev_source_valid_impl<Plan>(std::make_index_sequence<Plan::node_count> {});
101
102template <typename Plan>
103inline constexpr bool plan_prev_access_valid_v =
104 plan_prev_access_valid_impl<Plan>(std::make_index_sequence<Plan::node_count> {});
105
106template <typename Plan>
107inline constexpr bool plan_forward_prev_source_valid_v =
108 plan_forward_prev_source_valid_impl<Plan>(std::make_index_sequence<Plan::node_count> {});
109
110} // namespace yorch::detail
Minimal static-plan protocol required by the prev-access validation path for a specific node index.
consteval bool plan_prev_access_valid_impl(std::index_sequence< I... >)
consteval bool node_prev_source_valid()
Checks whether node I is structurally allowed to use direct-parent access at all.
constexpr bool plan_prev_source_valid_v
consteval bool plan_forward_prev_source_valid_impl(std::index_sequence< I... >)
constexpr bool plan_forward_prev_source_valid_v
consteval bool plan_prev_source_valid_impl(std::index_sequence< I... >)
consteval bool node_prev_access_valid()
Checks whether node I's declared prev-access mode is locally valid.
constexpr bool plan_prev_access_valid_v
consteval bool node_forward_prev_source_valid()
constexpr bool is_adapter_descriptor_v
Definition adapters.hpp:63