11template <
typename... Nodes>
12struct task_tree_builder;
19 template <std::
size_t Level,
typename Task>
25 std::tuple_cat(
static_cast<const Derived&
>(*this).nodes, std::tuple<next_node_t> {next_node_t {std::forward<Task>(task)}})
29 template <std::
size_t Level,
typename Task,
typename FanoutPolicy>
37 std::tuple_cat(
static_cast<const Derived&
>(*this).nodes, std::tuple<next_node_t> {next_node_t {std::forward<Task>(task)}})
41 template <std::
size_t Level,
typename Task>
42 requires (detail::append_level_valid_v<Level, Nodes...>) &&
44 [[nodiscard]]
constexpr auto node_into(Task&& task)
const& {
47 std::tuple_cat(
static_cast<const Derived&
>(*this).nodes, std::tuple<next_node_t> {next_node_t {std::forward<Task>(task)}})
51 template <std::
size_t Level,
typename Task,
typename FanoutPolicy>
52 requires (detail::append_level_valid_v<Level, Nodes...>) &&
56 [[nodiscard]]
constexpr auto node_into(Task&& task, FanoutPolicy&&)
const& {
59 std::tuple_cat(
static_cast<const Derived&
>(*this).nodes, std::tuple<next_node_t> {next_node_t {std::forward<Task>(task)}})
63 template <std::
size_t Level,
typename F>
64 requires (detail::append_level_valid_v<Level, Nodes...>) &&
66 [[nodiscard]]
constexpr auto node(F&& f)
const& {
74 static_cast<const Derived*
>(
this),
81 template <std::
size_t Level,
typename F,
typename FanoutPolicy>
82 requires (detail::append_level_valid_v<Level, Nodes...>) &&
90 std::decay_t<FanoutPolicy>,
93 static_cast<const Derived*
>(
this),
100 template <std::
size_t Level,
typename F,
typename AdapterChain>
101 requires (detail::append_level_valid_v<Level, Nodes...>) &&
104 [[nodiscard]]
constexpr auto node(F&& f, AdapterChain&& adapter_specs)
const& {
110 std::decay_t<AdapterChain>
112 static_cast<const Derived*
>(
this),
115 std::forward<AdapterChain>(adapter_specs)
119 template <std::
size_t Level,
typename F,
typename FanoutPolicy,
typename AdapterChain>
120 requires (detail::append_level_valid_v<Level, Nodes...>) &&
124 [[nodiscard]]
constexpr auto node(F&& f, FanoutPolicy&&
fanout_policy, AdapterChain&& adapter_specs)
const& {
129 std::decay_t<FanoutPolicy>,
130 std::decay_t<AdapterChain>
132 static_cast<const Derived*
>(
this),
135 std::forward<AdapterChain>(adapter_specs)
138 template <std::
size_t Level,
typename F>
139 requires (detail::append_level_valid_v<Level, Nodes...>) &&
149 static_cast<const Derived*
>(
this),
156 template <std::
size_t Level,
typename F,
typename FanoutPolicy>
157 requires (detail::append_level_valid_v<Level, Nodes...>) &&
165 std::decay_t<FanoutPolicy>,
168 static_cast<const Derived*
>(
this),
175 template <std::
size_t Level,
typename F,
typename AdapterChain>
176 requires (detail::append_level_valid_v<Level, Nodes...>) &&
179 [[nodiscard]]
constexpr auto node_into(F&& f, AdapterChain&& adapter_specs)
const& {
185 std::decay_t<AdapterChain>
187 static_cast<const Derived*
>(
this),
190 std::forward<AdapterChain>(adapter_specs)
194 template <std::
size_t Level,
typename F,
typename FanoutPolicy,
typename AdapterChain>
195 requires (detail::append_level_valid_v<Level, Nodes...>) &&
204 std::decay_t<FanoutPolicy>,
205 std::decay_t<AdapterChain>
207 static_cast<const Derived*
>(
this),
210 std::forward<AdapterChain>(adapter_specs)
213 template <std::
size_t Level,
typename Task>
214 requires (detail::append_level_valid_v<Level, Nodes...>) &&
216 [[nodiscard]]
constexpr auto node(Task&& task) && {
219 std::tuple_cat(std::move(
static_cast<Derived&
>(*this).nodes), std::tuple<next_node_t> {next_node_t {std::forward<Task>(task)}})
223 template <std::
size_t Level,
typename Task,
typename FanoutPolicy>
224 requires (detail::append_level_valid_v<Level, Nodes...>) &&
228 [[nodiscard]]
constexpr auto node(Task&& task, FanoutPolicy&&) && {
231 std::tuple_cat(std::move(
static_cast<Derived&
>(*this).nodes), std::tuple<next_node_t> {next_node_t {std::forward<Task>(task)}})
235 template <std::
size_t Level,
typename Task>
236 requires (detail::append_level_valid_v<Level, Nodes...>) &&
238 [[nodiscard]]
constexpr auto node_into(Task&& task) && {
241 std::tuple_cat(std::move(
static_cast<Derived&
>(*this).nodes), std::tuple<next_node_t> {next_node_t {std::forward<Task>(task)}})
245 template <std::
size_t Level,
typename Task,
typename FanoutPolicy>
246 requires (detail::append_level_valid_v<Level, Nodes...>) &&
250 [[nodiscard]]
constexpr auto node_into(Task&& task, FanoutPolicy&&) && {
253 std::tuple_cat(std::move(
static_cast<Derived&
>(*this).nodes), std::tuple<next_node_t> {next_node_t {std::forward<Task>(task)}})
257 template <std::
size_t Level,
typename F>
258 requires (detail::append_level_valid_v<Level, Nodes...>) &&
260 [[nodiscard]]
constexpr auto node(F&& f) && {
268 static_cast<Derived&&
>(*this),
275 template <std::
size_t Level,
typename F,
typename FanoutPolicy>
276 requires (detail::append_level_valid_v<Level, Nodes...>) &&
284 std::decay_t<FanoutPolicy>,
287 static_cast<Derived&&
>(*this),
294 template <std::
size_t Level,
typename F,
typename AdapterChain>
295 requires (detail::append_level_valid_v<Level, Nodes...>) &&
298 [[nodiscard]]
constexpr auto node(F&& f, AdapterChain&& adapter_specs) && {
304 std::decay_t<AdapterChain>
306 static_cast<Derived&&
>(*this),
309 std::forward<AdapterChain>(adapter_specs)
313 template <std::
size_t Level,
typename F,
typename FanoutPolicy,
typename AdapterChain>
314 requires (detail::append_level_valid_v<Level, Nodes...>) &&
318 [[nodiscard]]
constexpr auto node(F&& f, FanoutPolicy&&
fanout_policy, AdapterChain&& adapter_specs) && {
323 std::decay_t<FanoutPolicy>,
324 std::decay_t<AdapterChain>
326 static_cast<Derived&&
>(*this),
329 std::forward<AdapterChain>(adapter_specs)
332 template <std::
size_t Level,
typename F>
333 requires (detail::append_level_valid_v<Level, Nodes...>) &&
343 static_cast<Derived&&
>(*this),
350 template <std::
size_t Level,
typename F,
typename FanoutPolicy>
351 requires (detail::append_level_valid_v<Level, Nodes...>) &&
359 std::decay_t<FanoutPolicy>,
362 static_cast<Derived&&
>(*this),
369 template <std::
size_t Level,
typename F,
typename AdapterChain>
370 requires (detail::append_level_valid_v<Level, Nodes...>) &&
373 [[nodiscard]]
constexpr auto node_into(F&& f, AdapterChain&& adapter_specs) && {
379 std::decay_t<AdapterChain>
381 static_cast<Derived&&
>(*this),
384 std::forward<AdapterChain>(adapter_specs)
388 template <std::
size_t Level,
typename F,
typename FanoutPolicy,
typename AdapterChain>
389 requires (detail::append_level_valid_v<Level, Nodes...>) &&
398 std::decay_t<FanoutPolicy>,
399 std::decay_t<AdapterChain>
401 static_cast<Derived&&
>(*this),
404 std::forward<AdapterChain>(adapter_specs)
constexpr bool append_level_valid_v
constexpr bool is_adapter_descriptor_v
constexpr auto task(F &&f)
constexpr auto node(F &&f, AdapterChain &&adapter_specs) const &
constexpr auto node_into(F &&f) &&
constexpr auto node(Task &&task) const &
constexpr auto node(Task &&task) &&
constexpr auto node(F &&f, FanoutPolicy &&fanout_policy) const &
constexpr auto node_into(F &&f, FanoutPolicy &&fanout_policy, AdapterChain &&adapter_specs) const &
constexpr auto node_into(F &&f, FanoutPolicy &&fanout_policy, AdapterChain &&adapter_specs) &&
constexpr auto node_into(F &&f, AdapterChain &&adapter_specs) &&
constexpr auto node_into(Task &&task) &&
constexpr auto node(F &&f, FanoutPolicy &&fanout_policy, AdapterChain &&adapter_specs) const &
constexpr auto node(F &&f, AdapterChain &&adapter_specs) &&
constexpr auto node_into(F &&f) const &
constexpr auto node_into(F &&f, AdapterChain &&adapter_specs) const &
constexpr auto node_into(F &&f, FanoutPolicy &&fanout_policy) &&
constexpr auto node_into(Task &&task, FanoutPolicy &&) const &
constexpr auto node(F &&f) const &
constexpr auto node_into(Task &&task) const &
constexpr auto node_into(F &&f, FanoutPolicy &&fanout_policy) const &
constexpr auto node(Task &&task, FanoutPolicy &&) const &
constexpr auto node(F &&f) &&
constexpr auto node(F &&f, FanoutPolicy &&fanout_policy) &&
constexpr auto node(Task &&task, FanoutPolicy &&) &&
constexpr auto node(F &&f, FanoutPolicy &&fanout_policy, AdapterChain &&adapter_specs) &&
constexpr auto node_into(Task &&task, FanoutPolicy &&) &&