YOrch 1.0.0
Loading...
Searching...
No Matches
member_receiver.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <functional>
4#include <type_traits>
5#include <utility>
6
7#include "../../resolve.hpp"
8#include "traits.hpp"
9
10namespace yorch::detail {
11
12template <typename T>
14 std::reference_wrapper<T> ref;
15};
16
17template <typename T>
21
22template <typename T>
26
27template <typename T>
28constexpr decltype(auto) forward_member_receiver(const borrowed_member_receiver<T>& holder) noexcept {
29 return holder.ref.get();
30}
31
32template <typename T>
33constexpr decltype(auto) forward_member_receiver(copied_member_receiver<T>& holder) noexcept {
34 return (holder.value);
35}
36
45template <typename T>
46constexpr decltype(auto) forward_member_receiver
47// NOLINTNEXTLINE(cppcoreguidelines-rvalue-reference-param-not-moved)
49 return (holder.value);
50}
51
52template <typename T>
53constexpr decltype(auto) forward_member_receiver(consumed_member_receiver<T>& holder) noexcept {
54 return std::move(holder.value);
55}
56
57template <typename T>
58constexpr decltype(auto) forward_member_receiver(consumed_member_receiver<T>&& holder) noexcept {
59 return std::move(holder.value);
60}
61
62template <typename F, typename Receiver, typename... Args>
63constexpr decltype(auto) invoke_member_with_receiver(F&& func, Receiver&& receiver, Args&&... args)
64 noexcept(noexcept(std::invoke(
65 std::forward<F>(func),
66 forward_member_receiver(std::forward<Receiver>(receiver)),
67 std::forward<Args>(args)...))) {
68 return std::invoke(
69 std::forward<F>(func),
70 forward_member_receiver(std::forward<Receiver>(receiver)),
71 std::forward<Args>(args)...);
72}
73
74template <typename F, typename T, typename Ctx, typename Prev>
76 noexcept(noexcept(resolve_as<member_class_t<F>>(spec, ec))) {
78
79 static_assert(std::is_same_v<typename copy_prev_t<T>::type, class_t>,
80 "copy_prev<T>() receiver must match the member-function class type exactly");
81
84 };
85}
86
87template <typename F, typename T, typename Ctx, typename Prev>
89 noexcept(noexcept(resolve_as<member_class_t<F>>(spec, ec))) {
91
92 static_assert(std::is_same_v<typename consume_prev_t<T>::type, class_t>,
93 "consume_prev<T>() receiver must match the member-function class type exactly");
94
97 };
98}
99
100template <typename F, typename Spec, typename Ctx, typename Prev>
102 noexcept(noexcept(resolve_as<member_receiver_arg_t<F>>(spec, ec))) {
105
107
109 std::reference_wrapper<borrowed_t> {receiver}
110 };
111}
112
113template <typename Self, typename T>
114[[nodiscard]] constexpr decltype(auto) forward_member(T& value) noexcept {
115 if constexpr (std::is_lvalue_reference_v<Self&&>) {
116 return (value);
117 } else {
118 return std::move(value);
119 }
120}
121
122} // namespace yorch::detail
constexpr decltype(auto) forward_member_receiver(const borrowed_member_receiver< T > &holder) noexcept
constexpr decltype(auto) forward_member(T &value) noexcept
constexpr auto resolve_member_receiver(copy_prev_t< T > spec, exec_context< Ctx, Prev > &ec) noexcept(noexcept(resolve_as< member_class_t< F > >(spec, ec)))
typename member_function_traits< std::remove_cvref_t< F > >::receiver_arg_type member_receiver_arg_t
Definition traits.hpp:133
std::remove_reference_t< member_receiver_arg_t< F > > member_borrowed_receiver_t
Definition traits.hpp:137
typename member_function_traits< std::remove_cvref_t< F > >::class_type member_class_t
Definition traits.hpp:129
constexpr bool is_adapter_descriptor_v
Definition adapters.hpp:63
constexpr decltype(auto) invoke_member_with_receiver(F &&func, Receiver &&receiver, Args &&... args) noexcept(noexcept(std::invoke(std::forward< F >(func), forward_member_receiver(std::forward< Receiver >(receiver)), std::forward< Args >(args)...)))
constexpr auto value(T &&v) -> value_t< std::remove_cvref_t< T > >
Wraps a value as an owning spec.
Definition specs.hpp:179
Describes a parameter that consumes the direct parent output.
Definition specs.hpp:69
Describes a parameter that copies the direct parent output as T.
Definition specs.hpp:56
Lightweight borrowed view used during execution.
Definition context.hpp:187