8#include "../../context.hpp"
9#include "../../detail/maybe_storage.hpp"
10#include "../../task_tree/policies.hpp"
15template <
typename Task>
22template <
typename Task>
26template <
typename Plan, std::
size_t I>
29 { Plan::no_parent } -> std::convertible_to<std::size_t>;
31 { Plan::template
child_count<I> } -> std::convertible_to<std::size_t>;
37template <
typename Plan, std::
size_t Child>
42template <
typename Plan, std::
size_t Child>
47template <
typename Plan, std::size_t
Parent, std::size_t...
Ord>
49 return (std::size_t {0} + ... +
56template <
typename Plan, std::size_t
Parent, std::size_t...
Ord>
58 return (std::size_t {0} + ... +
66template <
typename Plan, std::size_t
Parent, std::size_t...
Ord>
68 std::index_sequence<Ord...>) {
69 return (std::size_t {0} + ... +
77template <
typename Plan, std::size_t
Parent, std::size_t...
Ord>
89template <
typename Plan, std::
size_t Parent>
96 }
else if constexpr (std::is_same_v<policy_t, yorch::fanout_auto_policy>) {
103 }
else if constexpr (std::is_same_v<policy_t, yorch::fanout_shared_readonly_policy>) {
107 static_assert(std::is_same_v<policy_t, yorch::fanout_consume_with_copies_policy>,
108 "Unsupported fanout policy");
117template <
typename Plan, std::size_t...
I>
123template <
typename Plan>
127template <
typename Plan, std::
size_t Parent>
130 std::is_same_v<typename Plan::template fanout_policy_type<Parent>,
137template <
typename Plan, std::
size_t Parent>
142template <
typename Plan, std::
size_t Child>
161template <
typename Plan, std::
size_t Parent,
typename =
void>
166template <
typename Plan, std::
size_t Parent>
170 std::
enable_if_t<parent_has_staged_copy_children_v<Plan, Parent>>> {
174template <
typename Plan, std::size_t...
I>
176 -> std::tuple<typename fanout_stage_slot<Plan, I>::type...>;
178template <
typename Plan>
182template <
typename Plan>
184 template <std::
size_t Parent>
191 std::is_constructible_v<parent_output_t, const parent_output_t&>,
192 "fanout_consume_with_copies_policy requires the parent output type "
193 "to be constructible from const T& for copy_prev children");
199 template <std::
size_t Parent>
206 template <std::
size_t Parent>
209 "staged_prev_view_for_parent<I>() requires a parent with staged copy children");
213 template <std::
size_t Parent>
216 "staged_prev_view_for_parent<I>() requires a parent with staged copy children");
221 template <std::
size_t Parent>
222 [[
nodiscard]]
constexpr auto& stage_slot() &
noexcept {
223 return std::get<Parent>(staging_);
226 template <std::
size_t Parent>
228 return std::get<Parent>(staging_);
constexpr bool node_uses_staged_copy_prev_v
consteval bool parent_has_non_copy_or_consume_prev_child_impl(std::index_sequence< Ord... >)
consteval std::size_t parent_consume_only_prev_child_count_impl(std::index_sequence< Ord... >)
constexpr bool node_uses_consume_only_prev_access_v
constexpr bool node_uses_copy_only_prev_access_v
constexpr bool parent_requires_fanout_staging_v
consteval bool parent_fanout_policy_valid()
constexpr bool task_uses_prev_access_v
constexpr bool parent_has_staged_copy_children_v
consteval std::size_t parent_copy_only_prev_child_count_impl(std::index_sequence< Ord... >)
constexpr bool plan_fanout_policy_valid_v
constexpr bool task_uses_consume_only_prev_access_v
constexpr bool task_uses_copy_only_prev_access_v
constexpr bool task_uses_exclusive_prev_access_v
consteval std::size_t parent_exclusive_prev_child_count_impl(std::index_sequence< Ord... >)
constexpr bool is_adapter_descriptor_v
consteval bool plan_fanout_policy_valid_impl(std::index_sequence< I... >)
decltype(make_plan_fanout_stage_tuple< Plan >(std::make_index_sequence< Plan::node_count > {})) plan_fanout_stage_tuple_t
consteval auto make_plan_fanout_stage_tuple(std::index_sequence< I... >) -> std::tuple< typename fanout_stage_slot< Plan, I >::type... >
constexpr auto prev_slot(T &value) noexcept -> prev_slot_view< T >
Creates a borrowed view over a direct parent payload object.
static constexpr bool has_value() noexcept
constexpr void destroy() noexcept
Manual-lifetime storage for an optional in-place T.
constexpr void destroy_fanout_staging() noexcept
constexpr void prepare_fanout_staging(auto &slots)
constexpr auto staged_prev_view_for_parent() &
constexpr auto staged_prev_view_for_parent() const &
Mixed fanout policy that allows one consumer plus any number of copies.