Compute Graph Framework SDK Reference  5.16
ParameterDescriptor.hpp
Go to the documentation of this file.
1
2//
3// Notice
4// ALL NVIDIA DESIGN SPECIFICATIONS AND CODE ("MATERIALS") ARE PROVIDED "AS IS" NVIDIA MAKES
5// NO REPRESENTATIONS, WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO
6// THE MATERIALS, AND EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTIES OF NONINFRINGEMENT,
7// MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
8//
9// NVIDIA CORPORATION & AFFILIATES assumes no responsibility for the consequences of use of such
10// information or for any infringement of patents or other rights of third parties that may
11// result from its use. No license is granted by implication or otherwise under any patent
12// or patent rights of NVIDIA CORPORATION & AFFILIATES. No third party distribution is allowed unless
13// expressly authorized by NVIDIA. Details are subject to change without notice.
14// This code supersedes and replaces all information previously supplied.
15// NVIDIA CORPORATION & AFFILIATES products are not authorized for use as critical
16// components in life support devices or systems without express written approval of
17// NVIDIA CORPORATION & AFFILIATES.
18//
19// SPDX-FileCopyrightText: Copyright (c) 2021-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
20// SPDX-License-Identifier: LicenseRef-NvidiaProprietary
21//
22// NVIDIA CORPORATION, its affiliates and licensors retain all intellectual
23// property and proprietary rights in and to this material, related
24// documentation and any modifications thereto. Any use, reproduction,
25// disclosure or distribution of this material and related documentation
26// without an express license agreement from NVIDIA CORPORATION or
27// its affiliates is strictly prohibited.
28//
30
31#ifndef DW_FRAMEWORK_PARAMETERDESCRIPTOR_HPP_
32#define DW_FRAMEWORK_PARAMETERDESCRIPTOR_HPP_
33
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>
39
40namespace dw
41{
42namespace framework
43{
44
45// coverity[autosar_cpp14_a14_1_1_violation]
46template <typename ConstructorArgumentT, typename ParameterDescriptorsT>
48{
49 // coverity[autosar_cpp14_a0_1_6_violation]
50 // coverity[autosar_cpp14_m3_4_1_violation]
51 using ConstructorArgumentType = ConstructorArgumentT;
52 using ParameterDescriptorsType = ParameterDescriptorsT;
54
56 : parameterDescriptors(std::move(parameterDescriptors_))
57 {
58 }
59};
60
67constexpr std::tuple<> describeConstructorArguments()
68{
69 return std::make_tuple();
70}
71
79template <typename Arg1>
80// Overloaded functions are provided for ease of use
81// coverity[autosar_cpp14_a2_10_5_violation]
82constexpr auto describeConstructorArguments(Arg1&& arg1) -> std::tuple<Arg1>
83{
84 return std::make_tuple(std::forward<Arg1>(arg1));
85}
86
94template <
95 typename Arg1, typename... ArgRest,
96 typename std::enable_if_t<sizeof...(ArgRest) != 0>* = nullptr>
97// Overloaded functions are provided for ease of use
98// coverity[autosar_cpp14_a2_10_5_violation]
99// coverity[autosar_cpp14_a7_1_5_violation] RFD Pending: TID-2201
100constexpr auto describeConstructorArguments(Arg1&& arg1, ArgRest&&... argRest)
101{
102 return std::tuple_cat(
103 describeConstructorArguments<Arg1>(std::forward<Arg1>(arg1)),
104 describeConstructorArguments<ArgRest...>(std::forward<ArgRest>(argRest)...));
105}
106
113template <typename ConstructorArgumentT, typename... Args>
114// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
115constexpr auto describeConstructorArgument(const Args&&... args) -> ConstructorArgumentDescriptorT<ConstructorArgumentT, dw::core::Tuple<Args...>>
116{
117 return ConstructorArgumentDescriptorT<ConstructorArgumentT, dw::core::Tuple<Args...>>(
118 dw::core::make_tuple<const Args...>(std::forward<const Args>(args)...));
119}
120
121// coverity[autosar_cpp14_a14_1_1_violation]
122template <typename Type_, typename SemanticType_, bool IsIndex, size_t ArraySize, bool IsAbstract, bool HasDefault, typename... MemberPointers>
124{
125 dw::core::StringView typeName;
126 dw::core::StringView parameterName;
127 // coverity[autosar_cpp14_a0_1_6_violation]
128 using Type = Type_;
129 // coverity[autosar_cpp14_a0_1_6_violation]
130 // coverity[autosar_cpp14_m3_4_1_violation]
131 using SemanticType = SemanticType_;
132 static constexpr bool IS_INDEX{IsIndex};
133 static constexpr size_t ARRAY_SIZE{ArraySize};
134 static constexpr bool IS_ABSTRACT{IsAbstract};
135 // coverity[autosar_cpp14_a0_1_1_violation] FP: nvbugs/2813925
136 // coverity[autosar_cpp14_m0_1_4_violation] FP: nvbugs/2813925
137 static constexpr bool HAS_DEFAULT{HasDefault};
138 std::tuple<const MemberPointers...> memberPointers;
139
140 constexpr ParameterDescriptorT(dw::core::StringView&& typeName_, dw::core::StringView&& parameterName_, const MemberPointers&&... memberPointers_)
141 : typeName{std::move(typeName_)}
142 , parameterName{std::move(parameterName_)}
143 , memberPointers(std::make_tuple<const MemberPointers...>(std::forward<const MemberPointers>(memberPointers_)...))
144 {
145 }
146};
147
148template <typename Type_, typename SemanticType_, bool IsIndex, size_t ArraySize, bool IsAbstract, bool HasDefault, typename... MemberPointers>
149constexpr bool ParameterDescriptorT<Type_, SemanticType_, IsIndex, ArraySize, IsAbstract, HasDefault, MemberPointers...>::IS_INDEX;
150
151template <typename Type_, typename SemanticType_, bool IsIndex, size_t ArraySize, bool IsAbstract, bool HasDefault, typename... MemberPointers>
152constexpr size_t ParameterDescriptorT<Type_, SemanticType_, IsIndex, ArraySize, IsAbstract, HasDefault, MemberPointers...>::ARRAY_SIZE;
153
154template <typename Type_, typename SemanticType_, bool IsIndex, size_t ArraySize, bool IsAbstract, bool HasDefault, typename... MemberPointers>
155constexpr bool ParameterDescriptorT<Type_, SemanticType_, IsIndex, ArraySize, IsAbstract, HasDefault, MemberPointers...>::HAS_DEFAULT;
156
157// coverity[autosar_cpp14_a14_1_1_violation]
158template <typename Type, typename SemanticType, bool IsIndex, size_t ArraySize, bool IsAbstract, typename DefaultType, typename... MemberPointers>
159struct ParameterDescriptorWithDefaultT : public ParameterDescriptorT<Type, SemanticType, IsIndex, ArraySize, IsAbstract, true, MemberPointers...>
160{
161 DefaultType defaultValue;
162
163 constexpr ParameterDescriptorWithDefaultT(dw::core::StringView&& typeName_, dw::core::StringView&& parameterName_, DefaultType&& defaultValue_, const MemberPointers&&... memberPointers_)
164 : ParameterDescriptorT<Type, SemanticType, IsIndex, ArraySize, IsAbstract, true, MemberPointers...>{std::move(typeName_), std::move(parameterName_), std::forward<const MemberPointers>(memberPointers_)...}
165 , defaultValue{std::move(defaultValue_)}
166 {
167 }
168};
169
170} // namespace framework
171} // namespace dw
172
173#define DW_PARAMETER_TYPE_NAME_STRING_VIEW_IMPL(TYPE_NAME_STR) \
174 dw::core::StringView { TYPE_NAME_STR }
175#define DW_PARAMETER_TYPE_NAME_STRING_VIEW(TYPE_NAME) DW_PARAMETER_TYPE_NAME_STRING_VIEW_IMPL(#TYPE_NAME)
176#define DW_DESCRIBE_PARAMETER(TYPE_NAME, args...) dw::framework::describeParameter<TYPE_NAME, TYPE_NAME>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(TYPE_NAME), ##args)
177#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)
178
179namespace dw
180{
181namespace framework
182{
183
192template <typename T, typename S, typename... MemberPointers>
193// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
194constexpr auto describeParameter(
195 dw::core::StringView&& typeName, dw::core::StringView&& parameterName, const MemberPointers&&... memberPointers) -> ParameterDescriptorT<T, S, false, 0, false, false, MemberPointers...>
196{
197 return ParameterDescriptorT<T, S, false, 0, false, false, MemberPointers...>(
198 std::move(typeName),
199 std::move(parameterName),
200 std::forward<const MemberPointers>(memberPointers)...);
201}
202
203} // namespace framework
204} // namespace dw
205
206#define DW_DESCRIBE_ABSTRACT_PARAMETER(TYPE_NAME, args...) dw::framework::describeAbstractParameter<TYPE_NAME>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(TYPE_NAME), ##args)
207#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)
208
209namespace dw
210{
211namespace framework
212{
213
219template <typename T>
221 dw::core::StringView&& typeName, dw::core::StringView&& parameterName)
222{
224 std::move(typeName),
225 std::move(parameterName));
226}
227
233template <typename T, size_t ArraySize>
235 dw::core::StringView&& typeName, dw::core::StringView&& parameterName)
236{
238 std::move(typeName),
239 std::move(parameterName));
240}
241
242} // namespace framework
243} // namespace dw
244
245#define DW_DESCRIBE_INDEX_PARAMETER(TYPE_NAME, args...) dw::framework::describeIndexParameter<TYPE_NAME, TYPE_NAME>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(TYPE_NAME), ##args)
246#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)
247
248namespace dw
249{
250namespace framework
251{
252
259template <typename T, typename S, typename... MemberPointers>
261 dw::core::StringView&& typeName, dw::core::StringView&& parameterName, const MemberPointers&&... memberPointers)
262{
263 return ParameterDescriptorT<T, S, true, 0, false, false, MemberPointers...>(
264 std::move(typeName),
265 std::move(parameterName),
266 std::forward<const MemberPointers>(memberPointers)...);
267}
268
269} // namespace framework
270} // namespace dw
271
272#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)
273#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)
274
275namespace dw
276{
277namespace framework
278{
279
285template <typename T, typename S, size_t ArraySize, typename... MemberPointers>
287 dw::core::StringView&& typeName, dw::core::StringView&& parameterName, const MemberPointers&&... memberPointers)
288{
289 return ParameterDescriptorT<T, S, false, ArraySize, false, false, MemberPointers...>(
290 std::move(typeName),
291 std::move(parameterName),
292 std::forward<const MemberPointers>(memberPointers)...);
293}
294
295} // namespace framework
296} // namespace dw
297
298#define DW_DESCRIBE_UNNAMED_PARAMETER(TYPE_NAME, args...) dw::framework::describeUnnamedParameter<TYPE_NAME, TYPE_NAME>(DW_PARAMETER_TYPE_NAME_STRING_VIEW(TYPE_NAME), ##args)
299#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)
300
301namespace dw
302{
303namespace framework
304{
305
312template <typename T, typename S, typename... MemberPointers>
313// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
315 dw::core::StringView&& typeName, const MemberPointers&&... memberPointers) -> ParameterDescriptorT<T, S, false, 0, false, false, MemberPointers...>
316{
317 // coverity[autosar_cpp14_a5_1_1_violation] FP: nvbugs/3364868
318 // coverity[autosar_cpp14_a5_2_2_violation] FP: nvbugs/3949905
319 return describeParameter<T, S, MemberPointers...>(
320 std::move(typeName),
321 dw::core::StringView{""},
322 std::forward<const MemberPointers>(memberPointers)...);
323}
324
325} // namespace framework
326} // namespace dw
327
328#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)
329#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)
330
331namespace dw
332{
333namespace framework
334{
335
342template <typename T, typename S, size_t ArraySize, typename... MemberPointers>
344 dw::core::StringView&& typeName, const MemberPointers&&... memberPointers)
345{
346 return describeArrayParameter<T, S, ArraySize>(
347 std::move(typeName),
348 ""_sv,
349 std::forward<const MemberPointers>(memberPointers)...);
350}
351
352} // namespace framework
353} // namespace dw
354
355#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)
356
357namespace dw
358{
359namespace framework
360{
361
367template <typename T, typename S, typename... MemberPointers>
368// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
370 dw::core::StringView&& typeName, dw::core::StringView&& parameterName, T&& defaultValue, const MemberPointers&&... memberPointers) -> ParameterDescriptorWithDefaultT<T, S, false, 0, false, T, MemberPointers...>
371{
372 return ParameterDescriptorWithDefaultT<T, S, false, 0, false, T, MemberPointers...>(
373 std::move(typeName),
374 std::move(parameterName),
375 std::move(defaultValue),
376 std::forward<const MemberPointers>(memberPointers)...);
377}
378
379} // namespace framework
380} // namespace dw
381
382#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)
383
384namespace dw
385{
386namespace framework
387{
388
394template <typename T, typename S, size_t ArraySize, typename... MemberPointers>
396 dw::core::StringView&& typeName, dw::core::StringView&& parameterName, std::array<T, ArraySize> defaultValue, const MemberPointers&&... memberPointers)
397{
399 std::move(typeName),
400 std::move(parameterName),
401 std::move(defaultValue),
402 std::forward<const MemberPointers>(memberPointers)...);
403}
404
406template <typename NodeT>
407// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
408// coverity[autosar_cpp14_a7_1_5_violation] RFD Pending: TID-2201
410{
411 return NodeT::describeParameters();
412}
413
414namespace detail
415{
416
418template <
419 typename Param, typename MemberPtr,
420 typename std::enable_if_t<!Param::HAS_DEFAULT, void>* = nullptr>
421// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
422void populateDefault(const Param& param, MemberPtr& memberPtr)
423{
424 static_cast<void>(param);
425 static_cast<void>(memberPtr);
426}
427
429template <
430 typename Param, typename MemberPtr,
431 typename std::enable_if_t<Param::HAS_DEFAULT, void>* = nullptr>
432// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
433void populateDefault(const Param& param, MemberPtr& memberPtr)
434{
435 memberPtr = param.defaultValue;
436}
437
439template <
440 typename Param, typename MemberPtr,
441 typename std::enable_if_t<!Param::HAS_DEFAULT, void>* = nullptr>
442// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
443void populateArrayDefault(const Param& param, MemberPtr& memberPtr, size_t index)
444{
445 static_cast<void>(param);
446 static_cast<void>(memberPtr);
447 static_cast<void>(index);
448}
449
451template <
452 typename Param, typename MemberPtr,
453 typename std::enable_if_t<Param::HAS_DEFAULT, void>* = nullptr>
454// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
455void populateArrayDefault(const Param& param, MemberPtr& memberPtr, size_t index)
456{
457 memberPtr[index] = param.defaultValue[index];
458}
459
461template <
462 size_t MemberIndex, typename ArgType, typename MemberPtrs,
463 typename std::enable_if_t<std::tuple_size<MemberPtrs>() == 0, void>* = nullptr>
464// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
465auto getMemberPtr(ArgType& arg, MemberPtrs memberPtrs) -> ArgType&
466{
467 static_cast<void>(memberPtrs);
468 return arg;
469}
470
472template <
473 size_t MemberIndex, typename ArgType, typename MemberPtrs,
474 typename std::enable_if_t<MemberIndex + 1 == std::tuple_size<MemberPtrs>(), void>* = nullptr>
475// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
476// coverity[autosar_cpp14_a7_1_5_violation] RFD Pending: TID-2201
477auto& getMemberPtr(ArgType& arg, MemberPtrs memberPtrs)
478{
479 // coverity[autosar_cpp14_a8_5_2_violation]
480 auto member = std::get<MemberIndex>(memberPtrs);
481 return arg.*member;
482}
483
485template <
486 size_t MemberIndex, typename ArgType, typename MemberPtrs,
487 typename std::enable_if_t<MemberIndex + 1 < std::tuple_size<MemberPtrs>(), void>* = nullptr>
488// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
489auto& getMemberPtr(ArgType& arg, MemberPtrs memberPtrs)
490{
491 auto& member = std::get<MemberIndex>(memberPtrs);
492 auto& m = arg.*member;
493 return getMemberPtr<MemberIndex + 1>(m, memberPtrs);
494}
495
497template <typename NodeT, size_t ConstructorParameterIndex>
498// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
499constexpr size_t constructorArgumentParameterSize()
500{
501 using ConstructorArgumentDescriptor = std::tuple_element_t<ConstructorParameterIndex, decltype(describeNodeParameters<NodeT>())>;
502 // coverity[autosar_cpp14_a13_5_3_violation]
503 return dw::core::tuple_size<typename ConstructorArgumentDescriptor::ParameterDescriptorsType>();
504}
505
507template <typename ParamT>
508// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
509constexpr bool isIndexParameter()
510{
511 return ParamT::IS_INDEX;
512}
513
515template <typename ParamT>
516// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
517constexpr bool isArrayParameter()
518{
519 // coverity[autosar_cpp14_a5_1_1_violation] RFD Accepted: TID-2056
520 return ParamT::ARRAY_SIZE > 0U;
521}
522
524template <typename ParamT>
525// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
526constexpr bool isAbstractParameter()
527{
528 return ParamT::IS_ABSTRACT;
529}
530
532template <
533 typename ArgType, typename ParamT,
534 typename std::enable_if_t<isAbstractParameter<ParamT>(), void>* = nullptr>
535// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
536void populateParameter(const ParameterProvider& provider, ArgType& arg, const ParamT& param)
537{
538 static_cast<void>(provider);
539 static_cast<void>(arg);
540 static_cast<void>(param);
541}
542
548template <
549 typename ArgType, typename ParamT,
550 typename std::enable_if_t<!isAbstractParameter<ParamT>() && !isArrayParameter<ParamT>() && !isIndexParameter<ParamT>(), void>* = nullptr>
551// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
552void populateParameter(const ParameterProvider& provider, ArgType& arg, const ParamT& param)
553{
554 using DataType = typename ParamT::Type;
555 using SemanticDataType = typename ParamT::SemanticType;
556 DataType& memberPtr{getMemberPtr<0>(arg, param.memberPointers)};
557 bool hadParameter{provider.getOptional<SemanticDataType, DataType>(param.parameterName, &memberPtr)};
558 if (!hadParameter)
559 {
560 populateDefault(param, memberPtr);
561 }
562}
563
569template <
570 typename ArgType, typename ParamT,
571 typename std::enable_if_t<!isAbstractParameter<ParamT>() && !isArrayParameter<ParamT>() && isIndexParameter<ParamT>(), void>* = nullptr>
572// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
573void populateParameter(const ParameterProvider& provider, ArgType& arg, const ParamT& param)
574{
575 using DataType = typename ParamT::Type;
576 using SemanticDataType = typename ParamT::SemanticType;
577 DataType& memberPtr = getMemberPtr<0>(arg, param.memberPointers);
578
579 size_t index = static_cast<size_t>(-1);
580 bool hadParameter = provider.getOptional<size_t, size_t>(param.parameterName, &index);
581 if (hadParameter)
582 {
583 hadParameter = provider.getOptional<SemanticDataType, DataType>("", index, &memberPtr);
584 }
585 if (!hadParameter)
586 {
587 populateDefault(param, memberPtr);
588 }
589}
590
596template <
597 typename ArgType, typename ParamT,
598 typename std::enable_if_t<!isAbstractParameter<ParamT>() && isArrayParameter<ParamT>(), void>* = nullptr>
599// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
600void populateParameter(const ParameterProvider& provider, ArgType& arg, const ParamT& param)
601{
602 using DataType = typename ParamT::Type;
603 using SemanticDataType = typename ParamT::SemanticType;
604
605 constexpr size_t arraySize = ParamT::ARRAY_SIZE;
606
607 DataType(&memberPtr)[arraySize] = getMemberPtr<0>(arg, param.memberPointers);
608 for (size_t i = 0; i < arraySize; ++i)
609 {
610 bool hadParameter = provider.getOptional<SemanticDataType, DataType>(param.parameterName, i, &memberPtr[i]);
611 if (!hadParameter)
612 {
613 populateArrayDefault(param, memberPtr, i);
614 }
615 }
616}
617
619template <typename ArgType>
620// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
621void populateParametersRecursion(const ParameterProvider& provider, ArgType& arg, const dw::core::Tuple<>& t)
622{
623 static_cast<void>(provider);
624 static_cast<void>(arg);
625 static_cast<void>(t);
626}
627
629template <typename ArgType, typename THead>
630// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
631void populateParametersRecursion(const ParameterProvider& provider, ArgType& arg, const dw::core::Tuple<THead>& t)
632{
633 populateParameter(provider, arg, t.m_head);
634}
635
637template <
638 typename ArgType, typename THead, typename... TTail,
639 typename std::enable_if_t<sizeof...(TTail) != 0>* = nullptr>
640// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
641void populateParametersRecursion(const ParameterProvider& provider, ArgType& arg, const dw::core::Tuple<THead, TTail...>& t)
642{
643 populateParameter(provider, arg, t.m_head);
644 populateParametersRecursion(provider, arg, t.m_tail);
645}
646
652template <typename NodeT, size_t ConstructorParameterIndex, typename ConstructorArgsType>
653// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
654void populateParameters(const ParameterProvider& provider, ConstructorArgsType& constructorArguments)
655{
656 try
657 {
658 // coverity[autosar_cpp14_a8_5_2_violation]
659 auto& arg = std::get<ConstructorParameterIndex>(constructorArguments);
660 // coverity[autosar_cpp14_a8_5_2_violation]
661 constexpr auto params = std::get<ConstructorParameterIndex>(describeNodeParameters<NodeT>()).parameterDescriptors;
662 // coverity[cert_err59_cpp_violation]
663 populateParametersRecursion(provider, arg, params);
664 }
665 catch (ExceptionWithStatus& e)
666 {
667 throw ExceptionWithStatus(e.statusCode(), "Exception while populating parameters of mangled node type ", typeid(NodeT).name(), ": ", e.message());
668 }
669}
670
671// Return value needed by populateParametersForEachConstructorArgument() for the forEach variable in C++14
672template <typename NodeT, size_t ConstructorParameterIndex, typename ConstructorArgsType>
673// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
674void* populateParametersWithNonVoidReturnType(const ParameterProvider& provider, ConstructorArgsType& constructorArguments)
675{
676 populateParameters<NodeT, ConstructorParameterIndex>(provider, constructorArguments);
677 return nullptr;
678}
679
680template <
681 typename NodeT, typename ConstructorArguments, size_t... Is>
682// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
683void populateParametersForEachConstructorArgument(const ParameterProvider& provider, ConstructorArguments& constructorArguments, std::integer_sequence<size_t, Is...>)
684{
685 void* forEach[]{
686 populateParametersWithNonVoidReturnType<NodeT, Is>(provider, constructorArguments)...};
687 static_cast<void>(forEach);
688}
689
690} // namespace detail
691
693template <typename NodeT, typename... Ts>
694// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
695void populateParameters(std::tuple<Ts...>& constructorArguments, const ParameterProvider& provider)
696{
697 detail::populateParametersForEachConstructorArgument<NodeT>(provider, constructorArguments, std::make_index_sequence<sizeof...(Ts)>());
698}
699
700namespace detail
701{
702
703// Get the Number of constructor arguments of the passed node.
704template <typename NodeT>
705// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
706constexpr std::size_t parameterConstructorArgumentSize()
707{
708 return std::tuple_size<decltype(describeNodeParameters<NodeT>())>::value;
709}
710
712template <
713 typename NodeT, size_t ConstructorArgumentIndex,
714 typename std::enable_if_t<ConstructorArgumentIndex == parameterConstructorArgumentSize<NodeT>(), void>* = nullptr>
715// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
716std::tuple<> createConstructorArguments()
717{
718 return std::make_tuple();
719}
720
722template <
723 typename NodeT, size_t ConstructorArgumentIndex,
724 typename std::enable_if_t<ConstructorArgumentIndex<parameterConstructorArgumentSize<NodeT>(), void>* = nullptr>
725 // coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
726 // coverity[autosar_cpp14_a7_1_5_violation] RFD Pending: TID-2201
728{
729 using NodeParams = decltype(describeNodeParameters<NodeT>());
730
731 using ConstructorArgumentDescriptor = std::tuple_element_t<ConstructorArgumentIndex, NodeParams>;
732 typename ConstructorArgumentDescriptor::ConstructorArgumentType arg{};
733
734 return std::tuple_cat(std::make_tuple(arg), createConstructorArguments<NodeT, ConstructorArgumentIndex + 1>());
735}
736
737} // namespace detail
738
740template <typename NodeT>
741// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
742// coverity[autosar_cpp14_a7_1_5_violation] RFD Pending: TID-2201
744{
745 return detail::createConstructorArguments<NodeT, 0>();
746}
747
748namespace detail
749{
750
752template <class T, class Tuple, size_t... Is>
753// coverity[autosar_cpp14_a2_10_5_violation] RFD Pending: TID-2053
754auto makeUniqueFromTuple(Tuple&& tuple, std::index_sequence<Is...>) -> std::unique_ptr<T>
755{
756 // coverity[use_after_move]
757 return std::make_unique<T>(std::get<Is>(std::move(tuple))...);
758}
759}
760
762template <typename NodeT, class ConstructorArguments>
763// coverity[autosar_cpp14_a2_10_5_violation] RFD Pending: TID-2053
764auto makeUniqueFromTuple(ConstructorArguments&& constructorArguments) -> std::unique_ptr<NodeT>
765{
766 return detail::makeUniqueFromTuple<NodeT>(
767 std::move(constructorArguments),
768 std::make_index_sequence<std::tuple_size<std::decay_t<ConstructorArguments>>::value>{});
769}
770
779template <typename NodeT>
780// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
781auto createNode(const ParameterProvider& provider) -> std::unique_ptr<NodeT>
782{
783 // coverity[autosar_cpp14_a8_5_2_violation]
784 auto constructorArguments = createConstructorArguments<NodeT>();
785 populateParameters<NodeT>(constructorArguments, provider);
786 return makeUniqueFromTuple<NodeT>(std::move(constructorArguments));
787}
788
789// Number of parameters (sum across all constructor arguments)
790namespace detail
791{
792
794template <
795 typename NodeT, size_t ConstructorArgumentIndex,
796 typename std::enable_if_t<ConstructorArgumentIndex == parameterConstructorArgumentSize<NodeT>(), void>* = nullptr>
797// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
798constexpr std::size_t parameterSize()
799{
800 // coverity[autosar_cpp14_a5_1_1_violation] RFD Accepted: TID-2056
801 return 0U;
802}
803
805template <
806 typename NodeT, size_t ConstructorArgumentIndex,
807 typename std::enable_if_t<ConstructorArgumentIndex<parameterConstructorArgumentSize<NodeT>(), void>* = nullptr>
808 // coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
809 constexpr std::size_t parameterSize()
810{
811 return constructorArgumentParameterSize<NodeT, ConstructorArgumentIndex>() + parameterSize<NodeT, ConstructorArgumentIndex + 1>();
812}
813
814} // namespace detail
815
817template <typename NodeT>
818// coverity[autosar_cpp14_a2_10_5_violation] RFD Pending: TID-2053
819constexpr std::size_t parameterSize()
820{
821 return detail::parameterSize<NodeT, 0>();
822}
823
824} // namespace framework
825} // namespace dw
826
827#endif // DW_FRAMEWORK_PARAMETERDESCRIPTOR_HPP_
The interface to access parameter values identified by name and/or (semantic) type.
auto makeUniqueFromTuple(ConstructorArguments &&constructorArguments) -> std::unique_ptr< NodeT >
Instantiate a node using the passed constructor arguments.
constexpr auto describeUnnamedParameter(dw::core::StringView &&typeName, const MemberPointers &&... memberPointers) -> ParameterDescriptorT< T, S, false, 0, false, false, MemberPointers... >
constexpr auto describeAbstractArrayParameter(dw::core::StringView &&typeName, dw::core::StringView &&parameterName)
constexpr std::tuple describeConstructorArguments()
constexpr auto describeParameter(dw::core::StringView &&typeName, dw::core::StringView &&parameterName, const MemberPointers &&... memberPointers) -> ParameterDescriptorT< T, S, false, 0, false, false, MemberPointers... >
constexpr auto describeAbstractParameter(dw::core::StringView &&typeName, dw::core::StringView &&parameterName)
constexpr auto describeUnnamedArrayParameter(dw::core::StringView &&typeName, const MemberPointers &&... memberPointers)
auto createConstructorArguments()
Create a tuple of constructor argument needed by the constructor of the passed node.
std::unique_ptr< Node > createNode(const dw::core::StringView &className, ParameterProvider &provider)
constexpr auto describeNodeParameters()
Get described parameters for the passed node.
void populateParameters(std::tuple< Ts... > &constructorArguments, const ParameterProvider &provider)
Populate the constructor arguments using values from the parameter provider.
constexpr std::size_t parameterSize()
Get the number of parameters for a given node.
constexpr auto describeParameterWithDefault(dw::core::StringView &&typeName, dw::core::StringView &&parameterName, T &&defaultValue, const MemberPointers &&... memberPointers) -> ParameterDescriptorWithDefaultT< T, S, false, 0, false, T, MemberPointers... >
constexpr auto describeConstructorArgument(const Args &&... args) -> ConstructorArgumentDescriptorT< ConstructorArgumentT, dw::core::Tuple< Args... > >
constexpr auto describeArrayParameter(dw::core::StringView &&typeName, dw::core::StringView &&parameterName, const MemberPointers &&... memberPointers)
constexpr auto describeIndexParameter(dw::core::StringView &&typeName, dw::core::StringView &&parameterName, const MemberPointers &&... memberPointers)
constexpr auto describeArrayParameterWithDefault(dw::core::StringView &&typeName, dw::core::StringView &&parameterName, std::array< T, ArraySize > defaultValue, const MemberPointers &&... memberPointers)
Definition: Buffer.hpp:40
constexpr ConstructorArgumentDescriptorT(ParameterDescriptorsType &&parameterDescriptors_)
std::tuple< const MemberPointers... > memberPointers
constexpr ParameterDescriptorT(dw::core::StringView &&typeName_, dw::core::StringView &&parameterName_, const MemberPointers &&... memberPointers_)
constexpr ParameterDescriptorWithDefaultT(dw::core::StringView &&typeName_, dw::core::StringView &&parameterName_, DefaultType &&defaultValue_, const MemberPointers &&... memberPointers_)