31#ifndef DW_FRAMEWORK_PARAMETERDESCRIPTOR_HPP_
32#define DW_FRAMEWORK_PARAMETERDESCRIPTOR_HPP_
36#include <dwshared/dwfoundation/dw/core/container/StringView.hpp>
37#include <dwshared/dwfoundation/dw/core/language/Optional.hpp>
38#include <dwshared/dwfoundation/dw/core/language/Tuple.hpp>
45template <
typename ConstructorArgumentT,
typename ParameterDescriptorsT>
48 static_assert(std::is_constructible<ConstructorArgumentT>::value,
"ConstructorArgumentT must be constructible");
70 return std::make_tuple();
80template <
typename Arg1>
84 return std::make_tuple(std::forward<Arg1>(arg1));
95 typename Arg1,
typename... ArgRest,
96 typename std::enable_if_t<
sizeof...(ArgRest) != 0>* =
nullptr>
101 return std::tuple_cat(
102 describeConstructorArguments<Arg1>(std::forward<Arg1>(arg1)),
103 describeConstructorArguments<ArgRest...>(std::forward<ArgRest>(argRest)...));
112template <
typename ConstructorArgumentT,
typename... Args>
117 dw::core::make_tuple<
const Args...>(std::forward<const Args>(args)...));
120template <
typename Type_,
typename SemanticType_,
bool IsIndex,
size_t ArraySize,
bool IsAbstract,
bool HasDefault,
typename... MemberPointers>
123 static_assert(std::is_constructible<Type_>::value,
"Type_ must be constructible");
140 constexpr ParameterDescriptorT(dw::core::StringView&& typeName_, dw::core::StringView&& parameterName_,
const MemberPointers&&... memberPointers_)
143 ,
memberPointers(std::make_tuple<const MemberPointers...>(std::forward<const MemberPointers>(memberPointers_)...))
148template <
typename Type_,
typename SemanticType_,
bool IsIndex,
size_t ArraySize,
bool IsAbstract,
bool HasDefault,
typename... MemberPointers>
149constexpr bool ParameterDescriptorT<Type_, SemanticType_, IsIndex, ArraySize, IsAbstract, HasDefault, MemberPointers...>::IS_INDEX;
151template <
typename Type_,
typename SemanticType_,
bool IsIndex,
size_t ArraySize,
bool IsAbstract,
bool HasDefault,
typename... MemberPointers>
152constexpr size_t ParameterDescriptorT<Type_, SemanticType_, IsIndex, ArraySize, IsAbstract, HasDefault, MemberPointers...>::ARRAY_SIZE;
154template <
typename Type_,
typename SemanticType_,
bool IsIndex,
size_t ArraySize,
bool IsAbstract,
bool HasDefault,
typename... MemberPointers>
155constexpr bool ParameterDescriptorT<Type_, SemanticType_, IsIndex, ArraySize, IsAbstract, HasDefault, MemberPointers...>::HAS_DEFAULT;
157template <
typename Type,
typename SemanticType,
bool IsIndex,
size_t ArraySize,
bool IsAbstract,
typename DefaultType,
typename... MemberPointers>
160 static_assert(std::is_trivially_move_constructible<DefaultType>(),
"DefaultType must be trivially move constructible");
164 constexpr ParameterDescriptorWithDefaultT(dw::core::StringView&& typeName_, dw::core::StringView&& parameterName_, DefaultType&& defaultValue_,
const MemberPointers&&... memberPointers_)
165 :
ParameterDescriptorT<
Type,
SemanticType, IsIndex, ArraySize, IsAbstract, true, MemberPointers...>{std::move(typeName_), std::move(parameterName_), std::forward<const MemberPointers>(memberPointers_)...}
174#define DW_PARAMETER_TYPE_NAME_STRING_VIEW_IMPL(TYPE_NAME_STR) \
175 dw::core::StringView { TYPE_NAME_STR }
176#define DW_PARAMETER_TYPE_NAME_STRING_VIEW(TYPE_NAME) DW_PARAMETER_TYPE_NAME_STRING_VIEW_IMPL(#TYPE_NAME)
177#define DW_DESCRIBE_PARAMETER(TYPE_NAME, args...) dw::framework::describeParameter<TYPE_NAME, TYPE_NAME>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(TYPE_NAME), ##args)
178#define DW_DESCRIBE_PARAMETER_WITH_SEMANTIC(TYPE_NAME, SEMANTIC_TYPE_NAME, args...) dw::framework::describeParameter<TYPE_NAME, SEMANTIC_TYPE_NAME>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(TYPE_NAME), ##args)
193template <
typename T,
typename S,
typename... MemberPointers>
196 dw::core::StringView&& typeName, dw::core::StringView&& parameterName,
const MemberPointers&&... memberPointers) ->
ParameterDescriptorT<T, S,
false, 0,
false,
false, MemberPointers...>
200 std::move(parameterName),
201 std::forward<const MemberPointers>(memberPointers)...);
207#define DW_DESCRIBE_ABSTRACT_PARAMETER(TYPE_NAME, args...) dw::framework::describeAbstractParameter<TYPE_NAME>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(TYPE_NAME), ##args)
208#define DW_DESCRIBE_ABSTRACT_ARRAY_PARAMETER(TYPE_NAME, PARAM_NAME, ARRAY_SIZE, args...) dw::framework::describeAbstractArrayParameter<TYPE_NAME, ARRAY_SIZE>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(TYPE_NAME), PARAM_NAME, ##args)
224 dw::core::StringView&& typeName, dw::core::StringView&& parameterName)
228 std::move(parameterName));
236template <
typename T,
size_t ArraySize>
238 dw::core::StringView&& typeName, dw::core::StringView&& parameterName)
242 std::move(parameterName));
248#define DW_DESCRIBE_INDEX_PARAMETER(TYPE_NAME, args...) dw::framework::describeIndexParameter<TYPE_NAME, TYPE_NAME>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(TYPE_NAME), ##args)
249#define DW_DESCRIBE_INDEX_PARAMETER_WITH_SEMANTIC(TYPE_NAME, SEMANTIC_TYPE_NAME, args...) dw::framework::describeIndexParameter<TYPE_NAME, SEMANTIC_TYPE_NAME>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(TYPE_NAME), ##args)
262template <
typename T,
typename S,
typename... MemberPointers>
266 dw::core::StringView&& typeName, dw::core::StringView&& parameterName,
const MemberPointers&&... memberPointers)
270 std::move(parameterName),
271 std::forward<const MemberPointers>(memberPointers)...);
277#define DW_DESCRIBE_ARRAY_PARAMETER(TYPE_NAME, PARAM_NAME, ARRAY_SIZE, args...) dw::framework::describeArrayParameter<TYPE_NAME, TYPE_NAME, ARRAY_SIZE>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(TYPE_NAME), PARAM_NAME, ##args)
278#define DW_DESCRIBE_ARRAY_PARAMETER_WITH_SEMANTIC(TYPE_NAME, SEMANTIC_TYPE_NAME, PARAM_NAME, ARRAY_SIZE, args...) dw::framework::describeArrayParameter<TYPE_NAME, SEMANTIC_TYPE_NAME, ARRAY_SIZE>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(TYPE_NAME), PARAM_NAME, ##args)
290template <
typename T,
typename S,
size_t ArraySize,
typename... MemberPointers>
294 dw::core::StringView&& typeName, dw::core::StringView&& parameterName,
const MemberPointers&&... memberPointers)
298 std::move(parameterName),
299 std::forward<const MemberPointers>(memberPointers)...);
305#define DW_DESCRIBE_UNNAMED_PARAMETER(TYPE_NAME, args...) dw::framework::describeUnnamedParameter<TYPE_NAME, TYPE_NAME>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(TYPE_NAME), ##args)
306#define DW_DESCRIBE_UNNAMED_PARAMETER_WITH_SEMANTIC(TYPE_NAME, SEMANTIC_TYPE_NAME, args...) dw::framework::describeUnnamedParameter<TYPE_NAME, SEMANTIC_TYPE_NAME>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(TYPE_NAME), ##args)
319template <
typename T,
typename S,
typename... MemberPointers>
322 dw::core::StringView&& typeName,
const MemberPointers&&... memberPointers) ->
ParameterDescriptorT<T, S,
false, 0,
false,
false, MemberPointers...>
328 dw::core::StringView{
""},
329 std::forward<const MemberPointers>(memberPointers)...);
335#define DW_DESCRIBE_UNNAMED_ARRAY_PARAMETER(TYPE_NAME, ARRAY_SIZE, args...) dw::framework::describeUnnamedArrayParameter<TYPE_NAME, TYPE_NAME, ARRAY_SIZE>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(TYPE_NAME), ##args)
336#define DW_DESCRIBE_UNNAMED_ARRAY_PARAMETER_WITH_SEMANTIC(TYPE_NAME, SEMANTIC_TYPE_NAME, ARRAY_SIZE, args...) dw::framework::describeUnnamedArrayParameter<TYPE_NAME, SEMANTIC_TYPE_NAME, ARRAY_SIZE>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(TYPE_NAME), ##args)
349template <
typename T,
typename S,
size_t ArraySize,
typename... MemberPointers>
351 dw::core::StringView&& typeName,
const MemberPointers&&... memberPointers)
353 return describeArrayParameter<T, S, ArraySize>(
356 std::forward<const MemberPointers>(memberPointers)...);
362#define DW_DESCRIBE_PARAMETER_WITH_DEFAULT(TYPE_NAME, args...) dw::framework::describeParameterWithDefault<TYPE_NAME, TYPE_NAME>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(TYPE_NAME), ##args)
374template <
typename T,
typename S,
typename... MemberPointers>
377 dw::core::StringView&& typeName, dw::core::StringView&& parameterName, T&& defaultValue,
const MemberPointers&&... memberPointers) ->
ParameterDescriptorWithDefaultT<T, S,
false, 0,
false, T, MemberPointers...>
381 std::move(parameterName),
382 std::move(defaultValue),
383 std::forward<const MemberPointers>(memberPointers)...);
389#define DW_DESCRIBE_ARRAY_PARAMETER_WITH_DEFAULT(TYPE_NAME, args...) dw::framework::describeArrayParameterWithDefault<TYPE_NAME, TYPE_NAME>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(TYPE_NAME), ##args)
401template <
typename T,
typename S,
size_t ArraySize,
typename... MemberPointers>
404 dw::core::StringView&& typeName, dw::core::StringView&& parameterName, std::array<T, ArraySize> defaultValue,
const MemberPointers&&... memberPointers) ->
ParameterDescriptorWithDefaultT<T, S, false, ArraySize, false, std::array<T, ArraySize>, MemberPointers...>
408 std::move(parameterName),
409 std::move(defaultValue),
410 std::forward<const MemberPointers>(memberPointers)...);
414template <
typename NodeT>
419 return NodeT::describeParameters();
427 typename Param,
typename MemberPtr,
428 typename std::enable_if_t<!Param::HAS_DEFAULT, void>* =
nullptr>
430bool populateDefault(
const Param& param, MemberPtr& memberPtr)
432 static_cast<void>(param);
433 static_cast<void>(memberPtr);
439 typename Param,
typename MemberPtr,
440 typename std::enable_if_t<Param::HAS_DEFAULT, void>* =
nullptr>
442bool populateDefault(
const Param& param, MemberPtr& memberPtr)
444 memberPtr = param.defaultValue;
450 typename Param,
typename MemberPtr,
451 typename std::enable_if_t<!Param::HAS_DEFAULT, void>* =
nullptr>
453void populateArrayDefault(
const Param& param, MemberPtr& memberPtr,
size_t index)
455 static_cast<void>(param);
456 static_cast<void>(memberPtr);
457 static_cast<void>(index);
462 typename Param,
typename MemberPtr,
463 typename std::enable_if_t<Param::HAS_DEFAULT, void>* =
nullptr>
465void populateArrayDefault(
const Param& param, MemberPtr& memberPtr,
size_t index)
467 memberPtr = param.defaultValue.at(index);
472 size_t MemberIndex,
typename ArgType,
typename MemberPtrs,
473 typename std::enable_if_t<std::tuple_size<MemberPtrs>() == 0,
void>* =
nullptr>
475auto getMemberPtr(ArgType& arg, MemberPtrs memberPtrs) -> ArgType&
477 static_cast<void>(memberPtrs);
483 size_t MemberIndex,
typename ArgType,
typename MemberPtrs,
484 typename std::enable_if_t<MemberIndex + 1 == std::tuple_size<MemberPtrs>(),
void>* =
nullptr>
487auto& getMemberPtr(ArgType& arg, MemberPtrs memberPtrs)
490 auto member = std::get<MemberIndex>(memberPtrs);
496 size_t MemberIndex,
typename ArgType,
typename MemberPtrs,
497 typename std::enable_if_t<MemberIndex + 1 < std::tuple_size<MemberPtrs>(),
void>* =
nullptr>
500auto& getMemberPtr(ArgType& arg, MemberPtrs memberPtrs)
503 auto& member = std::get<MemberIndex>(memberPtrs);
505 auto& m = arg.*member;
506 return getMemberPtr<MemberIndex + 1>(m, memberPtrs);
510template <
typename NodeT,
size_t ConstructorParameterIndex>
512constexpr size_t constructorArgumentParameterSize()
514 using ConstructorArgumentDescriptor = std::tuple_element_t<ConstructorParameterIndex, decltype(describeNodeParameters<NodeT>())>;
515 return dw::core::tuple_size<typename ConstructorArgumentDescriptor::ParameterDescriptorsType>::value;
519template <
typename ParamT>
521constexpr bool isIndexParameter()
523 return ParamT::IS_INDEX;
527template <
typename ParamT>
529constexpr bool isArrayParameter()
532 return ParamT::ARRAY_SIZE > 0U;
536template <
typename ParamT>
538constexpr bool isAbstractParameter()
540 return ParamT::IS_ABSTRACT;
545 typename ArgType,
typename ParamT,
546 typename std::enable_if_t<isAbstractParameter<ParamT>(),
void>* =
nullptr>
548void populateParameter(
const ParameterProvider& provider, ArgType& arg,
const ParamT& param)
550 static_cast<void>(provider);
551 static_cast<void>(arg);
552 static_cast<void>(param);
563 typename ArgType,
typename ParamT,
564 typename std::enable_if_t<!isAbstractParameter<ParamT>() && !isArrayParameter<ParamT>() && !isIndexParameter<ParamT>(),
void>* =
nullptr>
566void populateParameter(
const ParameterProvider& provider, ArgType& arg,
const ParamT& param)
568 using DataType =
typename ParamT::Type;
569 using SemanticDataType =
typename ParamT::SemanticType;
570 DataType& memberPtr{getMemberPtr<0>(arg, param.memberPointers)};
571 bool hadParameter{provider.getOptional<SemanticDataType, DataType>(param.parameterName, memberPtr)};
574 bool setDefault{populateDefault(param, memberPtr)};
577 throw ExceptionWithStatus(DW_FAILURE,
"Failed to get required parameter with name '", param.parameterName,
"', T=",
typeid(DataType).name(),
", S=",
typeid(SemanticDataType).name());
590 typename ArgType,
typename ParamT,
591 typename std::enable_if_t<!isAbstractParameter<ParamT>() && !isArrayParameter<ParamT>() && isIndexParameter<ParamT>(),
void>* =
nullptr>
593void populateParameter(
const ParameterProvider& provider, ArgType& arg,
const ParamT& param)
595 using DataType =
typename ParamT::Type;
596 using SemanticDataType =
typename ParamT::SemanticType;
597 DataType& memberPtr{getMemberPtr<0>(arg, param.memberPointers)};
599 size_t index{std::numeric_limits<size_t>::max()};
600 bool hadParameter{provider.getOptional<size_t,
size_t>(param.parameterName, index)};
603 hadParameter = provider.getOptionalWithIndex<SemanticDataType, DataType>(
"", index, memberPtr);
607 bool setDefault{populateDefault(param, memberPtr)};
610 throw ExceptionWithStatus(DW_FAILURE,
"Failed to get required parameter with name '", param.parameterName,
"', index=", index,
", T=",
typeid(DataType).name(),
", S=",
typeid(SemanticDataType).name());
621 typename ArgType,
typename ParamT,
622 typename std::enable_if_t<!isAbstractParameter<ParamT>() && isArrayParameter<ParamT>(),
void>* =
nullptr>
624void populateParameter(
const ParameterProvider& provider, ArgType& arg,
const ParamT& param)
626 using DataType =
typename ParamT::Type;
627 using SemanticDataType =
typename ParamT::SemanticType;
629 constexpr size_t arraySize{ParamT::ARRAY_SIZE};
631 DataType(&memberPtr)[arraySize]{getMemberPtr<0>(arg, param.memberPointers)};
632 for (
size_t i{0U}; i < arraySize; ++i)
634 bool hadParameter{provider.getOptionalWithIndex<SemanticDataType, DataType>(param.parameterName, i, memberPtr[i])};
637 populateArrayDefault(param, memberPtr[i], i);
644template <
typename ArgType>
646void populateParametersRecursion(
const ParameterProvider& provider, ArgType& arg,
const dw::core::Tuple<>& t)
648 static_cast<void>(provider);
649 static_cast<void>(arg);
650 static_cast<void>(t);
655template <
typename ArgType,
typename THead>
657void populateParametersRecursion(
const ParameterProvider& provider, ArgType& arg,
const dw::core::Tuple<THead>& t)
659 populateParameter(provider, arg, t.m_head);
664 typename ArgType,
typename THead,
typename... TTail,
665 typename std::enable_if_t<
sizeof...(TTail) != 0>* =
nullptr>
667void populateParametersRecursion(
const ParameterProvider& provider, ArgType& arg,
const dw::core::Tuple<THead, TTail...>& t)
669 populateParameter(provider, arg, t.m_head);
670 populateParametersRecursion(provider, arg, t.m_tail);
678template <
typename NodeT,
size_t ConstructorParameterIndex,
typename ConstructorArgsType>
680void populateParameters(
const ParameterProvider& provider, ConstructorArgsType& constructorArguments)
685 auto& arg = std::get<ConstructorParameterIndex>(constructorArguments);
687 constexpr auto params = std::get<ConstructorParameterIndex>(describeNodeParameters<NodeT>()).parameterDescriptors;
689 populateParametersRecursion(provider, arg, params);
691 catch (ExceptionWithStatus& e)
693 throw ExceptionWithStatus(e.statusCode(),
"Exception while populating parameters of mangled node type ",
typeid(NodeT).name(),
": ", e.message());
698template <
typename NodeT,
size_t ConstructorParameterIndex,
typename ConstructorArgsType>
700void* populateParametersWithNonVoidReturnType(
const ParameterProvider& provider, ConstructorArgsType& constructorArguments)
702 populateParameters<NodeT, ConstructorParameterIndex>(provider, constructorArguments);
707 typename NodeT,
typename ConstructorArguments,
size_t... Is>
709void populateParametersForEachConstructorArgument(
const ParameterProvider& provider, ConstructorArguments& constructorArguments, std::integer_sequence<size_t, Is...>)
712 populateParametersWithNonVoidReturnType<NodeT, Is>(provider, constructorArguments)...};
713 static_cast<void>(forEach);
719template <
typename NodeT,
typename... Ts>
723 detail::populateParametersForEachConstructorArgument<NodeT>(provider, constructorArguments, std::make_index_sequence<
sizeof...(Ts)>());
730template <
typename NodeT>
732constexpr std::size_t parameterConstructorArgumentSize()
734 return std::tuple_size<decltype(describeNodeParameters<NodeT>())>::value;
739 typename NodeT,
size_t ConstructorArgumentIndex,
740 typename std::enable_if_t<ConstructorArgumentIndex == parameterConstructorArgumentSize<NodeT>(),
void>* =
nullptr>
744 return std::make_tuple();
749 typename NodeT,
size_t ConstructorArgumentIndex,
750 typename std::enable_if_t<ConstructorArgumentIndex<parameterConstructorArgumentSize<NodeT>(),
void>* =
nullptr>
755 using NodeParams =
decltype(describeNodeParameters<NodeT>());
757 using ConstructorArgumentDescriptor = std::tuple_element_t<ConstructorArgumentIndex, NodeParams>;
758 typename ConstructorArgumentDescriptor::ConstructorArgumentType arg{};
760 return std::tuple_cat(std::make_tuple(arg), createConstructorArguments<NodeT, ConstructorArgumentIndex + 1>());
766template <
typename NodeT>
771 return detail::createConstructorArguments<NodeT, 0>();
778template <
class T,
class Tuple,
size_t... Is>
782 return std::make_unique<T>(std::get<Is>(tuple)...);
787template <
typename NodeT,
class ConstructorArguments>
791 return detail::makeUniqueFromTuple<NodeT>(
792 std::move(constructorArguments),
793 std::make_index_sequence<std::tuple_size<std::decay_t<ConstructorArguments>>::value>{});
804template <
typename NodeT>
809 auto constructorArguments = createConstructorArguments<NodeT>();
810 populateParameters<NodeT>(constructorArguments, provider);
811 return makeUniqueFromTuple<NodeT>(std::move(constructorArguments));
820 typename NodeT,
size_t ConstructorArgumentIndex,
821 typename std::enable_if_t<ConstructorArgumentIndex == parameterConstructorArgumentSize<NodeT>(),
void>* =
nullptr>
831 typename NodeT,
size_t ConstructorArgumentIndex,
832 typename std::enable_if_t<ConstructorArgumentIndex<parameterConstructorArgumentSize<NodeT>(),
void>* =
nullptr>
836 return constructorArgumentParameterSize<NodeT, ConstructorArgumentIndex>() + parameterSize<NodeT, ConstructorArgumentIndex + 1>();
842template <
typename NodeT>
846 return detail::parameterSize<NodeT, 0>();
The interface to access parameter values identified by name and/or (semantic) type.
auto makeUniqueFromTuple(ConstructorArguments &&constructorArguments) -> std::unique_ptr< NodeT >
Instantiate a node using the passed constructor arguments.
constexpr auto describeUnnamedParameter(dw::core::StringView &&typeName, const MemberPointers &&... memberPointers) -> ParameterDescriptorT< T, S, false, 0, false, false, MemberPointers... >
constexpr auto describeAbstractArrayParameter(dw::core::StringView &&typeName, dw::core::StringView &¶meterName)
constexpr std::tuple describeConstructorArguments()
constexpr auto describeParameter(dw::core::StringView &&typeName, dw::core::StringView &¶meterName, const MemberPointers &&... memberPointers) -> ParameterDescriptorT< T, S, false, 0, false, false, MemberPointers... >
constexpr auto describeAbstractParameter(dw::core::StringView &&typeName, dw::core::StringView &¶meterName)
constexpr auto describeUnnamedArrayParameter(dw::core::StringView &&typeName, const MemberPointers &&... memberPointers)
auto createConstructorArguments()
Create a tuple of constructor argument needed by the constructor of the passed node.
std::unique_ptr< Node > createNode(const dw::core::StringView &className, ParameterProvider &provider)
constexpr auto describeArrayParameterWithDefault(dw::core::StringView &&typeName, dw::core::StringView &¶meterName, std::array< T, ArraySize > defaultValue, const MemberPointers &&... memberPointers) -> ParameterDescriptorWithDefaultT< T, S, false, ArraySize, false, std::array< T, ArraySize >, MemberPointers... >
constexpr auto describeNodeParameters()
Get described parameters for the passed node.
void populateParameters(std::tuple< Ts... > &constructorArguments, const ParameterProvider &provider)
Populate the constructor arguments using values from the parameter provider.
constexpr std::size_t parameterSize()
Get the number of parameters for a given node.
constexpr auto describeParameterWithDefault(dw::core::StringView &&typeName, dw::core::StringView &¶meterName, T &&defaultValue, const MemberPointers &&... memberPointers) -> ParameterDescriptorWithDefaultT< T, S, false, 0, false, T, MemberPointers... >
constexpr auto describeConstructorArgument(const Args &&... args) -> ConstructorArgumentDescriptorT< ConstructorArgumentT, dw::core::Tuple< Args... > >
constexpr auto describeArrayParameter(dw::core::StringView &&typeName, dw::core::StringView &¶meterName, const MemberPointers &&... memberPointers)
constexpr auto describeIndexParameter(dw::core::StringView &&typeName, dw::core::StringView &¶meterName, const MemberPointers &&... memberPointers)
ConstructorArgumentT ConstructorArgumentType
constexpr ConstructorArgumentDescriptorT(ParameterDescriptorsType &¶meterDescriptors_)
ParameterDescriptorsT ParameterDescriptorsType
ParameterDescriptorsType parameterDescriptors
static constexpr size_t ARRAY_SIZE
static constexpr bool IS_INDEX
dw::core::StringView typeName
std::tuple< const MemberPointers... > memberPointers
static constexpr bool HAS_DEFAULT
static constexpr bool IS_ABSTRACT
constexpr ParameterDescriptorT(dw::core::StringView &&typeName_, dw::core::StringView &¶meterName_, const MemberPointers &&... memberPointers_)
dw::core::StringView parameterName
SemanticType_ SemanticType
constexpr ParameterDescriptorWithDefaultT(dw::core::StringView &&typeName_, dw::core::StringView &¶meterName_, DefaultType &&defaultValue_, const MemberPointers &&... memberPointers_)