31#ifndef DW_FRAMEWORK_PASSDESCRIPTOR_HPP_
32#define DW_FRAMEWORK_PASSDESCRIPTOR_HPP_
34#include <dw/core/base/Types.h>
35#include <dw/core/container/StringView.hpp>
54template <
typename... Args>
57 return std::make_tuple(std::forward<const Args>(args)...);
75constexpr std::tuple<dw::core::StringView, dwProcessorType>
describePass(
76 dw::core::StringView
const&& name, dwProcessorType processorType)
78 return std::make_tuple(
80 std::move(processorType));
91template <
typename DependenciesT>
93 dw::core::StringView
const&& name, dwProcessorType processorType, DependenciesT dependencies) -> std::tuple<dw::core::StringView, dwProcessorType, DependenciesT>
95 return std::make_tuple(
97 std::move(processorType),
98 std::move(dependencies));
106template <
typename... Args>
109 return {std::forward<const Args>(args)...};
113template <
typename Node>
120template <
typename Node>
123 return std::tuple_size<decltype(describePasses<Node>())>::value;
129template <
typename Node>
132 return passID < passSize<Node>();
140 typename Node,
size_t Index,
141 typename std::enable_if_t<Index == passSize<Node>(),
void>* =
nullptr>
142constexpr std::size_t
passIndex(dw::core::StringView identifier)
150 typename Node,
size_t Index,
151 typename std::enable_if_t<Index<passSize<Node>(),
void>* =
nullptr>
154 constexpr std::size_t
passIndex(dw::core::StringView identifier)
156 constexpr auto name = std::get<dw::framework::PASS_NAME>(std::get<Index>(describePasses<Node>()));
157 if (name == identifier)
161 return 1 + passIndex<Node, Index + 1>(identifier);
169template <
typename Node>
170constexpr size_t passIndex(dw::core::StringView identifier)
172 return detail::passIndex<Node, 0>(identifier);
176template <
typename Node>
179 constexpr size_t index = passIndex<Node>(identifier);
180 return isValidPass<Node>(index);
184template <
typename Node,
size_t Index>
187 return std::get<dw::framework::PASS_NAME>(std::get<Index>(describePasses<Node>()));
191template <
typename Node,
size_t Index>
194 return std::get<dw::framework::PASS_PROCESSOR_TYPE>(std::get<Index>(describePasses<Node>()));
198template <
typename Node,
size_t Index>
201 constexpr auto pass = std::get<Index>(describePasses<Node>());
207 typename Node,
size_t Index,
208 typename std::enable_if_t<hasPassDependencies<Node, Index>(),
void>* =
nullptr>
211 return std::get<PASS_DEPENDENCIES>(std::get<Index>(describePasses<Node>()));
216 typename Node,
size_t Index,
217 typename std::enable_if_t<!hasPassDependencies<Node, Index>(),
void>* =
nullptr>
222 return std::array<dw::core::StringView, 0>();
constexpr std::size_t passSize()
Get the number of passes of the passed node.
constexpr dwProcessorType passProcessorType()
Get the processor type of a pass.
static constexpr size_t PASS_NAME
constexpr bool isValidPass(std::size_t passID)
Check if pass index is valid.
constexpr auto passDependencies()
Get the dependencies of a pass.
constexpr dw::core::StringView passName()
Get the name of a pass.
constexpr size_t passIndex(dw::core::StringView identifier)
Get the the pass index for a pass identified by name.
constexpr std::tuple< dw::core::StringView, dwProcessorType > describePass(dw::core::StringView const &&name, dwProcessorType processorType)
constexpr auto describePasses()
Get described passes for the passed node.
constexpr bool hasPassDependencies()
Check if a pass specifies explicit dependencies.
static constexpr size_t PASS_PROCESSOR_TYPE
constexpr auto describePassCollection(const Args &&... args)
constexpr auto describePassDependencies(const Args &&... args) -> std::array< dw::core::StringView, sizeof...(Args)>
static constexpr size_t PASS_DEPENDENCIES