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/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>
93constexpr auto describeConstructorArguments(
const Arg1&& arg1,
const Arg2&& arg2) -> std::tuple<std::tuple<Argument1T*, Arg1>, std::tuple<Argument2T*, 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)));
195 typename Argument1T,
typename Argument2T,
typename Argument3T,
typename Argument4T,
typename Argument5T,
typename Argument6T,
196 typename Arg1,
typename Arg2,
typename Arg3,
typename Arg4,
typename Arg5,
typename Arg6>
199constexpr auto describeConstructorArguments(
const Arg1&& arg1,
const Arg2&& arg2,
const Arg3&& arg3,
const Arg4&& arg4,
const Arg5&& arg5,
const Arg6&& arg6)
201 return std::make_tuple(
203 static_cast<Argument1T*
>(
nullptr),
204 std::forward<const Arg1>(arg1)),
206 static_cast<Argument2T*
>(
nullptr),
207 std::forward<const Arg2>(arg2)),
209 static_cast<Argument3T*
>(
nullptr),
210 std::forward<const Arg3>(arg3)),
212 static_cast<Argument4T*
>(
nullptr),
213 std::forward<const Arg4>(arg4)),
215 static_cast<Argument5T*
>(
nullptr),
216 std::forward<const Arg5>(arg5)),
218 static_cast<Argument6T*
>(
nullptr),
219 std::forward<const Arg6>(arg6)));
228template <
typename... Args>
232 return dw::core::make_tuple(
233 std::forward<const Args>(args)...);
265#define DW_PARAMETER_TYPE_NAME_STRING_VIEW(TYPE_NAME_STR) TYPE_NAME_STR##_sv
266#define DW_DESCRIBE_PARAMETER(TYPE_NAME, args...) dw::framework::describeParameter<TYPE_NAME, TYPE_NAME>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(#TYPE_NAME), ##args)
267#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)
282template <
typename T,
typename S,
typename... MemberPointers>
285 dw::core::StringView
const&& typeName, dw::core::StringView
const&& parameterName,
const MemberPointers&&... memberPointers) -> std::tuple<dw::core::StringView, dw::core::StringView, T*, S*, std::integral_constant<bool, false>, std::integral_constant<size_t, 0>, std::tuple<
const MemberPointers...>>
287 return std::make_tuple(
289 std::move(parameterName),
290 static_cast<T*
>(
nullptr),
291 static_cast<S*
>(
nullptr),
292 std::integral_constant<bool, false>(),
293 std::integral_constant<size_t, 0>(),
295 std::make_tuple<const MemberPointers...>(std::forward<const MemberPointers>(memberPointers)...)));
301#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, PARAM_NAME, ARRAY_SIZE, args...) dw::framework::describeAbstractArrayParameter<TYPE_NAME, ARRAY_SIZE>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(#TYPE_NAME), PARAM_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),
323 std::integral_constant<bool, false>(),
324 std::integral_constant<size_t, 0>());
332template <
typename T,
size_t ArraySize>
334 dw::core::StringView
const&& typeName, dw::core::StringView
const&& parameterName)
336 return std::make_tuple(
338 std::move(parameterName),
339 static_cast<T*
>(
nullptr),
340 static_cast<T*
>(
nullptr),
341 std::integral_constant<bool, false>(),
342 std::integral_constant<size_t, ArraySize>());
348#define DW_DESCRIBE_INDEX_PARAMETER(TYPE_NAME, args...) dw::framework::describeIndexParameter<TYPE_NAME, TYPE_NAME>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(#TYPE_NAME), ##args)
349#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)
362template <
typename T,
typename S,
typename... MemberPointers>
364 dw::core::StringView
const&& typeName, dw::core::StringView
const&& parameterName,
const MemberPointers&&... memberPointers)
366 return std::make_tuple(
368 std::move(parameterName),
369 static_cast<T*
>(
nullptr),
370 static_cast<S*
>(
nullptr),
371 std::integral_constant<bool, true>(),
372 std::integral_constant<size_t, 0>(),
374 std::make_tuple<const MemberPointers...>(std::forward<const MemberPointers>(memberPointers)...)));
380#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)
381#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)
393template <
typename T,
typename S,
size_t ArraySize,
typename... MemberPointers>
395 dw::core::StringView
const&& typeName, dw::core::StringView
const&& parameterName,
const MemberPointers&&... memberPointers)
397 return std::make_tuple(
399 std::move(parameterName),
400 static_cast<T*
>(
nullptr),
401 static_cast<S*
>(
nullptr),
402 std::integral_constant<bool, false>(),
403 std::integral_constant<size_t, ArraySize>(),
405 std::make_tuple<const MemberPointers...>(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) -> std::tuple<dw::core::StringView, dw::core::StringView, T*, S*, std::integral_constant<bool, false>, std::integral_constant<size_t, 0>, std::tuple<
const MemberPointers...>>
432 return describeParameter<T, S>(
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) -> std::tuple<dw::core::StringView, dw::core::StringView, T*, S*, std::integral_constant<bool, false>, std::integral_constant<size_t, 0>, std::tuple<
const MemberPointers...>, T>
486 return std::make_tuple(
488 std::move(parameterName),
489 static_cast<T*
>(
nullptr),
490 static_cast<S*
>(
nullptr),
491 std::integral_constant<bool, false>(),
492 std::integral_constant<size_t, 0>(),
494 std::make_tuple<const MemberPointers...>(std::forward<const MemberPointers>(memberPointers)...)),
495 std::move(defaultValue));
501#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)
513template <
typename T,
typename S,
size_t ArraySize,
typename... MemberPointers>
515 dw::core::StringView
const&& typeName, dw::core::StringView
const&& parameterName, std::array<T, ArraySize> defaultValue,
const MemberPointers&&... memberPointers)
517 return std::make_tuple(
519 std::move(parameterName),
520 static_cast<T*
>(
nullptr),
521 static_cast<S*
>(
nullptr),
522 std::integral_constant<bool, false>(),
523 std::integral_constant<size_t, ArraySize>(),
525 std::make_tuple<const MemberPointers...>(std::forward<const MemberPointers>(memberPointers)...)),
526 std::move(defaultValue));
530template <
typename NodeT>
543 typename Param,
typename MemberPtr,
546void populateDefault(
const Param& param, MemberPtr& memberPtr)
548 static_cast<void>(param);
549 static_cast<void>(memberPtr);
554 typename Param,
typename MemberPtr,
555 typename std::enable_if_t<PARAMETER_DEFAULT_VALUE<std::tuple_size<Param>(),
void>* =
nullptr>
557 void populateDefault(
const Param& param, MemberPtr& memberPtr)
560 auto defaultValue = std::get<PARAMETER_DEFAULT_VALUE>(param);
561 memberPtr = defaultValue;
566 typename Param,
typename MemberPtr,
568void populateArrayDefault(
const Param& param, MemberPtr& memberPtr,
size_t index)
570 static_cast<void>(param);
571 static_cast<void>(memberPtr);
572 static_cast<void>(index);
577 typename Param,
typename MemberPtr,
578 typename std::enable_if_t<PARAMETER_DEFAULT_VALUE<std::tuple_size<Param>(),
void>* =
nullptr>
580 void populateArrayDefault(
const Param& param, MemberPtr& memberPtr,
size_t index)
582 auto defaultValue = std::get<PARAMETER_DEFAULT_VALUE>(param);
583 memberPtr[index] = defaultValue[index];
588 size_t MemberIndex,
typename ArgType,
typename MemberPtrs,
589 typename std::enable_if_t<std::tuple_size<MemberPtrs>() == 0,
void>* =
nullptr>
591auto getMemberPtr(ArgType& arg, MemberPtrs memberPtrs) -> ArgType&
593 static_cast<void>(memberPtrs);
599 size_t MemberIndex,
typename ArgType,
typename MemberPtrs,
600 typename std::enable_if_t<MemberIndex + 1 == std::tuple_size<MemberPtrs>(),
void>* =
nullptr>
603auto& getMemberPtr(ArgType& arg, MemberPtrs memberPtrs)
606 auto member = std::get<MemberIndex>(memberPtrs);
612 size_t MemberIndex,
typename ArgType,
typename MemberPtrs,
613 typename std::enable_if_t<MemberIndex + 1 < std::tuple_size<MemberPtrs>(),
void>* =
nullptr>
615auto& getMemberPtr(ArgType& arg, MemberPtrs memberPtrs)
617 auto& member = std::get<MemberIndex>(memberPtrs);
618 auto& m = arg.*member;
619 return getMemberPtr<MemberIndex + 1>(m, memberPtrs);
623template <
typename NodeT,
size_t ConstructorParameterIndex>
625constexpr size_t constructorArgumentParameterSize()
628 return dw::core::tuple_size<
629 std::tuple_element_t<
631 std::tuple_element_t<
632 ConstructorParameterIndex,
633 decltype(describeParameters<NodeT>())>>>();
637template <
typename ParamT>
639constexpr bool isIndexParameter()
641 return std::tuple_element_t<PARAMETER_IS_INDEX, ParamT>::value;
645template <
typename ParamT>
647constexpr bool isArrayParameter()
650 return std::tuple_element_t<PARAMETER_ARRAY_SIZE, ParamT>::value > 0U;
654template <
typename ParamT>
656constexpr bool isAbstractParameter()
663 typename ArgType,
typename ParamT,
664 typename std::enable_if_t<isAbstractParameter<ParamT>(),
void>* =
nullptr>
666void populateParameter(
const ParameterProvider& provider, ArgType& arg,
const ParamT& param)
679 typename ArgType,
typename ParamT,
680 typename std::enable_if_t<!isAbstractParameter<ParamT>() && !isArrayParameter<ParamT>() && !isIndexParameter<ParamT>(),
void>* =
nullptr>
682void populateParameter(
const ParameterProvider& provider, ArgType& arg,
const ParamT& param)
684 using DataType = std::remove_pointer_t<
685 std::tuple_element_t<
687 using SemanticDataType = std::remove_pointer_t<
688 std::tuple_element_t<
690 DataType& memberPtr{getMemberPtr<0>(arg, std::get<PARAMETER_MEMBER_PTRS>(param))};
691 bool hadParameter{provider.getOptional<SemanticDataType, DataType>(std::get<PARAMETER_NAME>(param), &memberPtr)};
694 populateDefault(param, memberPtr);
704 typename ArgType,
typename ParamT,
705 typename std::enable_if_t<!isAbstractParameter<ParamT>() && !isArrayParameter<ParamT>() && isIndexParameter<ParamT>(),
void>* =
nullptr>
707void populateParameter(
const ParameterProvider& provider, ArgType& arg,
const ParamT& param)
709 using DataType = std::remove_pointer_t<
710 std::tuple_element_t<
712 using SemanticDataType = std::remove_pointer_t<
713 std::tuple_element_t<
715 DataType& memberPtr = getMemberPtr<0>(arg, std::get<PARAMETER_MEMBER_PTRS>(param));
717 size_t index =
static_cast<size_t>(-1);
718 bool hadParameter = provider.getOptional<size_t,
size_t>(std::get<PARAMETER_NAME>(param), &index);
721 hadParameter = provider.getOptional<SemanticDataType, DataType>(
"", index, &memberPtr);
725 populateDefault(param, memberPtr);
735 typename ArgType,
typename ParamT,
736 typename std::enable_if_t<!isAbstractParameter<ParamT>() && isArrayParameter<ParamT>(),
void>* =
nullptr>
738void populateParameter(
const ParameterProvider& provider, ArgType& arg,
const ParamT& param)
740 using DataType = std::remove_pointer_t<
741 std::tuple_element_t<
743 using SemanticDataType = std::remove_pointer_t<
744 std::tuple_element_t<
747 constexpr size_t arraySize = std::tuple_element_t<PARAMETER_ARRAY_SIZE, ParamT>::value;
749 DataType(&memberPtr)[arraySize] = getMemberPtr<0>(arg, std::get<PARAMETER_MEMBER_PTRS>(param));
750 for (
size_t i = 0; i < arraySize; ++i)
752 bool hadParameter = provider.getOptional<SemanticDataType, DataType>(std::get<PARAMETER_NAME>(param), i, &memberPtr[i]);
755 populateArrayDefault(param, memberPtr, i);
761template <
typename ArgType>
763void populateParametersRecursion(
const ParameterProvider& provider, ArgType& arg,
const dw::core::Tuple<>& t)
771template <
typename ArgType,
typename THead>
773void populateParametersRecursion(
const ParameterProvider& provider, ArgType& arg,
const dw::core::Tuple<THead>& t)
775 populateParameter(provider, arg, t.m_head);
780 typename ArgType,
typename THead,
typename... TTail,
781 typename std::enable_if_t<
sizeof...(TTail) != 0>* =
nullptr>
783void populateParametersRecursion(
const ParameterProvider& provider, ArgType& arg,
const dw::core::Tuple<THead, TTail...>& t)
785 populateParameter(provider, arg, t.m_head);
786 populateParametersRecursion(provider, arg, t.m_tail);
794template <
typename NodeT,
size_t ConstructorParameterIndex,
typename ConstructorArgsType>
797void populateParameters(
const ParameterProvider& provider, ConstructorArgsType& constructorArguments)
802 auto& arg = std::get<ConstructorParameterIndex>(constructorArguments);
804 constexpr auto params = std::get<dw::framework::PARAMETER_CONSTRUCTOR_ARGUMENT_DESCRIPTOR>(
805 std::get<ConstructorParameterIndex>(describeParameters<NodeT>()));
807 populateParametersRecursion(provider, arg, params);
809 catch (ExceptionWithStatus& e)
811 throw ExceptionWithStatus(e.statusCode(),
"Exception while populating parameters of mangled node type ",
typeid(NodeT).name(),
": ", e.message());
820 class ConstructorArguments,
821 typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 1,
void>* =
nullptr>
825 detail::populateParameters<NodeT, 0>(provider, constructorArguments);
831 class ConstructorArguments,
832 typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 2,
void>* =
nullptr>
834void populateParameters(ConstructorArguments& constructorArguments,
const ParameterProvider& provider)
836 detail::populateParameters<NodeT, 0>(provider, constructorArguments);
837 detail::populateParameters<NodeT, 1>(provider, constructorArguments);
843 class ConstructorArguments,
844 typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 3,
void>* =
nullptr>
846void populateParameters(ConstructorArguments& constructorArguments,
const ParameterProvider& provider)
848 detail::populateParameters<NodeT, 0>(provider, constructorArguments);
849 detail::populateParameters<NodeT, 1>(provider, constructorArguments);
850 detail::populateParameters<NodeT, 2>(provider, constructorArguments);
856 class ConstructorArguments,
857 typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 4,
void>* =
nullptr>
859void populateParameters(ConstructorArguments& constructorArguments,
const ParameterProvider& provider)
861 detail::populateParameters<NodeT, 0>(provider, constructorArguments);
862 detail::populateParameters<NodeT, 1>(provider, constructorArguments);
863 detail::populateParameters<NodeT, 2>(provider, constructorArguments);
864 detail::populateParameters<NodeT, 3>(provider, constructorArguments);
870 class ConstructorArguments,
871 typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 5,
void>* =
nullptr>
873void populateParameters(ConstructorArguments& constructorArguments,
const ParameterProvider& provider)
876 detail::populateParameters<NodeT, 0>(provider, constructorArguments);
877 detail::populateParameters<NodeT, 1>(provider, constructorArguments);
878 detail::populateParameters<NodeT, 2>(provider, constructorArguments);
879 detail::populateParameters<NodeT, 3>(provider, constructorArguments);
880 detail::populateParameters<NodeT, 4>(provider, constructorArguments);
886 class ConstructorArguments,
887 typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 6,
void>* =
nullptr>
890void populateParameters(ConstructorArguments& constructorArguments,
const ParameterProvider& provider)
892 detail::populateParameters<NodeT, 0>(provider, constructorArguments);
893 detail::populateParameters<NodeT, 1>(provider, constructorArguments);
894 detail::populateParameters<NodeT, 2>(provider, constructorArguments);
895 detail::populateParameters<NodeT, 3>(provider, constructorArguments);
896 detail::populateParameters<NodeT, 4>(provider, constructorArguments);
897 detail::populateParameters<NodeT, 5>(provider, constructorArguments);
904template <
typename NodeT>
906constexpr std::size_t parameterConstructorArgumentSize()
908 return std::tuple_size<decltype(describeParameters<NodeT>())>::value;
913 typename NodeT,
size_t ConstructorArgumentIndex,
914 typename std::enable_if_t<ConstructorArgumentIndex == parameterConstructorArgumentSize<NodeT>(),
void>* =
nullptr>
919 return std::make_tuple();
924 typename NodeT,
size_t ConstructorArgumentIndex,
925 typename std::enable_if_t<ConstructorArgumentIndex<parameterConstructorArgumentSize<NodeT>(),
void>* =
nullptr>
930 using NodeParams =
decltype(describeParameters<NodeT>());
932 using ConstructorParameter = std::tuple_element_t<ConstructorArgumentIndex, NodeParams>;
933 using ArgType = std::remove_pointer_t<
934 typename std::tuple_element_t<PARAMETER_CONSTRUCTOR_ARGUMENT_TYPE, ConstructorParameter>>;
937 return std::tuple_cat(std::make_tuple(arg), createConstructorArguments<NodeT, ConstructorArgumentIndex + 1>());
943template <
typename NodeT>
948 return detail::createConstructorArguments<NodeT, 0>();
955template <
class T,
class Tuple,
size_t... Is>
957auto makeUniqueFromTuple(
const Tuple&& tuple, std::index_sequence<Is...>) -> std::unique_ptr<T>
960 return std::unique_ptr<T>(
new T{std::get<Is>(std::move(tuple))...});
965template <
typename NodeT,
class ConstructorArguments>
969 return detail::makeUniqueFromTuple<NodeT>(
970 std::move(constructorArguments),
971 std::make_index_sequence<std::tuple_size<std::decay_t<ConstructorArguments>>::value>{});
982template <
typename NodeT>
987 auto constructorArguments = createConstructorArguments<NodeT>();
988 populateParameters<NodeT>(constructorArguments, provider);
989 return makeUniqueFromTuple<NodeT>(std::move(constructorArguments));
998 typename NodeT,
size_t ConstructorArgumentIndex,
999 typename std::enable_if_t<ConstructorArgumentIndex == parameterConstructorArgumentSize<NodeT>(),
void>* =
nullptr>
1009 typename NodeT,
size_t ConstructorArgumentIndex,
1010 typename std::enable_if_t<ConstructorArgumentIndex<parameterConstructorArgumentSize<NodeT>(),
void>* =
nullptr>
1014 return constructorArgumentParameterSize<NodeT, ConstructorArgumentIndex>() + parameterSize<NodeT, ConstructorArgumentIndex + 1>();
1020template <
typename NodeT>
1024 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 describeParameter(dw::core::StringView const &&typeName, dw::core::StringView const &¶meterName, const MemberPointers &&... memberPointers) -> std::tuple< dw::core::StringView, dw::core::StringView, T *, S *, std::integral_constant< bool, false >, std::integral_constant< size_t, 0 >, std::tuple< const 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)
static constexpr const size_t PARAMETER_DEFAULT_VALUE
auto makeUniqueFromTuple(const ConstructorArguments &&constructorArguments) -> std::unique_ptr< NodeT >
Instantiate a node using the passed constructor arguments.
static constexpr const size_t PARAMETER_IS_INDEX
static constexpr const size_t PARAMETER_SEMANTIC_TYPE
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)
static constexpr const size_t PARAMETER_NAME
auto createConstructorArguments()
Create a tuple of constructor argument needed by the constructor of the passed node.
static constexpr const size_t PARAMETER_TYPE_NAME
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 const size_t PARAMETER_TYPE
constexpr std::size_t parameterSize()
Get the number of parameters for a given node.
static constexpr const size_t PARAMETER_ARRAY_SIZE
auto create(const ParameterProvider &provider) -> std::unique_ptr< NodeT >
static constexpr const size_t PARAMETER_CONSTRUCTOR_ARGUMENT_TYPE
static constexpr const size_t PARAMETER_MEMBER_PTRS
constexpr auto describeAbstractArrayParameter(dw::core::StringView const &&typeName, dw::core::StringView const &¶meterName)
static constexpr const size_t PARAMETER_CONSTRUCTOR_ARGUMENT_DESCRIPTOR
constexpr auto describeUnnamedParameter(dw::core::StringView const &&typeName, const MemberPointers &&... memberPointers) -> std::tuple< dw::core::StringView, dw::core::StringView, T *, S *, std::integral_constant< bool, false >, std::integral_constant< size_t, 0 >, std::tuple< const MemberPointers... > >
constexpr auto describeParameterWithDefault(dw::core::StringView const &&typeName, dw::core::StringView const &¶meterName, T defaultValue, const MemberPointers &&... memberPointers) -> std::tuple< dw::core::StringView, dw::core::StringView, T *, S *, std::integral_constant< bool, false >, std::integral_constant< size_t, 0 >, std::tuple< const MemberPointers... >, T >