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>
61 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>
94constexpr auto describeConstructorArguments(
const Arg1&& arg1,
const Arg2&& arg2) -> std::tuple<std::tuple<Argument1T*, Arg1>, std::tuple<Argument2T*, Arg2>>
96 return std::make_tuple(
98 static_cast<Argument1T*
>(
nullptr),
99 std::forward<const Arg1>(arg1)),
101 static_cast<Argument2T*
>(
nullptr),
102 std::forward<const Arg2>(arg2)));
112 typename Argument1T,
typename Argument2T,
typename Argument3T,
113 typename Arg1,
typename Arg2,
typename Arg3>
118 return std::make_tuple(
120 static_cast<Argument1T*
>(
nullptr),
121 std::forward<const Arg1>(arg1)),
123 static_cast<Argument2T*
>(
nullptr),
124 std::forward<const Arg2>(arg2)),
126 static_cast<Argument3T*
>(
nullptr),
127 std::forward<const Arg3>(arg3)));
137 typename Argument1T,
typename Argument2T,
typename Argument3T,
typename Argument4T,
138 typename Arg1,
typename Arg2,
typename Arg3,
typename Arg4>
143 return std::make_tuple(
145 static_cast<Argument1T*
>(
nullptr),
146 std::forward<const Arg1>(arg1)),
148 static_cast<Argument2T*
>(
nullptr),
149 std::forward<const Arg2>(arg2)),
151 static_cast<Argument3T*
>(
nullptr),
152 std::forward<const Arg3>(arg3)),
154 static_cast<Argument4T*
>(
nullptr),
155 std::forward<const Arg4>(arg4)));
165 typename Argument1T,
typename Argument2T,
typename Argument3T,
typename Argument4T,
typename Argument5T,
166 typename Arg1,
typename Arg2,
typename Arg3,
typename Arg4,
typename Arg5>
171 return std::make_tuple(
173 static_cast<Argument1T*
>(
nullptr),
174 std::forward<const Arg1>(arg1)),
176 static_cast<Argument2T*
>(
nullptr),
177 std::forward<const Arg2>(arg2)),
179 static_cast<Argument3T*
>(
nullptr),
180 std::forward<const Arg3>(arg3)),
182 static_cast<Argument4T*
>(
nullptr),
183 std::forward<const Arg4>(arg4)),
185 static_cast<Argument5T*
>(
nullptr),
186 std::forward<const Arg5>(arg5)));
196 typename Argument1T,
typename Argument2T,
typename Argument3T,
typename Argument4T,
typename Argument5T,
typename Argument6T,
197 typename Arg1,
typename Arg2,
typename Arg3,
typename Arg4,
typename Arg5,
typename Arg6>
200constexpr auto describeConstructorArguments(
const Arg1&& arg1,
const Arg2&& arg2,
const Arg3&& arg3,
const Arg4&& arg4,
const Arg5&& arg5,
const Arg6&& arg6)
202 return std::make_tuple(
204 static_cast<Argument1T*
>(
nullptr),
205 std::forward<const Arg1>(arg1)),
207 static_cast<Argument2T*
>(
nullptr),
208 std::forward<const Arg2>(arg2)),
210 static_cast<Argument3T*
>(
nullptr),
211 std::forward<const Arg3>(arg3)),
213 static_cast<Argument4T*
>(
nullptr),
214 std::forward<const Arg4>(arg4)),
216 static_cast<Argument5T*
>(
nullptr),
217 std::forward<const Arg5>(arg5)),
219 static_cast<Argument6T*
>(
nullptr),
220 std::forward<const Arg6>(arg6)));
229template <
typename... Args>
233 return dw::core::make_tuple(
234 std::forward<const Args>(args)...);
238template <
typename Type_,
typename SemanticType_,
bool IsIndex,
size_t ArraySize,
bool IsAbstract,
bool HasDefault,
typename... MemberPointers>
255 constexpr ParameterDescriptorT(dw::core::StringView
const&& typeName_, dw::core::StringView
const&& parameterName_,
const MemberPointers&&... memberPointers_)
258 ,
memberPointers(std::make_tuple<const MemberPointers...>(std::forward<const MemberPointers>(memberPointers_)...))
263template <
typename Type_,
typename SemanticType_,
bool IsIndex,
size_t ArraySize,
bool IsAbstract,
bool HasDefault,
typename... MemberPointers>
264constexpr bool ParameterDescriptorT<Type_, SemanticType_, IsIndex, ArraySize, IsAbstract, HasDefault, MemberPointers...>::IS_INDEX;
266template <
typename Type_,
typename SemanticType_,
bool IsIndex,
size_t ArraySize,
bool IsAbstract,
bool HasDefault,
typename... MemberPointers>
267constexpr size_t ParameterDescriptorT<Type_, SemanticType_, IsIndex, ArraySize, IsAbstract, HasDefault, MemberPointers...>::ARRAY_SIZE;
269template <
typename Type_,
typename SemanticType_,
bool IsIndex,
size_t ArraySize,
bool IsAbstract,
bool HasDefault,
typename... MemberPointers>
270constexpr bool ParameterDescriptorT<Type_, SemanticType_, IsIndex, ArraySize, IsAbstract, HasDefault, MemberPointers...>::HAS_DEFAULT;
273template <
typename Type,
typename SemanticType,
bool IsIndex,
size_t ArraySize,
bool IsAbstract,
typename DefaultType,
typename... MemberPointers>
278 constexpr ParameterDescriptorWithDefaultT(dw::core::StringView
const&& typeName_, dw::core::StringView
const&& parameterName_,
const DefaultType&& defaultValue_,
const MemberPointers&&... memberPointers_)
279 :
ParameterDescriptorT<
Type,
SemanticType, IsIndex, ArraySize, IsAbstract, true, MemberPointers...>{std::move(typeName_), std::move(parameterName_), std::forward<const MemberPointers>(memberPointers_)...}
288#define DW_PARAMETER_TYPE_NAME_STRING_VIEW(TYPE_NAME_STR) TYPE_NAME_STR##_sv
289#define DW_DESCRIBE_PARAMETER(TYPE_NAME, args...) dw::framework::describeParameter<TYPE_NAME, TYPE_NAME>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(#TYPE_NAME), ##args)
290#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)
305template <
typename T,
typename S,
typename... MemberPointers>
308 dw::core::StringView
const&& typeName, dw::core::StringView
const&& parameterName,
const MemberPointers&&... memberPointers) ->
ParameterDescriptorT<T, S,
false, 0,
false,
false, MemberPointers...>
312 std::move(parameterName),
313 std::forward<const MemberPointers>(memberPointers)...);
319#define DW_DESCRIBE_ABSTRACT_PARAMETER(TYPE_NAME, args...) dw::framework::describeAbstractParameter<TYPE_NAME>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(#TYPE_NAME), ##args)
320#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)
334 dw::core::StringView
const&& typeName, dw::core::StringView
const&& parameterName)
338 std::move(parameterName));
346template <
typename T,
size_t ArraySize>
348 dw::core::StringView
const&& typeName, dw::core::StringView
const&& parameterName)
352 std::move(parameterName));
358#define DW_DESCRIBE_INDEX_PARAMETER(TYPE_NAME, args...) dw::framework::describeIndexParameter<TYPE_NAME, TYPE_NAME>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(#TYPE_NAME), ##args)
359#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)
372template <
typename T,
typename S,
typename... MemberPointers>
374 dw::core::StringView
const&& typeName, dw::core::StringView
const&& parameterName,
const MemberPointers&&... memberPointers)
378 std::move(parameterName),
379 std::forward<const MemberPointers>(memberPointers)...);
385#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)
386#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)
398template <
typename T,
typename S,
size_t ArraySize,
typename... MemberPointers>
400 dw::core::StringView
const&& typeName, dw::core::StringView
const&& parameterName,
const MemberPointers&&... memberPointers)
404 std::move(parameterName),
405 std::forward<const MemberPointers>(memberPointers)...);
411#define DW_DESCRIBE_UNNAMED_PARAMETER(TYPE_NAME, args...) dw::framework::describeUnnamedParameter<TYPE_NAME, TYPE_NAME>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(#TYPE_NAME), ##args)
412#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)
425template <
typename T,
typename S,
typename... MemberPointers>
428 dw::core::StringView
const&& typeName,
const MemberPointers&&... memberPointers) ->
ParameterDescriptorT<T, S,
false, 0,
false,
false, MemberPointers...>
436 std::forward<const MemberPointers>(memberPointers)...);
442#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)
443#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)
456template <
typename T,
typename S,
size_t ArraySize,
typename... MemberPointers>
458 dw::core::StringView
const&& typeName,
const MemberPointers&&... memberPointers)
460 return describeArrayParameter<T, S, ArraySize>(
463 std::forward<const MemberPointers>(memberPointers)...);
469#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)
481template <
typename T,
typename S,
typename... MemberPointers>
484 dw::core::StringView
const&& typeName, dw::core::StringView
const&& parameterName, T defaultValue,
const MemberPointers&&... memberPointers) ->
ParameterDescriptorWithDefaultT<T, S,
false, 0,
false, T, MemberPointers...>
488 std::move(parameterName),
489 std::move(defaultValue),
490 std::forward<const MemberPointers>(memberPointers)...);
496#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)
508template <
typename T,
typename S,
size_t ArraySize,
typename... MemberPointers>
510 dw::core::StringView
const&& typeName, dw::core::StringView
const&& parameterName, std::array<T, ArraySize> defaultValue,
const MemberPointers&&... memberPointers)
514 std::move(parameterName),
515 std::move(defaultValue),
516 std::forward<const MemberPointers>(memberPointers)...);
520template <
typename NodeT>
533 typename Param,
typename MemberPtr,
534 typename std::enable_if_t<!Param::HAS_DEFAULT, void>* =
nullptr>
536void populateDefault(
const Param& param, MemberPtr& memberPtr)
538 static_cast<void>(param);
539 static_cast<void>(memberPtr);
544 typename Param,
typename MemberPtr,
545 typename std::enable_if_t<Param::HAS_DEFAULT, void>* =
nullptr>
547void populateDefault(
const Param& param, MemberPtr& memberPtr)
549 memberPtr = param.defaultValue;
554 typename Param,
typename MemberPtr,
555 typename std::enable_if_t<!Param::HAS_DEFAULT, void>* =
nullptr>
557void populateArrayDefault(
const Param& param, MemberPtr& memberPtr,
size_t index)
559 static_cast<void>(param);
560 static_cast<void>(memberPtr);
561 static_cast<void>(index);
566 typename Param,
typename MemberPtr,
567 typename std::enable_if_t<Param::HAS_DEFAULT, void>* =
nullptr>
569void populateArrayDefault(
const Param& param, MemberPtr& memberPtr,
size_t index)
571 memberPtr[index] = param.defaultValue[index];
576 size_t MemberIndex,
typename ArgType,
typename MemberPtrs,
577 typename std::enable_if_t<std::tuple_size<MemberPtrs>() == 0,
void>* =
nullptr>
579auto getMemberPtr(ArgType& arg, MemberPtrs memberPtrs) -> ArgType&
581 static_cast<void>(memberPtrs);
587 size_t MemberIndex,
typename ArgType,
typename MemberPtrs,
588 typename std::enable_if_t<MemberIndex + 1 == std::tuple_size<MemberPtrs>(),
void>* =
nullptr>
591auto& getMemberPtr(ArgType& arg, MemberPtrs memberPtrs)
594 auto member = std::get<MemberIndex>(memberPtrs);
600 size_t MemberIndex,
typename ArgType,
typename MemberPtrs,
601 typename std::enable_if_t<MemberIndex + 1 < std::tuple_size<MemberPtrs>(),
void>* =
nullptr>
603auto& getMemberPtr(ArgType& arg, MemberPtrs memberPtrs)
605 auto& member = std::get<MemberIndex>(memberPtrs);
606 auto& m = arg.*member;
607 return getMemberPtr<MemberIndex + 1>(m, memberPtrs);
611template <
typename NodeT,
size_t ConstructorParameterIndex>
613constexpr size_t constructorArgumentParameterSize()
616 return dw::core::tuple_size<
617 std::tuple_element_t<
619 std::tuple_element_t<
620 ConstructorParameterIndex,
621 decltype(describeParameters<NodeT>())>>>();
625template <
typename ParamT>
627constexpr bool isIndexParameter()
629 return ParamT::IS_INDEX;
633template <
typename ParamT>
635constexpr bool isArrayParameter()
638 return ParamT::ARRAY_SIZE > 0U;
642template <
typename ParamT>
644constexpr bool isAbstractParameter()
646 return ParamT::IS_ABSTRACT;
651 typename ArgType,
typename ParamT,
652 typename std::enable_if_t<isAbstractParameter<ParamT>(),
void>* =
nullptr>
654void populateParameter(
const ParameterProvider& provider, ArgType& arg,
const ParamT& param)
656 static_cast<void>(provider);
657 static_cast<void>(arg);
658 static_cast<void>(param);
667 typename ArgType,
typename ParamT,
668 typename std::enable_if_t<!isAbstractParameter<ParamT>() && !isArrayParameter<ParamT>() && !isIndexParameter<ParamT>(),
void>* =
nullptr>
670void populateParameter(
const ParameterProvider& provider, ArgType& arg,
const ParamT& param)
672 using DataType =
typename ParamT::Type;
673 using SemanticDataType =
typename ParamT::SemanticType;
674 DataType& memberPtr{getMemberPtr<0>(arg, param.memberPointers)};
675 bool hadParameter{provider.getOptional<SemanticDataType, DataType>(param.parameterName, &memberPtr)};
678 populateDefault(param, memberPtr);
688 typename ArgType,
typename ParamT,
689 typename std::enable_if_t<!isAbstractParameter<ParamT>() && !isArrayParameter<ParamT>() && isIndexParameter<ParamT>(),
void>* =
nullptr>
691void populateParameter(
const ParameterProvider& provider, ArgType& arg,
const ParamT& param)
693 using DataType =
typename ParamT::Type;
694 using SemanticDataType =
typename ParamT::SemanticType;
695 DataType& memberPtr = getMemberPtr<0>(arg, param.memberPointers);
697 size_t index =
static_cast<size_t>(-1);
698 bool hadParameter = provider.getOptional<size_t,
size_t>(param.parameterName, &index);
701 hadParameter = provider.getOptional<SemanticDataType, DataType>(
"", index, &memberPtr);
705 populateDefault(param, memberPtr);
715 typename ArgType,
typename ParamT,
716 typename std::enable_if_t<!isAbstractParameter<ParamT>() && isArrayParameter<ParamT>(),
void>* =
nullptr>
718void populateParameter(
const ParameterProvider& provider, ArgType& arg,
const ParamT& param)
720 using DataType =
typename ParamT::Type;
721 using SemanticDataType =
typename ParamT::SemanticType;
723 constexpr size_t arraySize = ParamT::ARRAY_SIZE;
725 DataType(&memberPtr)[arraySize] = getMemberPtr<0>(arg, param.memberPointers);
726 for (
size_t i = 0; i < arraySize; ++i)
728 bool hadParameter = provider.getOptional<SemanticDataType, DataType>(param.parameterName, i, &memberPtr[i]);
731 populateArrayDefault(param, memberPtr, i);
737template <
typename ArgType>
739void populateParametersRecursion(
const ParameterProvider& provider, ArgType& arg,
const dw::core::Tuple<>& t)
741 static_cast<void>(provider);
742 static_cast<void>(arg);
743 static_cast<void>(t);
747template <
typename ArgType,
typename THead>
749void populateParametersRecursion(
const ParameterProvider& provider, ArgType& arg,
const dw::core::Tuple<THead>& t)
751 populateParameter(provider, arg, t.m_head);
756 typename ArgType,
typename THead,
typename... TTail,
757 typename std::enable_if_t<
sizeof...(TTail) != 0>* =
nullptr>
759void populateParametersRecursion(
const ParameterProvider& provider, ArgType& arg,
const dw::core::Tuple<THead, TTail...>& t)
761 populateParameter(provider, arg, t.m_head);
762 populateParametersRecursion(provider, arg, t.m_tail);
770template <
typename NodeT,
size_t ConstructorParameterIndex,
typename ConstructorArgsType>
773void populateParameters(
const ParameterProvider& provider, ConstructorArgsType& constructorArguments)
778 auto& arg = std::get<ConstructorParameterIndex>(constructorArguments);
780 constexpr auto params = std::get<dw::framework::PARAMETER_CONSTRUCTOR_ARGUMENT_DESCRIPTOR>(
781 std::get<ConstructorParameterIndex>(describeParameters<NodeT>()));
783 populateParametersRecursion(provider, arg, params);
785 catch (ExceptionWithStatus& e)
787 throw ExceptionWithStatus(e.statusCode(),
"Exception while populating parameters of mangled node type ",
typeid(NodeT).name(),
": ", e.message());
796 class ConstructorArguments,
797 typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 1,
void>* =
nullptr>
801 detail::populateParameters<NodeT, 0>(provider, constructorArguments);
807 class ConstructorArguments,
808 typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 2,
void>* =
nullptr>
810void populateParameters(ConstructorArguments& constructorArguments,
const ParameterProvider& provider)
812 detail::populateParameters<NodeT, 0>(provider, constructorArguments);
813 detail::populateParameters<NodeT, 1>(provider, constructorArguments);
819 class ConstructorArguments,
820 typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 3,
void>* =
nullptr>
822void populateParameters(ConstructorArguments& constructorArguments,
const ParameterProvider& provider)
824 detail::populateParameters<NodeT, 0>(provider, constructorArguments);
825 detail::populateParameters<NodeT, 1>(provider, constructorArguments);
826 detail::populateParameters<NodeT, 2>(provider, constructorArguments);
832 class ConstructorArguments,
833 typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 4,
void>* =
nullptr>
835void populateParameters(ConstructorArguments& constructorArguments,
const ParameterProvider& provider)
837 detail::populateParameters<NodeT, 0>(provider, constructorArguments);
838 detail::populateParameters<NodeT, 1>(provider, constructorArguments);
839 detail::populateParameters<NodeT, 2>(provider, constructorArguments);
840 detail::populateParameters<NodeT, 3>(provider, constructorArguments);
846 class ConstructorArguments,
847 typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 5,
void>* =
nullptr>
849void populateParameters(ConstructorArguments& constructorArguments,
const ParameterProvider& provider)
851 detail::populateParameters<NodeT, 0>(provider, constructorArguments);
852 detail::populateParameters<NodeT, 1>(provider, constructorArguments);
853 detail::populateParameters<NodeT, 2>(provider, constructorArguments);
854 detail::populateParameters<NodeT, 3>(provider, constructorArguments);
855 detail::populateParameters<NodeT, 4>(provider, constructorArguments);
861 class ConstructorArguments,
862 typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 6,
void>* =
nullptr>
865void populateParameters(ConstructorArguments& constructorArguments,
const ParameterProvider& provider)
867 detail::populateParameters<NodeT, 0>(provider, constructorArguments);
868 detail::populateParameters<NodeT, 1>(provider, constructorArguments);
869 detail::populateParameters<NodeT, 2>(provider, constructorArguments);
870 detail::populateParameters<NodeT, 3>(provider, constructorArguments);
871 detail::populateParameters<NodeT, 4>(provider, constructorArguments);
872 detail::populateParameters<NodeT, 5>(provider, constructorArguments);
879template <
typename NodeT>
881constexpr std::size_t parameterConstructorArgumentSize()
883 return std::tuple_size<decltype(describeParameters<NodeT>())>::value;
888 typename NodeT,
size_t ConstructorArgumentIndex,
889 typename std::enable_if_t<ConstructorArgumentIndex == parameterConstructorArgumentSize<NodeT>(),
void>* =
nullptr>
894 return std::make_tuple();
899 typename NodeT,
size_t ConstructorArgumentIndex,
900 typename std::enable_if_t<ConstructorArgumentIndex<parameterConstructorArgumentSize<NodeT>(),
void>* =
nullptr>
905 using NodeParams =
decltype(describeParameters<NodeT>());
907 using ConstructorParameter = std::tuple_element_t<ConstructorArgumentIndex, NodeParams>;
908 using ArgType = std::remove_pointer_t<
909 typename std::tuple_element_t<PARAMETER_CONSTRUCTOR_ARGUMENT_TYPE, ConstructorParameter>>;
912 return std::tuple_cat(std::make_tuple(arg), createConstructorArguments<NodeT, ConstructorArgumentIndex + 1>());
918template <
typename NodeT>
923 return detail::createConstructorArguments<NodeT, 0>();
930template <
class T,
class Tuple,
size_t... Is>
932auto makeUniqueFromTuple(
const Tuple&& tuple, std::index_sequence<Is...>) -> std::unique_ptr<T>
935 return std::make_unique<T>(std::get<Is>(std::move(tuple))...);
940template <
typename NodeT,
class ConstructorArguments>
944 return detail::makeUniqueFromTuple<NodeT>(
945 std::move(constructorArguments),
946 std::make_index_sequence<std::tuple_size<std::decay_t<ConstructorArguments>>::value>{});
957template <
typename NodeT>
962 auto constructorArguments = createConstructorArguments<NodeT>();
963 populateParameters<NodeT>(constructorArguments, provider);
964 return makeUniqueFromTuple<NodeT>(std::move(constructorArguments));
973 typename NodeT,
size_t ConstructorArgumentIndex,
974 typename std::enable_if_t<ConstructorArgumentIndex == parameterConstructorArgumentSize<NodeT>(),
void>* =
nullptr>
984 typename NodeT,
size_t ConstructorArgumentIndex,
985 typename std::enable_if_t<ConstructorArgumentIndex<parameterConstructorArgumentSize<NodeT>(),
void>* =
nullptr>
989 return constructorArgumentParameterSize<NodeT, ConstructorArgumentIndex>() + parameterSize<NodeT, ConstructorArgumentIndex + 1>();
995template <
typename NodeT>
999 return detail::parameterSize<NodeT, 0>();
The interface to access parameter values identified by name and/or (semantic) type.
constexpr auto describeArrayParameter(dw::core::StringView const &&typeName, dw::core::StringView const &¶meterName, const MemberPointers &&... memberPointers)
constexpr auto describeArrayParameterWithDefault(dw::core::StringView const &&typeName, dw::core::StringView const &¶meterName, std::array< T, ArraySize > defaultValue, const MemberPointers &&... memberPointers)
constexpr auto describeUnnamedParameter(dw::core::StringView const &&typeName, const MemberPointers &&... memberPointers) -> ParameterDescriptorT< T, S, false, 0, false, false, MemberPointers... >
constexpr auto describeUnnamedArrayParameter(dw::core::StringView const &&typeName, const MemberPointers &&... memberPointers)
constexpr auto describeAbstractParameter(dw::core::StringView const &&typeName, dw::core::StringView const &¶meterName)
auto makeUniqueFromTuple(const ConstructorArguments &&constructorArguments) -> std::unique_ptr< NodeT >
Instantiate a node using the passed constructor arguments.
constexpr auto describeParameter(dw::core::StringView const &&typeName, dw::core::StringView const &¶meterName, const MemberPointers &&... memberPointers) -> ParameterDescriptorT< T, S, false, 0, false, false, MemberPointers... >
constexpr std::tuple describeConstructorArguments()
constexpr auto describeConstructorArgument(const Args &&... args) -> dw::core::Tuple< Args... >
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.
void populateParameters(ConstructorArguments &constructorArguments, const ParameterProvider &provider)
Populate the constructor arguments using values from the parameter provider.
constexpr auto describeParameterWithDefault(dw::core::StringView const &&typeName, dw::core::StringView const &¶meterName, T defaultValue, const MemberPointers &&... memberPointers) -> ParameterDescriptorWithDefaultT< T, S, false, 0, false, T, MemberPointers... >
constexpr auto describeParameters()
Get described parameters for the passed node.
constexpr std::size_t parameterSize()
Get the number of parameters for a given node.
auto create(const ParameterProvider &provider) -> std::unique_ptr< NodeT >
static constexpr const size_t PARAMETER_CONSTRUCTOR_ARGUMENT_TYPE
constexpr auto describeAbstractArrayParameter(dw::core::StringView const &&typeName, dw::core::StringView const &¶meterName)
static constexpr const size_t PARAMETER_CONSTRUCTOR_ARGUMENT_DESCRIPTOR
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
constexpr ParameterDescriptorT(dw::core::StringView const &&typeName_, dw::core::StringView const &¶meterName_, const MemberPointers &&... memberPointers_)
static constexpr bool IS_ABSTRACT
dw::core::StringView parameterName
SemanticType_ SemanticType
constexpr ParameterDescriptorWithDefaultT(dw::core::StringView const &&typeName_, dw::core::StringView const &¶meterName_, const DefaultType &&defaultValue_, const MemberPointers &&... memberPointers_)