9#include "../../slots/policies.hpp"
23template <
typename Plan, std::size_t...
I>
25 return std::array<
bool,
sizeof...(I)> {
38template <
typename Plan, std::size_t...
I>
45template <
typename Plan>
49template <
typename Plan>
53template <
typename Plan>
55 std::size_t
count = 0;
71template <
typename Plan>
73 std::array<std::size_t, Plan::node_count> indices {};
77 for (std::size_t node = 0; node < Plan::node_count; ++node) {
79 indices[node] =
next++;
89template <
typename Plan>
122template <
typename Plan>
127 for (std::size_t node = 0; node < Plan::node_count; ++node) {
128 const auto parent = Plan::parent_indices[node];
131 layout.payload_depths[node] =
135 layout.physical_slot_indices[node] =
layout.payload_depths[node] - 1;
136 if (
layout.payload_depths[node] >
layout.physical_slot_count) {
137 layout.physical_slot_count =
layout.payload_depths[node];
193 const std::array<std::size_t, Plan::node_count>& indices,
194 std::index_sequence<I...>) {
195 std::array<std::size_t, PhysicalSlotCount>
sizes {};
197 if constexpr (!std::is_void_v<typename Plan::template output_type<I>>) {
198 const auto slot = indices[
I];
224 const std::array<std::size_t, Plan::node_count>& indices,
225 std::index_sequence<I...>) {
226 std::array<std::size_t, PhysicalSlotCount>
alignments {};
228 if constexpr (!std::is_void_v<typename Plan::template output_type<I>>) {
229 const auto slot = indices[
I];
257 const std::array<std::size_t, Plan::node_count>& indices,
258 std::index_sequence<I...>) {
259 std::array<slot_physical_policy, PhysicalSlotCount>
policies {};
270template <
typename Plan,
typename LayoutPolicy>
273template <
typename Plan>
275 static constexpr auto physical_slot_indices =
278 static constexpr auto physical_slot_sizes =
280 physical_slot_indices,
281 std::make_index_sequence<Plan::node_count> {});
282 static constexpr auto physical_slot_alignments =
284 physical_slot_indices,
285 std::make_index_sequence<Plan::node_count> {});
286 static constexpr auto physical_slot_policies =
288 physical_slot_indices,
289 std::make_index_sequence<Plan::node_count> {});
291 template <std::
size_t I>
292 static constexpr std::size_t physical_slot_index = physical_slot_indices[
I];
294 template <std::
size_t K>
298template <
typename Plan>
300 static constexpr auto compact_layout =
302 static constexpr auto physical_slot_indices = compact_layout.physical_slot_indices;
303 static constexpr auto payload_depths = compact_layout.payload_depths;
304 static constexpr std::size_t physical_slot_count = compact_layout.physical_slot_count;
305 static constexpr auto physical_slot_sizes =
307 physical_slot_indices,
308 std::make_index_sequence<Plan::node_count> {});
309 static constexpr auto physical_slot_alignments =
311 physical_slot_indices,
312 std::make_index_sequence<Plan::node_count> {});
313 static constexpr auto physical_slot_policies =
315 physical_slot_indices,
316 std::make_index_sequence<Plan::node_count> {});
318 template <std::
size_t I>
319 static constexpr std::size_t physical_slot_index = physical_slot_indices[
I];
321 template <std::
size_t K>
332template <
typename Layout, std::size_t...
K>
335 Layout::physical_slot_sizes[
K],
336 Layout::physical_slot_alignments[
K],
342template <
typename Layout>
345 std::make_index_sequence<Layout::physical_slot_count> {}));
360template <
typename Plan, std::
size_t PhysicalSlot>
363 for (std::size_t node = 0; node < Plan::node_count; ++node) {
380template <
typename Plan, std::size_t...
K>
389template <
typename Plan>
397template <
typename Plan, std::
size_t I>
True when node I owns physical storage for its output.
constexpr std::size_t no_physical_slot
Sentinel physical slot index meaning "this node has no storage".
constexpr auto payload_node_array_v
consteval auto make_serial_dfs_compact_slot_layout()
Builds the serial-DFS compact node -> physical slot layout.
decltype(make_erased_slots_tuple< Layout >(std::make_index_sequence< Layout::physical_slot_count > {})) plan_erased_slots_tuple_t
Erased backend storage tuple for compact/layout-driven plan slots.
consteval auto make_one_to_one_physical_slot_indices()
Builds the one-to-one node -> physical slot index table.
consteval std::size_t one_to_one_physical_slot_owner_node()
Finds the unique node that owns a one-to-one physical slot.
auto make_erased_slots_tuple(std::index_sequence< K... >) -> std::tuple< erased_slot< Layout::physical_slot_sizes[K], Layout::physical_slot_alignments[K], Layout::template physical_slot_policy< K > >... >
Type factory for a layout's erased-slot storage tuple.
constexpr std::size_t payload_node_count_v
consteval auto make_payload_node_array(std::index_sequence< I... >)
Builds the compile-time node -> has-payload table for a plan.
consteval auto make_physical_slot_alignments(const std::array< std::size_t, Plan::node_count > &indices, std::index_sequence< I... >)
Computes the required alignment for each physical slot.
consteval auto make_physical_slot_policies(const std::array< std::size_t, Plan::node_count > &indices, std::index_sequence< I... >)
Computes the storage policy for each physical slot.
decltype(make_typed_slots_tuple< Plan >(std::make_index_sequence< payload_node_count_v< Plan > > {})) plan_typed_slots_tuple_t
Typed backend storage tuple for one-to-one owned payload slots.
constexpr slot_physical_policy join_slot_physical_policy(slot_physical_policy left, slot_logical_policy right) noexcept
Joins one node's logical policy into a physical slot policy.
constexpr auto slot_logical_policy_array_v
slot_physical_policy
Storage-level policy for a physical slot after layout selection.
consteval auto make_physical_slot_sizes(const std::array< std::size_t, Plan::node_count > &indices, std::index_sequence< I... >)
Computes the required raw storage size for each physical slot.
slot_logical_policy
Node-local slot semantics inferred from a task's result protocol.
auto make_typed_slots_tuple(std::index_sequence< K... >) -> std::tuple< typed_slot< typename Plan::template output_type< one_to_one_physical_slot_owner_node< Plan, K >()>, Plan::template slot_logical_policy_for< one_to_one_physical_slot_owner_node< Plan, K >()> >... >
Type factory for a plan's typed one-to-one slot tuple.
consteval auto make_slot_logical_policy_array(std::index_sequence< I... >)
Builds the compile-time node -> logical slot policy table.
constexpr bool is_adapter_descriptor_v
Intermediate index data for the serial-DFS compact slot layout.
std::size_t physical_slot_count
std::array< std::size_t, Plan::node_count > physical_slot_indices
std::array< std::size_t, Plan::node_count > payload_depths