YOrch 1.0.0
Loading...
Searching...
No Matches
metadata.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cstddef>
4#include <type_traits>
5
6#include "../../task_tree/policies.hpp"
7
8namespace yorch::detail {
9
10template <typename... Nodes>
11struct last_node;
12
13template <typename Node>
14struct last_node<Node> {
15 using type = Node;
16};
17
18template <typename Node, typename... Rest>
19struct last_node<Node, Rest...> : last_node<Rest...> {};
20
21template <typename... Nodes>
22using last_node_t = typename last_node<Nodes...>::type;
23
24template <typename... Nodes>
25struct max_level;
26
27template <>
28struct max_level<> : std::integral_constant<std::size_t, 0> {};
29
30template <typename Node>
31struct max_level<Node> : std::integral_constant<std::size_t, Node::level> {};
32
33template <typename Node, typename Next, typename... Rest>
34struct max_level<Node, Next, Rest...>
35 : std::integral_constant<
36 std::size_t,
37 (Node::level > max_level<Next, Rest...>::value
38 ? Node::level
39 : max_level<Next, Rest...>::value)> {};
40
41template <typename... Nodes>
42inline constexpr std::size_t max_level_v = max_level<Nodes...>::value;
43
44template <std::size_t Level, typename... Nodes>
45inline constexpr bool append_level_valid_v = [] {
46 if constexpr (sizeof...(Nodes) == 0) {
47 return Level == 0;
48 } else {
49 constexpr auto prev_level = last_node_t<Nodes...>::level;
50 return Level != 0 && Level <= prev_level + 1;
51 }
52}();
53
54template <std::size_t Level, typename Task, typename FanoutPolicy = yorch::fanout_auto_policy>
56 static constexpr std::size_t level = Level;
57 using task_type = Task;
59
61};
62
63template <std::size_t Level, typename Task, typename FanoutPolicy = yorch::fanout_auto_policy>
65 task_tree_node<Level, std::decay_t<Task>, std::remove_cvref_t<FanoutPolicy>>;
66
67} // namespace yorch::detail
constexpr std::size_t max_level_v
Definition metadata.hpp:42
constexpr bool append_level_valid_v
Definition metadata.hpp:45
typename last_node< Nodes... >::type last_node_t
Definition metadata.hpp:22
constexpr bool is_adapter_descriptor_v
Definition adapters.hpp:63
constexpr auto value(T &&v) -> value_t< std::remove_cvref_t< T > >
Wraps a value as an owning spec.
Definition specs.hpp:179
static constexpr std::size_t level
Definition metadata.hpp:56