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> 40 #include <type_traits> 54 template <
typename... Args>
57 return std::make_tuple(std::forward<const Args>(args)...);
75 constexpr std::tuple<dw::core::StringView, dwProcessorType>
describePass(
76 dw::core::StringView
const&& name, dwProcessorType processorType)
78 return std::make_tuple(
82 std::move(processorType));
91 template <
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));
106 template <
typename... Args>
109 return {std::forward<const Args>(args)...};
113 template <
typename Node>
120 template <
typename Node>
123 return std::tuple_size<decltype(describePasses<Node>())>::value;
127 template <
typename Node>
130 return passID < passSize<Node>();
138 typename Node,
size_t Index,
139 typename std::enable_if_t<Index == passSize<Node>(),
void>* =
nullptr>
140 constexpr std::size_t
passIndex(dw::core::StringView identifier)
148 typename Node,
size_t Index,
149 typename std::enable_if_t<Index<passSize<Node>(),
void>* =
nullptr> constexpr std::size_t
passIndex(dw::core::StringView identifier)
151 constexpr
auto name = std::get<dw::framework::PASS_NAME>(std::get<Index>(describePasses<Node>()));
152 if (name == identifier)
156 return 1 + passIndex<Node, Index + 1>(identifier);
162 template <
typename Node>
163 constexpr
size_t passIndex(dw::core::StringView identifier)
165 return detail::passIndex<Node, 0>(identifier);
169 template <
typename Node>
172 constexpr
size_t index = passIndex<Node>(identifier);
173 return isValidPass<Node>(index);
177 template <
typename Node,
size_t Index>
180 return std::get<dw::framework::PASS_NAME>(std::get<Index>(describePasses<Node>()));
184 template <
typename Node,
size_t Index>
187 return std::get<dw::framework::PASS_PROCESSOR_TYPE>(std::get<Index>(describePasses<Node>()));
191 template <
typename Node,
size_t Index>
194 constexpr
auto pass = std::get<Index>(describePasses<Node>());
200 typename Node,
size_t Index,
201 typename std::enable_if_t<hasPassDependencies<Node, Index>(),
void>* =
nullptr>
204 return std::get<PASS_DEPENDENCIES>(std::get<Index>(describePasses<Node>()));
209 typename Node,
size_t Index,
210 typename std::enable_if_t<!hasPassDependencies<Node, Index>(),
void>* =
nullptr>
213 return std::array<dw::core::StringView, 0>();
219 #endif // DW_FRAMEWORK_PASSDESCRIPTOR_HPP_ constexpr auto describePasses()
Get described passes for the passed node.
static constexpr size_t PASS_PROCESSOR_TYPE
constexpr std::tuple< dw::core::StringView, dwProcessorType > describePass(dw::core::StringView const &&name, dwProcessorType processorType)
Describe a specific pass of a node.
constexpr auto passDependencies()
Get the dependencies of a pass.
constexpr auto describePassDependencies(const Args &&... args) -> std::array< dw::core::StringView, sizeof...(Args)>
Describe the custom inter-pass dependencies of a pass.
constexpr dw::core::StringView passName()
Get the name of a pass.
constexpr bool hasPassDependencies()
Check if a pass specifies explicit dependencies.
constexpr auto describePassCollection(const Args &&... args)
Describe the passes of a node.
static constexpr size_t PASS_NAME
constexpr bool isValidPass(std::size_t passID)
Check if pass index is valid.
constexpr size_t passIndex(dw::core::StringView identifier)
Get the the pass index for a pass identified by name.
constexpr dwProcessorType passProcessorType()
Get the processor type of a pass.
static constexpr size_t PASS_DEPENDENCIES
constexpr std::size_t passSize()
Get the number of passes of the passed node.