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();
76 return std::make_tuple(
78 static_cast<Argument1T*
>(
nullptr),
79 std::forward<const Arg1>(arg1)));
89 typename Argument1T,
typename Argument2T,
90 typename Arg1,
typename Arg2>
95 return std::make_tuple(
97 static_cast<Argument1T*
>(
nullptr),
98 std::forward<const Arg1>(arg1)),
100 static_cast<Argument2T*
>(
nullptr),
101 std::forward<const Arg2>(arg2)));
111 typename Argument1T,
typename Argument2T,
typename Argument3T,
112 typename Arg1,
typename Arg2,
typename Arg3>
117 return std::make_tuple(
119 static_cast<Argument1T*
>(
nullptr),
120 std::forward<const Arg1>(arg1)),
122 static_cast<Argument2T*
>(
nullptr),
123 std::forward<const Arg2>(arg2)),
125 static_cast<Argument3T*
>(
nullptr),
126 std::forward<const Arg3>(arg3)));
136 typename Argument1T,
typename Argument2T,
typename Argument3T,
typename Argument4T,
137 typename Arg1,
typename Arg2,
typename Arg3,
typename Arg4>
142 return std::make_tuple(
144 static_cast<Argument1T*
>(
nullptr),
145 std::forward<const Arg1>(arg1)),
147 static_cast<Argument2T*
>(
nullptr),
148 std::forward<const Arg2>(arg2)),
150 static_cast<Argument3T*
>(
nullptr),
151 std::forward<const Arg3>(arg3)),
153 static_cast<Argument4T*
>(
nullptr),
154 std::forward<const Arg4>(arg4)));
164 typename Argument1T,
typename Argument2T,
typename Argument3T,
typename Argument4T,
typename Argument5T,
165 typename Arg1,
typename Arg2,
typename Arg3,
typename Arg4,
typename Arg5>
170 return std::make_tuple(
172 static_cast<Argument1T*
>(
nullptr),
173 std::forward<const Arg1>(arg1)),
175 static_cast<Argument2T*
>(
nullptr),
176 std::forward<const Arg2>(arg2)),
178 static_cast<Argument3T*
>(
nullptr),
179 std::forward<const Arg3>(arg3)),
181 static_cast<Argument4T*
>(
nullptr),
182 std::forward<const Arg4>(arg4)),
184 static_cast<Argument5T*
>(
nullptr),
185 std::forward<const Arg5>(arg5)));
194template <
typename... Args>
197 return dw::core::make_tuple(
198 std::forward<const Args>(args)...);
230#define DW_PARAMETER_TYPE_NAME_STRING_VIEW(TYPE_NAME_STR) TYPE_NAME_STR##_sv
231#define DW_DESCRIBE_PARAMETER(TYPE_NAME, args...) dw::framework::describeParameter<TYPE_NAME, TYPE_NAME>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(#TYPE_NAME), ##args)
232#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)
247template <
typename T,
typename S,
typename... MemberPointers>
249 dw::core::StringView
const&& typeName, dw::core::StringView
const&& parameterName,
const MemberPointers&&... memberPointers)
251 return std::make_tuple(
253 std::move(parameterName),
254 static_cast<T*
>(
nullptr),
255 static_cast<S*
>(
nullptr),
257 static_cast<size_t>(0),
259 std::make_tuple<const MemberPointers...>(std::forward<const MemberPointers>(memberPointers)...)));
265#define DW_DESCRIBE_ABSTRACT_PARAMETER(TYPE_NAME, args...) dw::framework::describeAbstractParameter<TYPE_NAME>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(#TYPE_NAME), ##args)
266#define DW_DESCRIBE_ABSTRACT_ARRAY_PARAMETER(TYPE_NAME, args...) dw::framework::describeAbstractArrayParameter<TYPE_NAME>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(#TYPE_NAME), ##args)
280 dw::core::StringView
const&& typeName, dw::core::StringView
const&& parameterName)
282 return std::make_tuple(
284 std::move(parameterName),
285 static_cast<T*
>(
nullptr),
286 static_cast<T*
>(
nullptr),
288 static_cast<size_t>(0));
298 dw::core::StringView
const&& typeName, dw::core::StringView
const&& parameterName,
size_t arraySize)
300 return std::make_tuple(
302 std::move(parameterName),
303 static_cast<T*
>(
nullptr),
304 static_cast<T*
>(
nullptr),
312#define DW_DESCRIBE_INDEX_PARAMETER(TYPE_NAME, args...) dw::framework::describeIndexParameter<TYPE_NAME, TYPE_NAME>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(#TYPE_NAME), ##args)
313#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)
326template <
typename T,
typename S,
typename... MemberPointers>
328 dw::core::StringView
const&& typeName, dw::core::StringView
const&& parameterName,
const MemberPointers&&... memberPointers)
330 return std::make_tuple(
332 std::move(parameterName),
333 static_cast<T*
>(
nullptr),
334 static_cast<S*
>(
nullptr),
336 static_cast<size_t>(0),
338 std::make_tuple<const MemberPointers...>(std::forward<const MemberPointers>(memberPointers)...)));
344#define DW_DESCRIBE_ARRAY_PARAMETER(TYPE_NAME, args...) dw::framework::describeArrayParameter<TYPE_NAME, TYPE_NAME>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(#TYPE_NAME), ##args)
345#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)
357template <
typename T,
typename S,
typename... MemberPointers>
359 dw::core::StringView
const&& typeName, dw::core::StringView
const&& parameterName,
size_t arraySize,
const MemberPointers&&... memberPointers)
361 return std::make_tuple(
363 std::move(parameterName),
364 static_cast<T*
>(
nullptr),
365 static_cast<S*
>(
nullptr),
369 std::make_tuple<const MemberPointers...>(std::forward<const MemberPointers>(memberPointers)...)));
375#define DW_DESCRIBE_UNNAMED_PARAMETER(TYPE_NAME, args...) dw::framework::describeUnnamedParameter<TYPE_NAME, TYPE_NAME>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(#TYPE_NAME), ##args)
376#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)
389template <
typename T,
typename S,
typename... MemberPointers>
391 dw::core::StringView
const&& typeName,
const MemberPointers&&... memberPointers)
393 return describeParameter<T, S>(
396 std::forward<const MemberPointers>(memberPointers)...);
402#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)
403#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)
416template <
typename T,
typename S,
typename... MemberPointers>
418 dw::core::StringView
const&& typeName,
size_t arraySize,
const MemberPointers&&... memberPointers)
420 return describeArrayParameter<T, S>(
424 std::forward<const MemberPointers>(memberPointers)...);
430#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)
442template <
typename T,
typename S,
typename... MemberPointers>
444 dw::core::StringView
const&& typeName, dw::core::StringView
const&& parameterName, T defaultValue,
const MemberPointers&&... memberPointers)
446 return std::make_tuple(
448 std::move(parameterName),
449 static_cast<T*
>(
nullptr),
450 static_cast<S*
>(
nullptr),
452 static_cast<size_t>(0),
454 std::make_tuple<const MemberPointers...>(std::forward<const MemberPointers>(memberPointers)...)),
455 std::move(defaultValue));
461#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)
473template <
typename T,
typename S,
size_t ArraySize,
typename... MemberPointers>
475 dw::core::StringView
const&& typeName, dw::core::StringView
const&& parameterName, std::array<T, ArraySize> defaultValue,
const MemberPointers&&... memberPointers)
477 return std::make_tuple(
479 std::move(parameterName),
480 static_cast<T*
>(
nullptr),
481 static_cast<S*
>(
nullptr),
485 std::make_tuple<const MemberPointers...>(std::forward<const MemberPointers>(memberPointers)...)),
486 std::move(defaultValue));
490template <
typename NodeT>
501 typename Param,
typename MemberPtr,
503void populateDefault(
const Param& param, MemberPtr& memberPtr)
505 static_cast<void>(param);
506 static_cast<void>(memberPtr);
511 typename Param,
typename MemberPtr,
512 typename std::enable_if_t<PARAMETER_DEFAULT_VALUE<std::tuple_size<Param>(),
void>* =
nullptr>
515 void populateDefault(
const Param& param, MemberPtr& memberPtr)
517 auto defaultValue = std::get<PARAMETER_DEFAULT_VALUE>(param);
518 memberPtr = defaultValue;
523 typename Param,
typename MemberPtr,
525void populateArrayDefault(
const Param& param, MemberPtr& memberPtr,
size_t index)
527 static_cast<void>(param);
528 static_cast<void>(memberPtr);
529 static_cast<void>(index);
534 typename Param,
typename MemberPtr,
535 typename std::enable_if_t<PARAMETER_DEFAULT_VALUE<std::tuple_size<Param>(),
void>* =
nullptr>
538 void populateArrayDefault(
const Param& param, MemberPtr& memberPtr,
size_t index)
540 auto defaultValue = std::get<PARAMETER_DEFAULT_VALUE>(param);
541 memberPtr[index] = defaultValue[index];
546 size_t MemberIndex,
typename ArgType,
typename MemberPtrs,
547 typename std::enable_if_t<std::tuple_size<MemberPtrs>() == 0,
void>* =
nullptr>
548auto& getMemberPtr(ArgType& arg, MemberPtrs memberPtrs)
550 static_cast<void>(memberPtrs);
556 size_t MemberIndex,
typename ArgType,
typename MemberPtrs,
557 typename std::enable_if_t<MemberIndex + 1 == std::tuple_size<MemberPtrs>(),
void>* =
nullptr>
560auto& getMemberPtr(ArgType& arg, MemberPtrs memberPtrs)
562 auto member = std::get<MemberIndex>(memberPtrs);
568 size_t MemberIndex,
typename ArgType,
typename MemberPtrs,
569 typename std::enable_if_t<MemberIndex + 1 < std::tuple_size<MemberPtrs>(),
void>* =
nullptr>
572auto& getMemberPtr(ArgType& arg, MemberPtrs memberPtrs)
574 auto& member = std::get<MemberIndex>(memberPtrs);
575 auto& m = arg.*member;
576 return getMemberPtr<MemberIndex + 1>(m, memberPtrs);
580template <
typename NodeT,
size_t ConstructorParameterIndex>
581constexpr size_t constructorArgumentParameterSize()
583 return dw::core::tuple_size<
584 std::tuple_element_t<
586 std::tuple_element_t<
587 ConstructorParameterIndex,
588 decltype(describeParameters<NodeT>())>>>();
593 typename NodeT,
size_t ConstructorParameterIndex,
size_t ParamIndex,
typename ArgType,
594 typename std::enable_if_t<ParamIndex == constructorArgumentParameterSize<NodeT, ConstructorParameterIndex>(),
void>* =
nullptr>
595void populateParametersRecursion(
const ParameterProvider& provider, ArgType& arg)
597 static_cast<void>(arg);
598 static_cast<void>(provider);
602template <
typename NodeT,
size_t ConstructorParameterIndex,
size_t ParamIndex>
603constexpr bool isIndexParameter()
605 constexpr auto param = dw::core::get<ParamIndex>(
606 std::get<PARAMETER_CONSTRUCTOR_ARGUMENT_DESCRIPTOR>(
607 std::get<ConstructorParameterIndex>(describeParameters<NodeT>())));
608 return std::get<PARAMETER_IS_INDEX>(param);
612template <
typename NodeT,
size_t ConstructorParameterIndex,
size_t ParamIndex>
613constexpr bool isArrayParameter()
615 constexpr auto param = dw::core::get<ParamIndex>(
616 std::get<PARAMETER_CONSTRUCTOR_ARGUMENT_DESCRIPTOR>(
617 std::get<ConstructorParameterIndex>(describeParameters<NodeT>())));
618 constexpr size_t arraySize = std::get<
620 return arraySize > 0;
624template <
typename NodeT,
size_t ConstructorParameterIndex,
size_t ParamIndex>
625constexpr bool isAbstractParameter()
627 constexpr auto param = dw::core::get<ParamIndex>(
628 std::get<PARAMETER_CONSTRUCTOR_ARGUMENT_DESCRIPTOR>(
629 std::get<ConstructorParameterIndex>(describeParameters<NodeT>())));
635 typename NodeT,
size_t ConstructorParameterIndex,
size_t ParamIndex,
typename ArgType,
636 typename std::enable_if_t<isAbstractParameter<NodeT, ConstructorParameterIndex, ParamIndex>(),
void>* =
nullptr>
639void populateParameter(
const ParameterProvider& provider, ArgType& arg)
641 static_cast<void>(arg);
642 static_cast<void>(provider);
651 typename NodeT,
size_t ConstructorParameterIndex,
size_t ParamIndex,
typename ArgType,
652 typename std::enable_if_t<!isAbstractParameter<NodeT, ConstructorParameterIndex, ParamIndex>() && !isArrayParameter<NodeT, ConstructorParameterIndex, ParamIndex>() && !isIndexParameter<NodeT, ConstructorParameterIndex, ParamIndex>(),
void>* =
nullptr>
655void populateParameter(
const ParameterProvider& provider, ArgType& arg)
657 constexpr auto param = dw::core::get<ParamIndex>(
658 std::get<PARAMETER_CONSTRUCTOR_ARGUMENT_DESCRIPTOR>(
659 std::get<ConstructorParameterIndex>(describeParameters<NodeT>())));
661 using DataType = std::remove_pointer_t<
662 std::tuple_element_t<
664 using SemanticDataType = std::remove_pointer_t<
665 std::tuple_element_t<
668 DataType& memberPtr = getMemberPtr<0>(arg, std::get<PARAMETER_MEMBER_PTRS>(param));
669 bool hadParameter = provider.getOptional<SemanticDataType, DataType>(std::get<PARAMETER_NAME>(param), &memberPtr);
672 populateDefault(param, memberPtr);
682 typename NodeT,
size_t ConstructorParameterIndex,
size_t ParamIndex,
typename ArgType,
683 typename std::enable_if_t<!isAbstractParameter<NodeT, ConstructorParameterIndex, ParamIndex>() && !isArrayParameter<NodeT, ConstructorParameterIndex, ParamIndex>() && isIndexParameter<NodeT, ConstructorParameterIndex, ParamIndex>(),
void>* =
nullptr>
686void populateParameter(
const ParameterProvider& provider, ArgType& arg)
688 constexpr auto param = dw::core::get<ParamIndex>(
689 std::get<PARAMETER_CONSTRUCTOR_ARGUMENT_DESCRIPTOR>(
690 std::get<ConstructorParameterIndex>(describeParameters<NodeT>())));
692 using DataType = std::remove_pointer_t<
693 std::tuple_element_t<
695 using SemanticDataType = std::remove_pointer_t<
696 std::tuple_element_t<
698 DataType& memberPtr = getMemberPtr<0>(arg, std::get<PARAMETER_MEMBER_PTRS>(param));
700 size_t index =
static_cast<size_t>(-1);
701 bool hadParameter = provider.getOptional<size_t,
size_t>(std::get<PARAMETER_NAME>(param), &index);
704 hadParameter = provider.getOptional<SemanticDataType, DataType>(
"", index, &memberPtr);
708 populateDefault(param, memberPtr);
718 typename NodeT,
size_t ConstructorParameterIndex,
size_t ParamIndex,
typename ArgType,
719 typename std::enable_if_t<!isAbstractParameter<NodeT, ConstructorParameterIndex, ParamIndex>() && isArrayParameter<NodeT, ConstructorParameterIndex, ParamIndex>(),
void>* =
nullptr>
722void populateParameter(
const ParameterProvider& provider, ArgType& arg)
724 constexpr auto param = dw::core::get<ParamIndex>(
725 std::get<PARAMETER_CONSTRUCTOR_ARGUMENT_DESCRIPTOR>(
726 std::get<ConstructorParameterIndex>(describeParameters<NodeT>())));
728 using DataType = std::remove_pointer_t<
729 std::tuple_element_t<
731 using SemanticDataType = std::remove_pointer_t<
732 std::tuple_element_t<
735 constexpr size_t arraySize = std::get<PARAMETER_ARRAY_SIZE>(
738 DataType(&memberPtr)[arraySize] = getMemberPtr<0>(arg, std::get<PARAMETER_MEMBER_PTRS>(param));
739 for (
size_t i = 0; i < arraySize; ++i)
741 bool hadParameter = provider.getOptional<SemanticDataType, DataType>(std::get<PARAMETER_NAME>(param), i, &memberPtr[i]);
744 populateArrayDefault(param, memberPtr, i);
751 typename NodeT,
size_t ConstructorParameterIndex,
size_t ParamIndex,
typename ArgType,
752 typename std::enable_if_t<ParamIndex<constructorArgumentParameterSize<NodeT, ConstructorParameterIndex>(),
void>* =
nullptr>
755 void populateParametersRecursion(
const ParameterProvider& provider, ArgType& arg)
757 populateParameter<NodeT, ConstructorParameterIndex, ParamIndex>(provider, arg);
759 populateParametersRecursion<NodeT, ConstructorParameterIndex, ParamIndex + 1>(provider, arg);
767template <
typename NodeT,
size_t ConstructorParameterIndex,
typename ArgType>
774 populateParametersRecursion<NodeT, ConstructorParameterIndex, 0>(provider, arg);
778 throw Exception(e.status(),
"Exception while populating parameters of mangled node type ",
typeid(NodeT).name(),
": ", e.messageStr());
787 class ConstructorArguments,
788 typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 1,
void>* =
nullptr>
793 auto& arg0 = std::get<0>(constructorArguments);
794 detail::populateParameters<NodeT, 0>(provider, arg0);
800 class ConstructorArguments,
801 typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 2,
void>* =
nullptr>
804void populateParameters(ConstructorArguments& constructorArguments,
const ParameterProvider& provider)
806 auto& arg0 = std::get<0>(constructorArguments);
807 detail::populateParameters<NodeT, 0>(provider, arg0);
808 auto& arg1 = std::get<1>(constructorArguments);
809 detail::populateParameters<NodeT, 1>(provider, arg1);
815 class ConstructorArguments,
816 typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 3,
void>* =
nullptr>
819void populateParameters(ConstructorArguments& constructorArguments,
const ParameterProvider& provider)
821 auto& arg0 = std::get<0>(constructorArguments);
822 detail::populateParameters<NodeT, 0>(provider, arg0);
823 auto& arg1 = std::get<1>(constructorArguments);
824 detail::populateParameters<NodeT, 1>(provider, arg1);
825 auto& arg2 = std::get<2>(constructorArguments);
826 detail::populateParameters<NodeT, 2>(provider, arg2);
832 class ConstructorArguments,
833 typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 4,
void>* =
nullptr>
836void populateParameters(ConstructorArguments& constructorArguments,
const ParameterProvider& provider)
838 auto& arg0 = std::get<0>(constructorArguments);
839 detail::populateParameters<NodeT, 0>(provider, arg0);
840 auto& arg1 = std::get<1>(constructorArguments);
841 detail::populateParameters<NodeT, 1>(provider, arg1);
842 auto& arg2 = std::get<2>(constructorArguments);
843 detail::populateParameters<NodeT, 2>(provider, arg2);
844 auto& arg3 = std::get<3>(constructorArguments);
845 detail::populateParameters<NodeT, 3>(provider, arg3);
851 class ConstructorArguments,
852 typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 5,
void>* =
nullptr>
855void populateParameters(ConstructorArguments& constructorArguments,
const ParameterProvider& provider)
857 auto& arg0 = std::get<0>(constructorArguments);
858 detail::populateParameters<NodeT, 0>(provider, arg0);
859 auto& arg1 = std::get<1>(constructorArguments);
860 detail::populateParameters<NodeT, 1>(provider, arg1);
861 auto& arg2 = std::get<2>(constructorArguments);
862 detail::populateParameters<NodeT, 2>(provider, arg2);
863 auto& arg3 = std::get<3>(constructorArguments);
864 detail::populateParameters<NodeT, 3>(provider, arg3);
865 auto& arg4 = std::get<4>(constructorArguments);
866 detail::populateParameters<NodeT, 4>(provider, arg4);
873template <
typename NodeT>
874constexpr std::size_t parameterConstructorArgumentSize()
876 return std::tuple_size<decltype(describeParameters<NodeT>())>::value;
881 typename NodeT,
size_t ConstructorArgumentIndex,
882 typename std::enable_if_t<ConstructorArgumentIndex == parameterConstructorArgumentSize<NodeT>(),
void>* =
nullptr>
887 return std::make_tuple();
892 typename NodeT,
size_t ConstructorArgumentIndex,
893 typename std::enable_if_t<ConstructorArgumentIndex<parameterConstructorArgumentSize<NodeT>(),
void>* =
nullptr>
898 using NodeParams =
decltype(describeParameters<NodeT>());
900 using ConstructorParameter = std::tuple_element_t<ConstructorArgumentIndex, NodeParams>;
901 using ArgType = std::remove_pointer_t<
902 typename std::tuple_element_t<PARAMETER_CONSTRUCTOR_ARGUMENT_TYPE, ConstructorParameter>>;
905 return std::tuple_cat(std::make_tuple(arg), createConstructorArguments<NodeT, ConstructorArgumentIndex + 1>());
911template <
typename NodeT>
914 return detail::createConstructorArguments<NodeT, 0>();
921template <
class T,
class Tuple,
size_t... Is>
924auto makeUniqueFromTuple(
const Tuple&& tuple, std::index_sequence<Is...>) -> std::unique_ptr<T>
926 return std::unique_ptr<T>(
new T{std::get<Is>(std::move(tuple))...});
931template <
typename NodeT,
class ConstructorArguments>
934 return detail::makeUniqueFromTuple<NodeT>(
935 std::move(constructorArguments),
936 std::make_index_sequence<std::tuple_size<std::decay_t<ConstructorArguments>>::value>{});
947template <
typename NodeT>
950 auto constructorArguments = createConstructorArguments<NodeT>();
951 populateParameters<NodeT>(constructorArguments, provider);
952 return makeUniqueFromTuple<NodeT>(std::move(constructorArguments));
961 typename NodeT,
size_t ConstructorArgumentIndex,
962 typename std::enable_if_t<ConstructorArgumentIndex == parameterConstructorArgumentSize<NodeT>(),
void>* =
nullptr>
972 typename NodeT,
size_t ConstructorArgumentIndex,
973 typename std::enable_if_t<ConstructorArgumentIndex<parameterConstructorArgumentSize<NodeT>(),
void>* =
nullptr>
978 return constructorArgumentParameterSize<NodeT, ConstructorArgumentIndex>() + parameterSize<NodeT, ConstructorArgumentIndex + 1>();
986template <
typename NodeT>
989 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