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();
77 return std::make_tuple(
79 static_cast<Argument1T*
>(
nullptr),
80 std::forward<const Arg1>(arg1)));
90 typename Argument1T,
typename Argument2T,
91 typename Arg1,
typename Arg2>
97 return std::make_tuple(
99 static_cast<Argument1T*
>(
nullptr),
100 std::forward<const Arg1>(arg1)),
102 static_cast<Argument2T*
>(
nullptr),
103 std::forward<const Arg2>(arg2)));
113 typename Argument1T,
typename Argument2T,
typename Argument3T,
114 typename Arg1,
typename Arg2,
typename Arg3>
120 return std::make_tuple(
122 static_cast<Argument1T*
>(
nullptr),
123 std::forward<const Arg1>(arg1)),
125 static_cast<Argument2T*
>(
nullptr),
126 std::forward<const Arg2>(arg2)),
128 static_cast<Argument3T*
>(
nullptr),
129 std::forward<const Arg3>(arg3)));
139 typename Argument1T,
typename Argument2T,
typename Argument3T,
typename Argument4T,
140 typename Arg1,
typename Arg2,
typename Arg3,
typename Arg4>
146 return std::make_tuple(
148 static_cast<Argument1T*
>(
nullptr),
149 std::forward<const Arg1>(arg1)),
151 static_cast<Argument2T*
>(
nullptr),
152 std::forward<const Arg2>(arg2)),
154 static_cast<Argument3T*
>(
nullptr),
155 std::forward<const Arg3>(arg3)),
157 static_cast<Argument4T*
>(
nullptr),
158 std::forward<const Arg4>(arg4)));
168 typename Argument1T,
typename Argument2T,
typename Argument3T,
typename Argument4T,
typename Argument5T,
169 typename Arg1,
typename Arg2,
typename Arg3,
typename Arg4,
typename Arg5>
175 return std::make_tuple(
177 static_cast<Argument1T*
>(
nullptr),
178 std::forward<const Arg1>(arg1)),
180 static_cast<Argument2T*
>(
nullptr),
181 std::forward<const Arg2>(arg2)),
183 static_cast<Argument3T*
>(
nullptr),
184 std::forward<const Arg3>(arg3)),
186 static_cast<Argument4T*
>(
nullptr),
187 std::forward<const Arg4>(arg4)),
189 static_cast<Argument5T*
>(
nullptr),
190 std::forward<const Arg5>(arg5)));
199template <
typename... Args>
202 return dw::core::make_tuple(
203 std::forward<const Args>(args)...);
238#define DW_PARAMETER_TYPE_NAME_STRING_VIEW(TYPE_NAME_STR) TYPE_NAME_STR##_sv
246#define DW_DESCRIBE_PARAMETER(TYPE_NAME, args...) dw::framework::describeParameter<TYPE_NAME, TYPE_NAME>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(#TYPE_NAME), ##args)
254#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)
269template <
typename T,
typename S,
typename... MemberPointers>
271 dw::core::StringView
const&& typeName, dw::core::StringView
const&& parameterName,
const MemberPointers&&... memberPointers)
273 return std::make_tuple(
275 std::move(parameterName),
276 static_cast<T*
>(
nullptr),
277 static_cast<S*
>(
nullptr),
279 static_cast<size_t>(0),
281 std::make_tuple<const MemberPointers...>(std::forward<const MemberPointers>(memberPointers)...)));
294#define DW_DESCRIBE_ABSTRACT_PARAMETER(TYPE_NAME, args...) dw::framework::describeAbstractParameter<TYPE_NAME>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(#TYPE_NAME), ##args)
302#define DW_DESCRIBE_ABSTRACT_ARRAY_PARAMETER(TYPE_NAME, args...) dw::framework::describeAbstractArrayParameter<TYPE_NAME>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(#TYPE_NAME), ##args)
316 dw::core::StringView
const&& typeName, dw::core::StringView
const&& parameterName)
318 return std::make_tuple(
320 std::move(parameterName),
321 static_cast<T*
>(
nullptr),
322 static_cast<T*
>(
nullptr),
324 static_cast<size_t>(0));
334 dw::core::StringView
const&& typeName, dw::core::StringView
const&& parameterName,
size_t arraySize)
336 return std::make_tuple(
338 std::move(parameterName),
339 static_cast<T*
>(
nullptr),
340 static_cast<T*
>(
nullptr),
355#define DW_DESCRIBE_INDEX_PARAMETER(TYPE_NAME, args...) dw::framework::describeIndexParameter<TYPE_NAME, TYPE_NAME>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(#TYPE_NAME), ##args)
363#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)
376template <
typename T,
typename S,
typename... MemberPointers>
378 dw::core::StringView
const&& typeName, dw::core::StringView
const&& parameterName,
const MemberPointers&&... memberPointers)
380 return std::make_tuple(
382 std::move(parameterName),
383 static_cast<T*
>(
nullptr),
384 static_cast<S*
>(
nullptr),
386 static_cast<size_t>(0),
388 std::make_tuple<const MemberPointers...>(std::forward<const MemberPointers>(memberPointers)...)));
401#define DW_DESCRIBE_ARRAY_PARAMETER(TYPE_NAME, args...) dw::framework::describeArrayParameter<TYPE_NAME, TYPE_NAME>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(#TYPE_NAME), ##args)
409#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)
421template <
typename T,
typename S,
typename... MemberPointers>
423 dw::core::StringView
const&& typeName, dw::core::StringView
const&& parameterName,
size_t arraySize,
const MemberPointers&&... memberPointers)
425 return std::make_tuple(
427 std::move(parameterName),
428 static_cast<T*
>(
nullptr),
429 static_cast<S*
>(
nullptr),
433 std::make_tuple<const MemberPointers...>(std::forward<const MemberPointers>(memberPointers)...)));
446#define DW_DESCRIBE_UNNAMED_PARAMETER(TYPE_NAME, args...) dw::framework::describeUnnamedParameter<TYPE_NAME, TYPE_NAME>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(#TYPE_NAME), ##args)
454#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)
467template <
typename T,
typename S,
typename... MemberPointers>
469 dw::core::StringView
const&& typeName,
const MemberPointers&&... memberPointers)
471 return describeParameter<T, S>(
474 std::forward<const MemberPointers>(memberPointers)...);
487#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)
495#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)
508template <
typename T,
typename S,
typename... MemberPointers>
510 dw::core::StringView
const&& typeName,
size_t arraySize,
const MemberPointers&&... memberPointers)
512 return describeArrayParameter<T, S>(
516 std::forward<const MemberPointers>(memberPointers)...);
529#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)
541template <
typename T,
typename S,
typename... MemberPointers>
543 dw::core::StringView
const&& typeName, dw::core::StringView
const&& parameterName, T defaultValue,
const MemberPointers&&... memberPointers)
545 return std::make_tuple(
547 std::move(parameterName),
548 static_cast<T*
>(
nullptr),
549 static_cast<S*
>(
nullptr),
551 static_cast<size_t>(0),
553 std::make_tuple<const MemberPointers...>(std::forward<const MemberPointers>(memberPointers)...)),
554 std::move(defaultValue));
567#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)
579template <
typename T,
typename S,
size_t ArraySize,
typename... MemberPointers>
581 dw::core::StringView
const&& typeName, dw::core::StringView
const&& parameterName, std::array<T, ArraySize> defaultValue,
const MemberPointers&&... memberPointers)
583 return std::make_tuple(
585 std::move(parameterName),
586 static_cast<T*
>(
nullptr),
587 static_cast<S*
>(
nullptr),
591 std::make_tuple<const MemberPointers...>(std::forward<const MemberPointers>(memberPointers)...)),
592 std::move(defaultValue));
596template <
typename NodeT>
607 typename Param,
typename MemberPtr,
611void populateDefault(
const Param& param, MemberPtr& memberPtr)
613 static_cast<void>(param);
614 static_cast<void>(memberPtr);
619 typename Param,
typename MemberPtr,
620 typename std::enable_if_t<PARAMETER_DEFAULT_VALUE<std::tuple_size<Param>(),
void>* =
nullptr>
625 void populateDefault(
const Param& param, MemberPtr& memberPtr)
627 auto defaultValue = std::get<PARAMETER_DEFAULT_VALUE>(param);
628 memberPtr = defaultValue;
633 typename Param,
typename MemberPtr,
637void populateArrayDefault(
const Param& param, MemberPtr& memberPtr,
size_t index)
639 static_cast<void>(param);
640 static_cast<void>(memberPtr);
641 static_cast<void>(index);
646 typename Param,
typename MemberPtr,
647 typename std::enable_if_t<PARAMETER_DEFAULT_VALUE<std::tuple_size<Param>(),
void>* =
nullptr>
652 void populateArrayDefault(
const Param& param, MemberPtr& memberPtr,
size_t index)
654 auto defaultValue = std::get<PARAMETER_DEFAULT_VALUE>(param);
655 memberPtr[index] = defaultValue[index];
660 size_t MemberIndex,
typename ArgType,
typename MemberPtrs,
661 typename std::enable_if_t<std::tuple_size<MemberPtrs>() == 0,
void>* =
nullptr>
664auto& getMemberPtr(ArgType& arg, MemberPtrs memberPtrs)
666 static_cast<void>(memberPtrs);
672 size_t MemberIndex,
typename ArgType,
typename MemberPtrs,
673 typename std::enable_if_t<MemberIndex + 1 == std::tuple_size<MemberPtrs>(),
void>* =
nullptr>
678auto& getMemberPtr(ArgType& arg, MemberPtrs memberPtrs)
680 auto member = std::get<MemberIndex>(memberPtrs);
686 size_t MemberIndex,
typename ArgType,
typename MemberPtrs,
687 typename std::enable_if_t<MemberIndex + 1 < std::tuple_size<MemberPtrs>(),
void>* =
nullptr>
692auto& getMemberPtr(ArgType& arg, MemberPtrs memberPtrs)
694 auto& member = std::get<MemberIndex>(memberPtrs);
695 auto& m = arg.*member;
696 return getMemberPtr<MemberIndex + 1>(m, memberPtrs);
700template <
typename NodeT,
size_t ConstructorParameterIndex>
701constexpr size_t constructorArgumentParameterSize()
703 return dw::core::tuple_size<
704 std::tuple_element_t<
706 std::tuple_element_t<
707 ConstructorParameterIndex,
708 decltype(describeParameters<NodeT>())>>>();
713 typename NodeT,
size_t ConstructorParameterIndex,
size_t ParamIndex,
typename ArgType,
714 typename std::enable_if_t<ParamIndex == constructorArgumentParameterSize<NodeT, ConstructorParameterIndex>(),
void>* =
nullptr>
717void populateParametersRecursion(
const ParameterProvider& provider, ArgType& arg)
719 static_cast<void>(arg);
720 static_cast<void>(provider);
724template <
typename NodeT,
size_t ConstructorParameterIndex,
size_t ParamIndex>
725constexpr bool isIndexParameter()
727 constexpr auto param = dw::core::get<ParamIndex>(
728 std::get<PARAMETER_CONSTRUCTOR_ARGUMENT_DESCRIPTOR>(
729 std::get<ConstructorParameterIndex>(describeParameters<NodeT>())));
730 return std::get<PARAMETER_IS_INDEX>(param);
734template <
typename NodeT,
size_t ConstructorParameterIndex,
size_t ParamIndex>
735constexpr bool isArrayParameter()
737 constexpr auto param = dw::core::get<ParamIndex>(
738 std::get<PARAMETER_CONSTRUCTOR_ARGUMENT_DESCRIPTOR>(
739 std::get<ConstructorParameterIndex>(describeParameters<NodeT>())));
740 constexpr size_t arraySize = std::get<
742 return arraySize > 0;
746template <
typename NodeT,
size_t ConstructorParameterIndex,
size_t ParamIndex>
747constexpr bool isAbstractParameter()
749 constexpr auto param = dw::core::get<ParamIndex>(
750 std::get<PARAMETER_CONSTRUCTOR_ARGUMENT_DESCRIPTOR>(
751 std::get<ConstructorParameterIndex>(describeParameters<NodeT>())));
757 typename NodeT,
size_t ConstructorParameterIndex,
size_t ParamIndex,
typename ArgType,
758 typename std::enable_if_t<isAbstractParameter<NodeT, ConstructorParameterIndex, ParamIndex>(),
void>* =
nullptr>
763void populateParameter(
const ParameterProvider& provider, ArgType& arg)
765 static_cast<void>(arg);
766 static_cast<void>(provider);
775 typename NodeT,
size_t ConstructorParameterIndex,
size_t ParamIndex,
typename ArgType,
776 typename std::enable_if_t<!isAbstractParameter<NodeT, ConstructorParameterIndex, ParamIndex>() && !isArrayParameter<NodeT, ConstructorParameterIndex, ParamIndex>() && !isIndexParameter<NodeT, ConstructorParameterIndex, ParamIndex>(),
void>* =
nullptr>
781void populateParameter(
const ParameterProvider& provider, ArgType& arg)
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 DataType& memberPtr = getMemberPtr<0>(arg, std::get<PARAMETER_MEMBER_PTRS>(param));
795 bool hadParameter = provider.getOptional<SemanticDataType, DataType>(std::get<PARAMETER_NAME>(param), &memberPtr);
798 populateDefault(param, memberPtr);
808 typename NodeT,
size_t ConstructorParameterIndex,
size_t ParamIndex,
typename ArgType,
809 typename std::enable_if_t<!isAbstractParameter<NodeT, ConstructorParameterIndex, ParamIndex>() && !isArrayParameter<NodeT, ConstructorParameterIndex, ParamIndex>() && isIndexParameter<NodeT, ConstructorParameterIndex, ParamIndex>(),
void>* =
nullptr>
814void populateParameter(
const ParameterProvider& provider, ArgType& arg)
816 constexpr auto param = dw::core::get<ParamIndex>(
817 std::get<PARAMETER_CONSTRUCTOR_ARGUMENT_DESCRIPTOR>(
818 std::get<ConstructorParameterIndex>(describeParameters<NodeT>())));
820 using DataType = std::remove_pointer_t<
821 std::tuple_element_t<
823 using SemanticDataType = std::remove_pointer_t<
824 std::tuple_element_t<
826 DataType& memberPtr = getMemberPtr<0>(arg, std::get<PARAMETER_MEMBER_PTRS>(param));
828 size_t index =
static_cast<size_t>(-1);
829 bool hadParameter = provider.getOptional<size_t,
size_t>(std::get<PARAMETER_NAME>(param), &index);
832 hadParameter = provider.getOptional<SemanticDataType, DataType>(
"", index, &memberPtr);
836 populateDefault(param, memberPtr);
846 typename NodeT,
size_t ConstructorParameterIndex,
size_t ParamIndex,
typename ArgType,
847 typename std::enable_if_t<!isAbstractParameter<NodeT, ConstructorParameterIndex, ParamIndex>() && isArrayParameter<NodeT, ConstructorParameterIndex, ParamIndex>(),
void>* =
nullptr>
852void populateParameter(
const ParameterProvider& provider, ArgType& arg)
854 constexpr auto param = dw::core::get<ParamIndex>(
855 std::get<PARAMETER_CONSTRUCTOR_ARGUMENT_DESCRIPTOR>(
856 std::get<ConstructorParameterIndex>(describeParameters<NodeT>())));
858 using DataType = std::remove_pointer_t<
859 std::tuple_element_t<
861 using SemanticDataType = std::remove_pointer_t<
862 std::tuple_element_t<
865 constexpr size_t arraySize = std::get<PARAMETER_ARRAY_SIZE>(
868 DataType(&memberPtr)[arraySize] = getMemberPtr<0>(arg, std::get<PARAMETER_MEMBER_PTRS>(param));
869 for (
size_t i = 0; i < arraySize; ++i)
871 bool hadParameter = provider.getOptional<SemanticDataType, DataType>(std::get<PARAMETER_NAME>(param), i, &memberPtr[i]);
874 populateArrayDefault(param, memberPtr, i);
881 typename NodeT,
size_t ConstructorParameterIndex,
size_t ParamIndex,
typename ArgType,
882 typename std::enable_if_t<ParamIndex<constructorArgumentParameterSize<NodeT, ConstructorParameterIndex>(),
void>* =
nullptr>
887 void populateParametersRecursion(
const ParameterProvider& provider, ArgType& arg)
889 populateParameter<NodeT, ConstructorParameterIndex, ParamIndex>(provider, arg);
891 populateParametersRecursion<NodeT, ConstructorParameterIndex, ParamIndex + 1>(provider, arg);
899template <
typename NodeT,
size_t ConstructorParameterIndex,
typename ArgType>
908 populateParametersRecursion<NodeT, ConstructorParameterIndex, 0>(provider, arg);
912 throw Exception(e.status(),
"Exception while populating parameters of mangled node type ",
typeid(NodeT).name(),
": ", e.messageStr());
921 class ConstructorArguments,
922 typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 1,
void>* =
nullptr>
929 auto& arg0 = std::get<0>(constructorArguments);
930 detail::populateParameters<NodeT, 0>(arg0, provider);
936 class ConstructorArguments,
937 typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 2,
void>* =
nullptr>
942void populateParameters(ConstructorArguments& constructorArguments,
const ParameterProvider& provider)
944 auto& arg0 = std::get<0>(constructorArguments);
945 detail::populateParameters<NodeT, 0>(provider, arg0);
946 auto& arg1 = std::get<1>(constructorArguments);
947 detail::populateParameters<NodeT, 1>(provider, arg1);
953 class ConstructorArguments,
954 typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 3,
void>* =
nullptr>
959void populateParameters(ConstructorArguments& constructorArguments,
const ParameterProvider& provider)
961 auto& arg0 = std::get<0>(constructorArguments);
962 detail::populateParameters<NodeT, 0>(provider, arg0);
963 auto& arg1 = std::get<1>(constructorArguments);
964 detail::populateParameters<NodeT, 1>(provider, arg1);
965 auto& arg2 = std::get<2>(constructorArguments);
966 detail::populateParameters<NodeT, 2>(provider, arg2);
972 class ConstructorArguments,
973 typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 4,
void>* =
nullptr>
978void populateParameters(ConstructorArguments& constructorArguments,
const ParameterProvider& provider)
980 auto& arg0 = std::get<0>(constructorArguments);
981 detail::populateParameters<NodeT, 0>(provider, arg0);
982 auto& arg1 = std::get<1>(constructorArguments);
983 detail::populateParameters<NodeT, 1>(provider, arg1);
984 auto& arg2 = std::get<2>(constructorArguments);
985 detail::populateParameters<NodeT, 2>(provider, arg2);
986 auto& arg3 = std::get<3>(constructorArguments);
987 detail::populateParameters<NodeT, 3>(provider, arg3);
993 class ConstructorArguments,
994 typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 5,
void>* =
nullptr>
999void populateParameters(ConstructorArguments& constructorArguments,
const ParameterProvider& provider)
1001 auto& arg0 = std::get<0>(constructorArguments);
1002 detail::populateParameters<NodeT, 0>(provider, arg0);
1003 auto& arg1 = std::get<1>(constructorArguments);
1004 detail::populateParameters<NodeT, 1>(provider, arg1);
1005 auto& arg2 = std::get<2>(constructorArguments);
1006 detail::populateParameters<NodeT, 2>(provider, arg2);
1007 auto& arg3 = std::get<3>(constructorArguments);
1008 detail::populateParameters<NodeT, 3>(provider, arg3);
1009 auto& arg4 = std::get<4>(constructorArguments);
1010 detail::populateParameters<NodeT, 4>(provider, arg4);
1017template <
typename NodeT>
1018constexpr std::size_t parameterConstructorArgumentSize()
1020 return std::tuple_size<decltype(describeParameters<NodeT>())>::value;
1025 typename NodeT,
size_t ConstructorArgumentIndex,
1026 typename std::enable_if_t<ConstructorArgumentIndex == parameterConstructorArgumentSize<NodeT>(),
void>* =
nullptr>
1031 return std::make_tuple();
1036 typename NodeT,
size_t ConstructorArgumentIndex,
1037 typename std::enable_if_t<ConstructorArgumentIndex<parameterConstructorArgumentSize<NodeT>(),
void>* =
nullptr>
1042 using NodeParams =
decltype(describeParameters<NodeT>());
1044 using ConstructorParameter = std::tuple_element_t<ConstructorArgumentIndex, NodeParams>;
1045 using ArgType = std::remove_pointer_t<
1046 typename std::tuple_element_t<PARAMETER_CONSTRUCTOR_ARGUMENT_TYPE, ConstructorParameter>>;
1049 return std::tuple_cat(std::make_tuple(arg), createConstructorArguments<NodeT, ConstructorArgumentIndex + 1>());
1055template <
typename NodeT>
1058 return detail::createConstructorArguments<NodeT, 0>();
1065template <
class T,
class Tuple,
size_t... Is>
1068auto makeUniqueFromTuple(
const Tuple&& tuple, std::index_sequence<Is...>) -> std::unique_ptr<T>
1070 return std::unique_ptr<T>(
new T{std::get<Is>(std::move(tuple))...});
1075template <
typename NodeT,
class ConstructorArguments>
1078 return detail::makeUniqueFromTuple<NodeT>(
1079 std::move(constructorArguments),
1080 std::make_index_sequence<std::tuple_size<std::decay_t<ConstructorArguments>>::value>{});
1091template <
typename NodeT>
1094 auto constructorArguments = createConstructorArguments<NodeT>();
1095 populateParameters<NodeT>(constructorArguments, provider);
1096 return makeUniqueFromTuple<NodeT>(std::move(constructorArguments));
1105 typename NodeT,
size_t ConstructorArgumentIndex,
1106 typename std::enable_if_t<ConstructorArgumentIndex == parameterConstructorArgumentSize<NodeT>(),
void>* =
nullptr>
1116 typename NodeT,
size_t ConstructorArgumentIndex,
1117 typename std::enable_if_t<ConstructorArgumentIndex<parameterConstructorArgumentSize<NodeT>(),
void>* =
nullptr>
1122 return constructorArgumentParameterSize<NodeT, ConstructorArgumentIndex>() + parameterSize<NodeT, ConstructorArgumentIndex + 1>();
1130template <
typename NodeT>
1133 return detail::parameterSize<NodeT, 0>();
The interface to access parameter values identified by name and/or (semantic) type.
constexpr auto describeArrayParameterWithDefault(dw::core::StringView const &&typeName, dw::core::StringView const &¶meterName, std::array< T, ArraySize > defaultValue, const MemberPointers &&... memberPointers)
constexpr auto describeAbstractParameter(dw::core::StringView const &&typeName, dw::core::StringView const &¶meterName)
static constexpr size_t PARAMETER_SEMANTIC_TYPE
auto makeUniqueFromTuple(const ConstructorArguments &&constructorArguments) -> std::unique_ptr< NodeT >
Instantiate a node using the passed constructor arguments.
static constexpr size_t PARAMETER_DEFAULT_VALUE
constexpr std::tuple describeConstructorArguments()
constexpr auto describeUnnamedArrayParameter(dw::core::StringView const &&typeName, size_t arraySize, const MemberPointers &&... memberPointers)
static constexpr size_t PARAMETER_MEMBER_PTRS
static constexpr size_t PARAMETER_NAME
constexpr auto describeUnnamedParameter(dw::core::StringView const &&typeName, const MemberPointers &&... memberPointers)
static constexpr size_t PARAMETER_CONSTRUCTOR_ARGUMENT_DESCRIPTOR
constexpr auto describeIndexParameter(dw::core::StringView const &&typeName, dw::core::StringView const &¶meterName, const MemberPointers &&... memberPointers)
auto createConstructorArguments()
Create a tuple of constructor argument needed by the constructor of the passed node.
static constexpr size_t PARAMETER_ARRAY_SIZE
constexpr auto describeParameter(dw::core::StringView const &&typeName, dw::core::StringView const &¶meterName, const MemberPointers &&... memberPointers)
constexpr auto describeAbstractArrayParameter(dw::core::StringView const &&typeName, dw::core::StringView const &¶meterName, size_t arraySize)
void populateParameters(ConstructorArguments &constructorArguments, const ParameterProvider &provider)
Populate the constructor arguments using values from the parameter provider.
constexpr auto describeParameters()
Get described parameters for the passed node.
static constexpr size_t PARAMETER_IS_INDEX
constexpr auto describeConstructorArgument(const Args &&... args)
constexpr std::size_t parameterSize()
Get the number of parameters for a given node.
constexpr auto describeArrayParameter(dw::core::StringView const &&typeName, dw::core::StringView const &¶meterName, size_t arraySize, const MemberPointers &&... memberPointers)
constexpr auto describeParameterWithDefault(dw::core::StringView const &&typeName, dw::core::StringView const &¶meterName, T defaultValue, const MemberPointers &&... memberPointers)
auto create(const ParameterProvider &provider) -> std::unique_ptr< NodeT >
static constexpr size_t PARAMETER_TYPE
static constexpr size_t PARAMETER_TYPE_NAME
static constexpr size_t PARAMETER_CONSTRUCTOR_ARGUMENT_TYPE