YOrch 1.0.0
Loading...
Searching...
No Matches
validate.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <tuple>
4#include <type_traits>
5
6#include "common.hpp"
7#include "../traits.hpp"
8
9namespace yorch::detail {
10
17
27
34
43
44template <typename F, typename... Specs>
46 using fn_t = std::remove_cvref_t<F>;
47
48 if constexpr (member_bind_callable<fn_t>) {
50 } else if constexpr (!ordinary_bind_callable<fn_t>) {
52 } else if constexpr (sizeof...(Specs) != function_traits<fn_t>::arity) {
54 } else {
55 return bind_error::ok;
56 }
57}
58
59template <typename F, typename... Specs>
60consteval void emit_bind_diagnostic() {
61 constexpr auto error = validate_bind<F, Specs...>();
62 using diagnostic_t = std::tuple<
63 std::type_identity<std::remove_cvref_t<F>>,
64 std::type_identity<std::remove_cvref_t<Specs>>...>;
65
66 if constexpr (error == bind_error::ok) {
67 return;
68 } else if constexpr (error == bind_error::member_callable_not_supported) {
70 "bind(...) does not accept member function pointers; use bind_member(...) instead");
71 } else if constexpr (error == bind_error::callable_shape_invalid) {
73 "bind(...) requires a callable with one non-overloaded concrete signature");
74 } else {
76 "bind(...) requires exactly one spec per function parameter");
77 }
78}
79
80template <typename T, typename F, typename... Specs>
82 using fn_t = std::remove_cvref_t<F>;
83
84 if constexpr (std::is_reference_v<T> || std::is_void_v<T>) {
86 } else if constexpr (member_bind_callable<fn_t>) {
88 } else if constexpr (!bind_callable<fn_t>) {
90 } else if constexpr (function_traits<fn_t>::arity == 0) {
92 } else if constexpr (sizeof...(Specs) + 1 != function_traits<fn_t>::arity) {
94 } else if constexpr (!std::is_same_v<
95 std::remove_cvref_t<last_arg_t<fn_t>>,
98 } else {
100 }
101}
102
103template <typename T, typename F, typename... Specs>
105 constexpr auto error = validate_bind_into<T, F, Specs...>();
106 using diagnostic_t = std::tuple<
107 std::type_identity<T>,
108 std::type_identity<std::remove_cvref_t<F>>,
109 std::type_identity<std::remove_cvref_t<Specs>>...>;
110
111 if constexpr (error == bind_into_error::ok) {
112 return;
113 } else if constexpr (error == bind_into_error::invalid_output_type) {
115 "bind_into<T>(...) requires a non-void owned payload type T");
118 "bind_into(...) does not accept member function pointers; use bind_into_member(...) instead");
119 } else if constexpr (error == bind_into_error::callable_shape_invalid) {
121 "bind_into(...) requires a callable with one non-overloaded concrete signature");
122 } else if constexpr (error == bind_into_error::missing_output_parameter) {
124 "bind_into(...) requires a callable whose last parameter is yorch::direct_out<T>");
125 } else if constexpr (error == bind_into_error::arity_mismatch) {
127 "bind_into(...) requires exactly one spec per non-output function parameter");
128 } else {
130 "bind_into(...) callable must take yorch::direct_out<T> as its last parameter");
131 }
132}
133
134template <typename F, typename ReceiverSpec, typename... Specs>
136 using fn_t = std::remove_cvref_t<F>;
137
138 if constexpr (!member_bind_callable<fn_t>) {
140 } else if constexpr (!ordinary_member_bind_callable<fn_t>) {
142 } else if constexpr (sizeof...(Specs) != member_function_traits<fn_t>::arity) {
144 } else {
146 }
147}
148
149template <typename F, typename ReceiverSpec, typename... Specs>
151 constexpr auto error = validate_bind_member<F, ReceiverSpec, Specs...>();
152 using diagnostic_t = std::tuple<
153 std::type_identity<std::remove_cvref_t<F>>,
154 std::type_identity<std::remove_cvref_t<ReceiverSpec>>,
155 std::type_identity<std::remove_cvref_t<Specs>>...>;
156
157 if constexpr (error == bind_member_error::ok) {
158 return;
159 } else if constexpr (error == bind_member_error::callable_not_member) {
161 "bind_member(...) requires a non-static member function pointer");
164 "bind_member(...) does not accept direct-output member functions; use bind_into_member(...) instead");
165 } else {
167 "bind_member(...) requires one receiver binding plus exactly one spec per member-function parameter");
168 }
169}
170
171template <typename T, typename F, typename ReceiverSpec, typename... Specs>
173 using fn_t = std::remove_cvref_t<F>;
174
175 if constexpr (std::is_reference_v<T> || std::is_void_v<T>) {
177 } else if constexpr (!member_bind_callable<fn_t>) {
179 } else if constexpr (member_function_traits<fn_t>::arity == 0) {
181 } else if constexpr (sizeof...(Specs) + 1 != member_function_traits<fn_t>::arity) {
183 } else if constexpr (!std::is_same_v<
184 std::remove_cvref_t<member_last_arg_t<fn_t>>,
185 direct_out<T>>) {
187 } else {
189 }
190}
191
192template <typename T, typename F, typename ReceiverSpec, typename... Specs>
194 constexpr auto error = validate_bind_into_member<T, F, ReceiverSpec, Specs...>();
195 using diagnostic_t = std::tuple<
196 std::type_identity<T>,
197 std::type_identity<std::remove_cvref_t<F>>,
198 std::type_identity<std::remove_cvref_t<ReceiverSpec>>,
199 std::type_identity<std::remove_cvref_t<Specs>>...>;
200
201 if constexpr (error == bind_into_member_error::ok) {
202 return;
203 } else if constexpr (error == bind_into_member_error::invalid_output_type) {
205 "bind_into_member<T>(...) requires a non-void owned payload type T");
206 } else if constexpr (error == bind_into_member_error::callable_not_member) {
208 "bind_into_member(...) requires a non-static member function pointer");
211 "bind_into_member(...) requires a member function whose last parameter is yorch::direct_out<T>");
212 } else if constexpr (error == bind_into_member_error::arity_mismatch) {
214 "bind_into_member(...) requires one receiver binding plus exactly one spec per non-output member-function parameter");
215 } else {
217 "bind_into_member(...) callable must take yorch::direct_out<T> as its last parameter");
218 }
219}
220
221} // namespace yorch::detail
consteval bind_member_error validate_bind_member()
Definition validate.hpp:135
consteval bind_into_error validate_bind_into()
Definition validate.hpp:81
consteval bind_error validate_bind()
Definition validate.hpp:45
consteval void emit_bind_member_diagnostic()
Definition validate.hpp:150
consteval void emit_bind_into_member_diagnostic()
Definition validate.hpp:193
consteval bind_into_member_error validate_bind_into_member()
Definition validate.hpp:172
consteval void emit_bind_diagnostic()
Definition validate.hpp:60
constexpr bool is_adapter_descriptor_v
Definition adapters.hpp:63
consteval void emit_bind_into_diagnostic()
Definition validate.hpp:104
Extracts the canonical function signature information of a callable.
Definition traits.hpp:23
Output sink passed to direct-output tasks.