31 #ifndef DW_FRAMEWORK_PARAMETERDESCRIPTOR_HPP_ 32 #define DW_FRAMEWORK_PARAMETERDESCRIPTOR_HPP_ 36 #include <dw/core/container/StringView.hpp> 37 #include <dw/core/language/Tuple.hpp> 60 return std::make_tuple();
75 return std::make_tuple(
77 static_cast<Argument1T*>(
nullptr),
78 std::forward<const Arg1>(arg1)));
88 typename Argument1T,
typename Argument2T,
89 typename Arg1,
typename Arg2>
93 return std::make_tuple(
95 static_cast<Argument1T*>(
nullptr),
96 std::forward<const Arg1>(arg1)),
98 static_cast<Argument2T*>(
nullptr),
99 std::forward<const Arg2>(arg2)));
109 typename Argument1T,
typename Argument2T,
typename Argument3T,
110 typename Arg1,
typename Arg2,
typename Arg3>
114 return std::make_tuple(
116 static_cast<Argument1T*>(
nullptr),
117 std::forward<const Arg1>(arg1)),
119 static_cast<Argument2T*>(
nullptr),
120 std::forward<const Arg2>(arg2)),
122 static_cast<Argument3T*>(
nullptr),
123 std::forward<const Arg3>(arg3)));
133 typename Argument1T,
typename Argument2T,
typename Argument3T,
typename Argument4T,
134 typename Arg1,
typename Arg2,
typename Arg3,
typename Arg4>
138 return std::make_tuple(
140 static_cast<Argument1T*>(
nullptr),
141 std::forward<const Arg1>(arg1)),
143 static_cast<Argument2T*>(
nullptr),
144 std::forward<const Arg2>(arg2)),
146 static_cast<Argument3T*>(
nullptr),
147 std::forward<const Arg3>(arg3)),
149 static_cast<Argument4T*>(
nullptr),
150 std::forward<const Arg4>(arg4)));
160 typename Argument1T,
typename Argument2T,
typename Argument3T,
typename Argument4T,
typename Argument5T,
161 typename Arg1,
typename Arg2,
typename Arg3,
typename Arg4,
typename Arg5>
165 return std::make_tuple(
167 static_cast<Argument1T*>(
nullptr),
168 std::forward<const Arg1>(arg1)),
170 static_cast<Argument2T*>(
nullptr),
171 std::forward<const Arg2>(arg2)),
173 static_cast<Argument3T*>(
nullptr),
174 std::forward<const Arg3>(arg3)),
176 static_cast<Argument4T*>(
nullptr),
177 std::forward<const Arg4>(arg4)),
179 static_cast<Argument5T*>(
nullptr),
180 std::forward<const Arg5>(arg5)));
189 template <
typename... Args>
192 return dw::core::make_tuple(
193 std::forward<const Args>(args)...);
225 #define _DW_PARAMETER_TYPE_NAME_STRING_VIEW(TYPE_NAME_STR) TYPE_NAME_STR##_sv 230 #define DW_DESCRIBE_PARAMETER(TYPE_NAME, args...) dw::framework::describeParameter<TYPE_NAME, TYPE_NAME>(_DW_PARAMETER_TYPE_NAME_STRING_VIEW(#TYPE_NAME), ##args) 235 #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) 250 template <
typename T,
typename S,
typename... MemberPointers>
252 dw::core::StringView
const&& typeName, dw::core::StringView
const&& parameterName,
const MemberPointers&&... memberPointers)
254 return std::make_tuple(
256 std::move(parameterName),
257 static_cast<T*>(
nullptr),
258 static_cast<S*>(
nullptr),
260 static_cast<size_t>(0),
262 std::make_tuple<const MemberPointers...>(std::forward<const MemberPointers>(memberPointers)...)));
272 #define DW_DESCRIBE_ABSTRACT_PARAMETER(TYPE_NAME, args...) dw::framework::describeAbstractParameter<TYPE_NAME>(_DW_PARAMETER_TYPE_NAME_STRING_VIEW(#TYPE_NAME), ##args) 277 #define DW_DESCRIBE_ABSTRACT_ARRAY_PARAMETER(TYPE_NAME, args...) dw::framework::describeAbstractArrayParameter<TYPE_NAME>(_DW_PARAMETER_TYPE_NAME_STRING_VIEW(#TYPE_NAME), ##args) 289 template <
typename T>
291 dw::core::StringView
const&& typeName, dw::core::StringView
const&& parameterName)
293 return std::make_tuple(
295 std::move(parameterName),
296 static_cast<T*>(
nullptr),
297 static_cast<T*>(
nullptr),
299 static_cast<size_t>(0));
307 template <
typename T>
309 dw::core::StringView
const&& typeName, dw::core::StringView
const&& parameterName,
size_t arraySize)
311 return std::make_tuple(
313 std::move(parameterName),
314 static_cast<T*>(
nullptr),
315 static_cast<T*>(
nullptr),
327 #define DW_DESCRIBE_INDEX_PARAMETER(TYPE_NAME, args...) dw::framework::describeIndexParameter<TYPE_NAME, TYPE_NAME>(_DW_PARAMETER_TYPE_NAME_STRING_VIEW(#TYPE_NAME), ##args) 332 #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) 345 template <
typename T,
typename S,
typename... MemberPointers>
347 dw::core::StringView
const&& typeName, dw::core::StringView
const&& parameterName,
const MemberPointers&&... memberPointers)
349 return std::make_tuple(
351 std::move(parameterName),
352 static_cast<T*>(
nullptr),
353 static_cast<S*>(
nullptr),
355 static_cast<size_t>(0),
357 std::make_tuple<const MemberPointers...>(std::forward<const MemberPointers>(memberPointers)...)));
367 #define DW_DESCRIBE_ARRAY_PARAMETER(TYPE_NAME, args...) dw::framework::describeArrayParameter<TYPE_NAME, TYPE_NAME>(_DW_PARAMETER_TYPE_NAME_STRING_VIEW(#TYPE_NAME), ##args) 372 #define DW_DESCRIBE_ARRAY_PARAMETER_WITH_SEMANTIC(TYPE_NAME, SEMANTIC_TYPE_NAME, args...) dw::framework::describeArrayParameter<TYPE_NAME, SEMANTIC_TYPE_NAME>(_DW_PARAMETER_TYPE_NAME_STRING_VIEW(#TYPE_NAME), ##args) 384 template <
typename T,
typename S,
typename... MemberPointers>
386 dw::core::StringView
const&& typeName, dw::core::StringView
const&& parameterName,
size_t arraySize,
const MemberPointers&&... memberPointers)
388 return std::make_tuple(
390 std::move(parameterName),
391 static_cast<T*>(
nullptr),
392 static_cast<S*>(
nullptr),
396 std::make_tuple<const MemberPointers...>(std::forward<const MemberPointers>(memberPointers)...)));
406 #define DW_DESCRIBE_UNNAMED_PARAMETER(TYPE_NAME, args...) dw::framework::describeUnnamedParameter<TYPE_NAME, TYPE_NAME>(_DW_PARAMETER_TYPE_NAME_STRING_VIEW(#TYPE_NAME), ##args) 411 #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) 424 template <
typename T,
typename S,
typename... MemberPointers>
426 dw::core::StringView
const&& typeName,
const MemberPointers&&... memberPointers)
428 return describeParameter<T, S>(
431 std::forward<const MemberPointers>(memberPointers)...);
441 #define DW_DESCRIBE_UNNAMED_ARRAY_PARAMETER(TYPE_NAME, args...) dw::framework::describeUnnamedArrayParameter<TYPE_NAME, TYPE_NAME>(_DW_PARAMETER_TYPE_NAME_STRING_VIEW(#TYPE_NAME), ##args) 446 #define DW_DESCRIBE_UNNAMED_ARRAY_PARAMETER_WITH_SEMANTIC(TYPE_NAME, SEMANTIC_TYPE_NAME, args...) dw::framework::describeUnnamedArrayParameter<TYPE_NAME, SEMANTIC_TYPE_NAME>(_DW_PARAMETER_TYPE_NAME_STRING_VIEW(#TYPE_NAME), ##args) 459 template <
typename T,
typename S,
typename... MemberPointers>
461 dw::core::StringView
const&& typeName,
size_t arraySize,
const MemberPointers&&... memberPointers)
463 return describeArrayParameter<T, S>(
467 std::forward<const MemberPointers>(memberPointers)...);
477 #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) 489 template <
typename T,
typename S,
typename... MemberPointers>
491 dw::core::StringView
const&& typeName, dw::core::StringView
const&& parameterName, T defaultValue,
const MemberPointers&&... memberPointers)
493 return std::make_tuple(
495 std::move(parameterName),
496 static_cast<T*>(
nullptr),
497 static_cast<S*>(
nullptr),
499 static_cast<size_t>(0),
501 std::make_tuple<const MemberPointers...>(std::forward<const MemberPointers>(memberPointers)...)),
502 std::move(defaultValue));
512 #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) 524 template <
typename T,
typename S,
size_t ArraySize,
typename... MemberPointers>
526 dw::core::StringView
const&& typeName, dw::core::StringView
const&& parameterName, std::array<T, ArraySize> defaultValue,
const MemberPointers&&... memberPointers)
528 return std::make_tuple(
530 std::move(parameterName),
531 static_cast<T*>(
nullptr),
532 static_cast<S*>(
nullptr),
536 std::make_tuple<const MemberPointers...>(std::forward<const MemberPointers>(memberPointers)...)),
537 std::move(defaultValue));
541 template <
typename NodeT>
552 typename Param,
typename MemberPtr,
556 void populateDefault(
const Param& param, MemberPtr& memberPtr)
558 static_cast<void>(param);
559 static_cast<void>(memberPtr);
564 typename Param,
typename MemberPtr,
565 typename std::enable_if_t<PARAMETER_DEFAULT_VALUE<std::tuple_size<Param>(),
void>* =
nullptr>
568 void populateDefault(
const Param& param, MemberPtr& memberPtr)
570 auto defaultValue = std::get<PARAMETER_DEFAULT_VALUE>(param);
571 memberPtr = defaultValue;
576 typename Param,
typename MemberPtr,
580 void populateArrayDefault(
const Param& param, MemberPtr& memberPtr,
size_t index)
582 static_cast<void>(param);
583 static_cast<void>(memberPtr);
584 static_cast<void>(index);
589 typename Param,
typename MemberPtr,
590 typename std::enable_if_t<PARAMETER_DEFAULT_VALUE<std::tuple_size<Param>(),
void>* =
nullptr>
593 void populateArrayDefault(
const Param& param, MemberPtr& memberPtr,
size_t index)
595 auto defaultValue = std::get<PARAMETER_DEFAULT_VALUE>(param);
596 memberPtr[index] = defaultValue[index];
601 size_t MemberIndex,
typename ArgType,
typename MemberPtrs,
602 typename std::enable_if_t<std::tuple_size<MemberPtrs>() == 0,
void>* =
nullptr>
605 auto& getMemberPtr(ArgType& arg, MemberPtrs memberPtrs)
607 static_cast<void>(memberPtrs);
613 size_t MemberIndex,
typename ArgType,
typename MemberPtrs,
614 typename std::enable_if_t<MemberIndex + 1 == std::tuple_size<MemberPtrs>(),
void>* =
nullptr>
617 auto& getMemberPtr(ArgType& arg, MemberPtrs memberPtrs)
619 auto member = std::get<MemberIndex>(memberPtrs);
625 size_t MemberIndex,
typename ArgType,
typename MemberPtrs,
626 typename std::enable_if_t<MemberIndex + 1 < std::tuple_size<MemberPtrs>(),
void>* =
nullptr>
629 auto& getMemberPtr(ArgType& arg, MemberPtrs memberPtrs)
631 auto& member = std::get<MemberIndex>(memberPtrs);
632 auto& m = arg.*member;
633 return getMemberPtr<MemberIndex + 1>(m, memberPtrs);
637 template <
typename NodeT,
size_t ConstructorParameterIndex>
638 constexpr
size_t constructorArgumentParameterSize()
640 return dw::core::tuple_size<
641 std::tuple_element_t<
643 std::tuple_element_t<
644 ConstructorParameterIndex,
645 decltype(describeParameters<NodeT>())>>>();
650 typename NodeT,
size_t ConstructorParameterIndex,
size_t ParamIndex,
typename ArgType,
651 typename std::enable_if_t<ParamIndex == constructorArgumentParameterSize<NodeT, ConstructorParameterIndex>(),
void>* =
nullptr>
654 void populateParametersRecursion(
const ParameterProvider& provider, ArgType& arg)
656 static_cast<void>(arg);
657 static_cast<void>(provider);
661 template <
typename NodeT,
size_t ConstructorParameterIndex,
size_t ParamIndex>
662 constexpr
bool isIndexParameter()
664 constexpr
auto param = dw::core::get<ParamIndex>(
665 std::get<PARAMETER_CONSTRUCTOR_ARGUMENT_DESCRIPTOR>(
666 std::get<ConstructorParameterIndex>(describeParameters<NodeT>())));
667 return std::get<PARAMETER_IS_INDEX>(param);
671 template <
typename NodeT,
size_t ConstructorParameterIndex,
size_t ParamIndex>
672 constexpr
bool isArrayParameter()
674 constexpr
auto param = dw::core::get<ParamIndex>(
675 std::get<PARAMETER_CONSTRUCTOR_ARGUMENT_DESCRIPTOR>(
676 std::get<ConstructorParameterIndex>(describeParameters<NodeT>())));
677 constexpr
size_t arraySize = std::get<
679 return arraySize > 0;
683 template <
typename NodeT,
size_t ConstructorParameterIndex,
size_t ParamIndex>
684 constexpr
bool isAbstractParameter()
686 constexpr
auto param = dw::core::get<ParamIndex>(
687 std::get<PARAMETER_CONSTRUCTOR_ARGUMENT_DESCRIPTOR>(
688 std::get<ConstructorParameterIndex>(describeParameters<NodeT>())));
694 typename NodeT,
size_t ConstructorParameterIndex,
size_t ParamIndex,
typename ArgType,
695 typename std::enable_if_t<isAbstractParameter<NodeT, ConstructorParameterIndex, ParamIndex>(),
void>* =
nullptr>
700 static_cast<void>(arg);
701 static_cast<void>(provider);
710 typename NodeT,
size_t ConstructorParameterIndex,
size_t ParamIndex,
typename ArgType,
711 typename std::enable_if_t<!isAbstractParameter<NodeT, ConstructorParameterIndex, ParamIndex>() && !isArrayParameter<NodeT, ConstructorParameterIndex, ParamIndex>() && !isIndexParameter<NodeT, ConstructorParameterIndex, ParamIndex>(),
void>* =
nullptr>
716 constexpr
auto param = dw::core::get<ParamIndex>(
717 std::get<PARAMETER_CONSTRUCTOR_ARGUMENT_DESCRIPTOR>(
718 std::get<ConstructorParameterIndex>(describeParameters<NodeT>())));
720 using DataType = std::remove_pointer_t<
721 std::tuple_element_t<
723 using SemanticDataType = std::remove_pointer_t<
724 std::tuple_element_t<
727 DataType& memberPtr = getMemberPtr<0>(arg, std::get<PARAMETER_MEMBER_PTRS>(param));
728 bool hadParameter = provider.
getOptional<SemanticDataType, DataType>(std::get<PARAMETER_NAME>(param), &memberPtr);
731 populateDefault(param, memberPtr);
741 typename NodeT,
size_t ConstructorParameterIndex,
size_t ParamIndex,
typename ArgType,
742 typename std::enable_if_t<!isAbstractParameter<NodeT, ConstructorParameterIndex, ParamIndex>() && !isArrayParameter<NodeT, ConstructorParameterIndex, ParamIndex>() && isIndexParameter<NodeT, ConstructorParameterIndex, ParamIndex>(),
void>* =
nullptr>
747 constexpr
auto param = dw::core::get<ParamIndex>(
748 std::get<PARAMETER_CONSTRUCTOR_ARGUMENT_DESCRIPTOR>(
749 std::get<ConstructorParameterIndex>(describeParameters<NodeT>())));
751 using DataType = std::remove_pointer_t<
752 std::tuple_element_t<
754 using SemanticDataType = std::remove_pointer_t<
755 std::tuple_element_t<
757 DataType& memberPtr = getMemberPtr<0>(arg, std::get<PARAMETER_MEMBER_PTRS>(param));
759 size_t index =
static_cast<size_t>(-1);
760 bool hadParameter = provider.
getOptional<size_t,
size_t>(std::get<PARAMETER_NAME>(param), &index);
763 hadParameter = provider.
getOptional<SemanticDataType, DataType>(
"", index, &memberPtr);
767 populateDefault(param, memberPtr);
777 typename NodeT,
size_t ConstructorParameterIndex,
size_t ParamIndex,
typename ArgType,
778 typename std::enable_if_t<!isAbstractParameter<NodeT, ConstructorParameterIndex, ParamIndex>() && isArrayParameter<NodeT, ConstructorParameterIndex, ParamIndex>(),
void>* =
nullptr>
783 constexpr
auto param = dw::core::get<ParamIndex>(
784 std::get<PARAMETER_CONSTRUCTOR_ARGUMENT_DESCRIPTOR>(
785 std::get<ConstructorParameterIndex>(describeParameters<NodeT>())));
787 using DataType = std::remove_pointer_t<
788 std::tuple_element_t<
790 using SemanticDataType = std::remove_pointer_t<
791 std::tuple_element_t<
794 constexpr
size_t arraySize = std::get<PARAMETER_ARRAY_SIZE>(
797 DataType(&memberPtr)[arraySize] = getMemberPtr<0>(arg, std::get<PARAMETER_MEMBER_PTRS>(param));
798 for (
size_t i = 0; i < arraySize; ++i)
800 bool hadParameter = provider.
getOptional<SemanticDataType, DataType>(std::get<PARAMETER_NAME>(param), i, &memberPtr[i]);
803 populateArrayDefault(param, memberPtr, i);
810 typename NodeT,
size_t ConstructorParameterIndex,
size_t ParamIndex,
typename ArgType,
811 typename std::enable_if_t<ParamIndex<constructorArgumentParameterSize<NodeT, ConstructorParameterIndex>(),
void>* =
nullptr>
814 void populateParametersRecursion(
const ParameterProvider& provider, ArgType& arg)
816 populateParameter<NodeT, ConstructorParameterIndex, ParamIndex>(provider, arg);
818 populateParametersRecursion<NodeT, ConstructorParameterIndex, ParamIndex + 1>(provider, arg);
826 template <
typename NodeT,
size_t ConstructorParameterIndex,
typename ArgType>
833 populateParametersRecursion<NodeT, ConstructorParameterIndex, 0>(provider, arg);
837 throw Exception(e.
status(),
"Exception while populating parameters of mangled node type ",
typeid(NodeT).name(),
": ", e.
messageStr());
846 class ConstructorArguments,
847 typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 1,
void>* =
nullptr>
852 auto& arg0 = std::get<0>(constructorArguments);
853 detail::populateParameters<NodeT, 0>(arg0, provider);
859 class ConstructorArguments,
860 typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 2,
void>* =
nullptr>
865 auto& arg0 = std::get<0>(constructorArguments);
866 detail::populateParameters<NodeT, 0>(provider, arg0);
867 auto& arg1 = std::get<1>(constructorArguments);
868 detail::populateParameters<NodeT, 1>(provider, arg1);
874 class ConstructorArguments,
875 typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 3,
void>* =
nullptr>
880 auto& arg0 = std::get<0>(constructorArguments);
881 detail::populateParameters<NodeT, 0>(provider, arg0);
882 auto& arg1 = std::get<1>(constructorArguments);
883 detail::populateParameters<NodeT, 1>(provider, arg1);
884 auto& arg2 = std::get<2>(constructorArguments);
885 detail::populateParameters<NodeT, 2>(provider, arg2);
891 class ConstructorArguments,
892 typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 4,
void>* =
nullptr>
897 auto& arg0 = std::get<0>(constructorArguments);
898 detail::populateParameters<NodeT, 0>(provider, arg0);
899 auto& arg1 = std::get<1>(constructorArguments);
900 detail::populateParameters<NodeT, 1>(provider, arg1);
901 auto& arg2 = std::get<2>(constructorArguments);
902 detail::populateParameters<NodeT, 2>(provider, arg2);
903 auto& arg3 = std::get<3>(constructorArguments);
904 detail::populateParameters<NodeT, 3>(provider, arg3);
910 class ConstructorArguments,
911 typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 5,
void>* =
nullptr>
916 auto& arg0 = std::get<0>(constructorArguments);
917 detail::populateParameters<NodeT, 0>(provider, arg0);
918 auto& arg1 = std::get<1>(constructorArguments);
919 detail::populateParameters<NodeT, 1>(provider, arg1);
920 auto& arg2 = std::get<2>(constructorArguments);
921 detail::populateParameters<NodeT, 2>(provider, arg2);
922 auto& arg3 = std::get<3>(constructorArguments);
923 detail::populateParameters<NodeT, 3>(provider, arg3);
924 auto& arg4 = std::get<4>(constructorArguments);
925 detail::populateParameters<NodeT, 4>(provider, arg4);
932 template <
typename NodeT>
933 constexpr std::size_t parameterConstructorArgumentSize()
935 return std::tuple_size<decltype(describeParameters<NodeT>())>::value;
940 typename NodeT,
size_t ConstructorArgumentIndex,
941 typename std::enable_if_t<ConstructorArgumentIndex == parameterConstructorArgumentSize<NodeT>(),
void>* =
nullptr>
944 return std::make_tuple();
949 typename NodeT,
size_t ConstructorArgumentIndex,
950 typename std::enable_if_t<ConstructorArgumentIndex<parameterConstructorArgumentSize<NodeT>(),
void>* =
nullptr>
auto createConstructorArguments()
952 using NodeParams = decltype(describeParameters<NodeT>());
954 using ConstructorParameter = std::tuple_element_t<ConstructorArgumentIndex, NodeParams>;
955 using ArgType = std::remove_pointer_t<
956 typename std::tuple_element_t<PARAMETER_CONSTRUCTOR_ARGUMENT_TYPE, ConstructorParameter>>;
959 return std::tuple_cat(std::make_tuple(arg), createConstructorArguments<NodeT, ConstructorArgumentIndex + 1>());
965 template <
typename NodeT>
968 return detail::createConstructorArguments<NodeT, 0>();
975 template <
class T,
class Tuple,
size_t... Is>
976 auto makeUniqueFromTuple(
const Tuple&& tuple, std::index_sequence<Is...>) -> std::unique_ptr<T>
978 return std::unique_ptr<T>(
new T{std::get<Is>(std::move(tuple))...});
983 template <
typename NodeT,
class ConstructorArguments>
986 return detail::makeUniqueFromTuple<NodeT>(
987 std::move(constructorArguments),
988 std::make_index_sequence<std::tuple_size<std::decay_t<ConstructorArguments>>::value>{});
999 template <
typename NodeT>
1002 auto constructorArguments = createConstructorArguments<NodeT>();
1003 populateParameters<NodeT>(constructorArguments, provider);
1004 return makeUniqueFromTuple<NodeT>(std::move(constructorArguments));
1013 typename NodeT,
size_t ConstructorArgumentIndex,
1014 typename std::enable_if_t<ConstructorArgumentIndex == parameterConstructorArgumentSize<NodeT>(),
void>* =
nullptr>
1022 typename NodeT,
size_t ConstructorArgumentIndex,
1023 typename std::enable_if_t<ConstructorArgumentIndex<parameterConstructorArgumentSize<NodeT>(),
void>* =
nullptr> constexpr std::size_t
parameterSize()
1025 return constructorArgumentParameterSize<NodeT, ConstructorArgumentIndex>() + parameterSize<NodeT, ConstructorArgumentIndex + 1>();
1031 template <
typename NodeT>
1034 return detail::parameterSize<NodeT, 0>();
1040 #endif // DW_FRAMEWORK_PARAMETERDESCRIPTOR_HPP_ char8_t const * messageStr() const noexcept
constexpr auto describeUnnamedArrayParameter(dw::core::StringView const &&typeName, size_t arraySize, const MemberPointers &&... memberPointers)
Describe an unnamed array parameter.
constexpr auto describeParameterWithDefault(dw::core::StringView const &&typeName, dw::core::StringView const &¶meterName, T defaultValue, const MemberPointers &&... memberPointers)
Describe a parameter with a default value.
constexpr auto describeAbstractParameter(dw::core::StringView const &&typeName, dw::core::StringView const &¶meterName)
Describe an abstract parameter.
static constexpr size_t PARAMETER_CONSTRUCTOR_ARGUMENT_DESCRIPTOR
constexpr auto describeUnnamedParameter(dw::core::StringView const &&typeName, const MemberPointers &&... memberPointers)
Describe an unnamed parameter.
static constexpr size_t PARAMETER_TYPE_NAME
static constexpr size_t PARAMETER_CONSTRUCTOR_ARGUMENT_TYPE
constexpr auto describeParameter(dw::core::StringView const &&typeName, dw::core::StringView const &¶meterName, const MemberPointers &&... memberPointers)
Describe a parameter.
auto createConstructorArguments()
Create a tuple of constructor argument needed by the constructor of the passed node.
constexpr std::size_t parameterSize()
Get the number of parameters for a given node.
static constexpr size_t PARAMETER_SEMANTIC_TYPE
static constexpr size_t PARAMETER_NAME
static constexpr size_t PARAMETER_TYPE
constexpr auto describeAbstractArrayParameter(dw::core::StringView const &&typeName, dw::core::StringView const &¶meterName, size_t arraySize)
Describe an abstract array parameter.
auto create(const ParameterProvider &provider) -> std::unique_ptr< NodeT >
Instantiate a node using parameters from the passed provider.
static constexpr size_t PARAMETER_IS_INDEX
constexpr auto describeIndexParameter(dw::core::StringView const &&typeName, dw::core::StringView const &¶meterName, const MemberPointers &&... memberPointers)
Describe an index parameter.
constexpr auto describeArrayParameterWithDefault(dw::core::StringView const &&typeName, dw::core::StringView const &¶meterName, std::array< T, ArraySize > defaultValue, const MemberPointers &&... memberPointers)
Describe an array parameter with a default value.
static constexpr size_t PARAMETER_ARRAY_SIZE
constexpr auto describeConstructorArgument(const Args &&... args)
Describe a specific constructor argument of a node.
auto makeUniqueFromTuple(const ConstructorArguments &&constructorArguments) -> std::unique_ptr< NodeT >
Instantiate a node using the passed constructor arguments.
constexpr auto describeParameters()
Get described parameters for the passed node.
The interface to access parameter values identified by name and/or (semantic) type.
void populateParameters(ConstructorArguments &constructorArguments, const ParameterProvider &provider)
Populate the constructor arguments using values from the parameter provider.
static constexpr size_t PARAMETER_MEMBER_PTRS
constexpr std::tuple describeConstructorArguments()
Describe the constructor arguments of a node.
bool getOptional(dw::core::StringView const &key, T *out) const
Convenience API throwing an exception instead of returning a failed status.
static constexpr size_t PARAMETER_DEFAULT_VALUE
constexpr auto describeArrayParameter(dw::core::StringView const &&typeName, dw::core::StringView const &¶meterName, size_t arraySize, const MemberPointers &&... memberPointers)
Describe an array parameter.