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(
82 std::move(processorType));
93template <
typename DependenciesT>
95 dw::core::StringView
const&& name, dwProcessorType processorType, DependenciesT dependencies) -> std::tuple<dw::core::StringView, dwProcessorType, DependenciesT>
97 return std::make_tuple(
99 std::move(processorType),
100 std::move(dependencies));
108template <
typename... Args>
111 return {std::forward<const Args>(args)...};
115template <
typename Node>
122template <
typename Node>
125 return std::tuple_size<decltype(describePasses<Node>())>::value;
131template <
typename Node>
134 return passID < passSize<Node>();
142 typename Node,
size_t Index,
143 typename std::enable_if_t<Index == passSize<Node>(),
void>* =
nullptr>
144constexpr std::size_t
passIndex(dw::core::StringView identifier)
152 typename Node,
size_t Index,
153 typename std::enable_if_t<Index<passSize<Node>(),
void>* =
nullptr>
156 constexpr std::size_t
passIndex(dw::core::StringView identifier)
158 constexpr auto name = std::get<dw::framework::PASS_NAME>(std::get<Index>(describePasses<Node>()));
159 if (name == identifier)
163 return 1 + passIndex<Node, Index + 1>(identifier);
171template <
typename Node>
172constexpr size_t passIndex(dw::core::StringView identifier)
174 return detail::passIndex<Node, 0>(identifier);
178template <
typename Node>
181 constexpr size_t index = passIndex<Node>(identifier);
182 return isValidPass<Node>(index);
186template <
typename Node,
size_t Index>
189 return std::get<dw::framework::PASS_NAME>(std::get<Index>(describePasses<Node>()));
193template <
typename Node,
size_t Index>
196 return std::get<dw::framework::PASS_PROCESSOR_TYPE>(std::get<Index>(describePasses<Node>()));
200template <
typename Node,
size_t Index>
203 constexpr auto pass = 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::get<PASS_DEPENDENCIES>(std::get<Index>(describePasses<Node>()));
218 typename Node,
size_t Index,
219 typename std::enable_if_t<!hasPassDependencies<Node, Index>(),
void>* =
nullptr>
224 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