Compute Graph Framework SDK Reference  5.14
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// Indices within the tuple describing constructor arguments
46// coverity[autosar_cpp14_a0_1_1_violation] FP: nvbugs/2813925
47// coverity[autosar_cpp14_m0_1_4_violation] FP: nvbugs/2813925
48static constexpr const size_t PARAMETER_CONSTRUCTOR_ARGUMENT_TYPE{0U};
49// coverity[autosar_cpp14_a0_1_1_violation] FP: nvbugs/2813925
50// coverity[autosar_cpp14_m0_1_4_violation] FP: nvbugs/2813925
51static constexpr const size_t PARAMETER_CONSTRUCTOR_ARGUMENT_DESCRIPTOR{1U};
52
59constexpr std::tuple<> describeConstructorArguments()
60{
61 return std::make_tuple();
62}
63
70template <
71 typename Argument1T,
72 typename Arg1>
73// Overloaded functions are provided for ease of use
74// coverity[autosar_cpp14_a2_10_5_violation]
75constexpr auto describeConstructorArguments(const Arg1&& arg1)
76{
77 return std::make_tuple(
78 std::make_tuple(
79 static_cast<Argument1T*>(nullptr),
80 std::forward<const Arg1>(arg1)));
81}
82
89template <
90 typename Argument1T, typename Argument2T,
91 typename Arg1, typename Arg2>
92// Overloaded functions are provided for ease of use
93// coverity[autosar_cpp14_a2_10_5_violation]
94constexpr auto describeConstructorArguments(const Arg1&& arg1, const Arg2&& arg2) -> std::tuple<std::tuple<Argument1T*, Arg1>, std::tuple<Argument2T*, Arg2>>
95{
96 return std::make_tuple(
97 std::make_tuple(
98 static_cast<Argument1T*>(nullptr),
99 std::forward<const Arg1>(arg1)),
100 std::make_tuple(
101 static_cast<Argument2T*>(nullptr),
102 std::forward<const Arg2>(arg2)));
103}
104
111template <
112 typename Argument1T, typename Argument2T, typename Argument3T,
113 typename Arg1, typename Arg2, typename Arg3>
114// Overloaded functions are provided for ease of use
115// coverity[autosar_cpp14_a2_10_5_violation]
116constexpr auto describeConstructorArguments(const Arg1&& arg1, const Arg2&& arg2, const Arg3&& arg3)
117{
118 return std::make_tuple(
119 std::make_tuple(
120 static_cast<Argument1T*>(nullptr),
121 std::forward<const Arg1>(arg1)),
122 std::make_tuple(
123 static_cast<Argument2T*>(nullptr),
124 std::forward<const Arg2>(arg2)),
125 std::make_tuple(
126 static_cast<Argument3T*>(nullptr),
127 std::forward<const Arg3>(arg3)));
128}
129
136template <
137 typename Argument1T, typename Argument2T, typename Argument3T, typename Argument4T,
138 typename Arg1, typename Arg2, typename Arg3, typename Arg4>
139// Overloaded functions are provided for ease of use
140// coverity[autosar_cpp14_a2_10_5_violation]
141constexpr auto describeConstructorArguments(const Arg1&& arg1, const Arg2&& arg2, const Arg3&& arg3, const Arg4&& arg4)
142{
143 return std::make_tuple(
144 std::make_tuple(
145 static_cast<Argument1T*>(nullptr),
146 std::forward<const Arg1>(arg1)),
147 std::make_tuple(
148 static_cast<Argument2T*>(nullptr),
149 std::forward<const Arg2>(arg2)),
150 std::make_tuple(
151 static_cast<Argument3T*>(nullptr),
152 std::forward<const Arg3>(arg3)),
153 std::make_tuple(
154 static_cast<Argument4T*>(nullptr),
155 std::forward<const Arg4>(arg4)));
156}
157
164template <
165 typename Argument1T, typename Argument2T, typename Argument3T, typename Argument4T, typename Argument5T,
166 typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5>
167// Overloaded functions are provided for ease of use
168// coverity[autosar_cpp14_a2_10_5_violation]
169constexpr auto describeConstructorArguments(const Arg1&& arg1, const Arg2&& arg2, const Arg3&& arg3, const Arg4&& arg4, const Arg5&& arg5)
170{
171 return std::make_tuple(
172 std::make_tuple(
173 static_cast<Argument1T*>(nullptr),
174 std::forward<const Arg1>(arg1)),
175 std::make_tuple(
176 static_cast<Argument2T*>(nullptr),
177 std::forward<const Arg2>(arg2)),
178 std::make_tuple(
179 static_cast<Argument3T*>(nullptr),
180 std::forward<const Arg3>(arg3)),
181 std::make_tuple(
182 static_cast<Argument4T*>(nullptr),
183 std::forward<const Arg4>(arg4)),
184 std::make_tuple(
185 static_cast<Argument5T*>(nullptr),
186 std::forward<const Arg5>(arg5)));
187}
188
195template <
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>
198// Overloaded functions are provided for ease of use
199// coverity[autosar_cpp14_a2_10_5_violation]
200constexpr auto describeConstructorArguments(const Arg1&& arg1, const Arg2&& arg2, const Arg3&& arg3, const Arg4&& arg4, const Arg5&& arg5, const Arg6&& arg6)
201{
202 return std::make_tuple(
203 std::make_tuple(
204 static_cast<Argument1T*>(nullptr),
205 std::forward<const Arg1>(arg1)),
206 std::make_tuple(
207 static_cast<Argument2T*>(nullptr),
208 std::forward<const Arg2>(arg2)),
209 std::make_tuple(
210 static_cast<Argument3T*>(nullptr),
211 std::forward<const Arg3>(arg3)),
212 std::make_tuple(
213 static_cast<Argument4T*>(nullptr),
214 std::forward<const Arg4>(arg4)),
215 std::make_tuple(
216 static_cast<Argument5T*>(nullptr),
217 std::forward<const Arg5>(arg5)),
218 std::make_tuple(
219 static_cast<Argument6T*>(nullptr),
220 std::forward<const Arg6>(arg6)));
221}
222
229template <typename... Args>
230// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
231constexpr auto describeConstructorArgument(const Args&&... args) -> dw::core::Tuple<Args...>
232{
233 return dw::core::make_tuple(
234 std::forward<const Args>(args)...);
235}
236
237// coverity[autosar_cpp14_a14_1_1_violation]
238template <typename Type_, typename SemanticType_, bool IsIndex, size_t ArraySize, bool IsAbstract, bool HasDefault, typename... MemberPointers>
240{
241 dw::core::StringView typeName;
242 dw::core::StringView parameterName;
243 // coverity[autosar_cpp14_a0_1_6_violation]
244 using Type = Type_;
245 // coverity[autosar_cpp14_a0_1_6_violation]
246 using SemanticType = SemanticType_;
247 static constexpr bool IS_INDEX{IsIndex};
248 static constexpr size_t ARRAY_SIZE{ArraySize};
249 static constexpr bool IS_ABSTRACT{IsAbstract};
250 // coverity[autosar_cpp14_a0_1_1_violation] FP: nvbugs/2813925
251 // coverity[autosar_cpp14_m0_1_4_violation] FP: nvbugs/2813925
252 static constexpr bool HAS_DEFAULT{HasDefault};
253 std::tuple<const MemberPointers...> memberPointers;
254
255 constexpr ParameterDescriptorT(dw::core::StringView const&& typeName_, dw::core::StringView const&& parameterName_, const MemberPointers&&... memberPointers_)
256 : typeName{std::move(typeName_)}
257 , parameterName{std::move(parameterName_)}
258 , memberPointers(std::make_tuple<const MemberPointers...>(std::forward<const MemberPointers>(memberPointers_)...))
259 {
260 }
261};
262
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;
265
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;
268
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;
271
272// coverity[autosar_cpp14_a14_1_1_violation]
273template <typename Type, typename SemanticType, bool IsIndex, size_t ArraySize, bool IsAbstract, typename DefaultType, typename... MemberPointers>
274struct ParameterDescriptorWithDefaultT : public ParameterDescriptorT<Type, SemanticType, IsIndex, ArraySize, IsAbstract, true, MemberPointers...>
275{
276 DefaultType defaultValue;
277
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_)...}
280 , defaultValue{std::move(defaultValue_)}
281 {
282 }
283};
284
285} // namespace framework
286} // namespace dw
287
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)
291
292namespace dw
293{
294namespace framework
295{
296
305template <typename T, typename S, typename... MemberPointers>
306// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
307constexpr auto describeParameter(
308 dw::core::StringView const&& typeName, dw::core::StringView const&& parameterName, const MemberPointers&&... memberPointers) -> ParameterDescriptorT<T, S, false, 0, false, false, MemberPointers...>
309{
310 return ParameterDescriptorT<T, S, false, 0, false, false, MemberPointers...>(
311 std::move(typeName),
312 std::move(parameterName),
313 std::forward<const MemberPointers>(memberPointers)...);
314}
315
316} // namespace framework
317} // namespace dw
318
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)
321
322namespace dw
323{
324namespace framework
325{
326
332template <typename T>
334 dw::core::StringView const&& typeName, dw::core::StringView const&& parameterName)
335{
337 std::move(typeName),
338 std::move(parameterName));
339}
340
346template <typename T, size_t ArraySize>
348 dw::core::StringView const&& typeName, dw::core::StringView const&& parameterName)
349{
351 std::move(typeName),
352 std::move(parameterName));
353}
354
355} // namespace framework
356} // namespace dw
357
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)
360
361namespace dw
362{
363namespace framework
364{
365
372template <typename T, typename S, typename... MemberPointers>
374 dw::core::StringView const&& typeName, dw::core::StringView const&& parameterName, const MemberPointers&&... memberPointers)
375{
376 return ParameterDescriptorT<T, S, true, 0, false, false, MemberPointers...>(
377 std::move(typeName),
378 std::move(parameterName),
379 std::forward<const MemberPointers>(memberPointers)...);
380}
381
382} // namespace framework
383} // namespace dw
384
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)
387
388namespace dw
389{
390namespace framework
391{
392
398template <typename T, typename S, size_t ArraySize, typename... MemberPointers>
400 dw::core::StringView const&& typeName, dw::core::StringView const&& parameterName, const MemberPointers&&... memberPointers)
401{
402 return ParameterDescriptorT<T, S, false, ArraySize, false, false, MemberPointers...>(
403 std::move(typeName),
404 std::move(parameterName),
405 std::forward<const MemberPointers>(memberPointers)...);
406}
407
408} // namespace framework
409} // namespace dw
410
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)
413
414namespace dw
415{
416namespace framework
417{
418
425template <typename T, typename S, typename... MemberPointers>
426// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
428 dw::core::StringView const&& typeName, const MemberPointers&&... memberPointers) -> ParameterDescriptorT<T, S, false, 0, false, false, MemberPointers...>
429{
430 // coverity[autosar_cpp14_a5_1_1_violation] FP: nvbugs/3364868
431 // coverity[autosar_cpp14_a5_2_2_violation]
432 return describeParameter<T, S, MemberPointers...>(
433 std::move(typeName),
434 // coverity[autosar_cpp14_a5_1_1_violation]
435 ""_sv,
436 std::forward<const MemberPointers>(memberPointers)...);
437}
438
439} // namespace framework
440} // namespace dw
441
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)
444
445namespace dw
446{
447namespace framework
448{
449
456template <typename T, typename S, size_t ArraySize, typename... MemberPointers>
458 dw::core::StringView const&& typeName, const MemberPointers&&... memberPointers)
459{
460 return describeArrayParameter<T, S, ArraySize>(
461 std::move(typeName),
462 ""_sv,
463 std::forward<const MemberPointers>(memberPointers)...);
464}
465
466} // namespace framework
467} // namespace dw
468
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)
470
471namespace dw
472{
473namespace framework
474{
475
481template <typename T, typename S, typename... MemberPointers>
482// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
484 dw::core::StringView const&& typeName, dw::core::StringView const&& parameterName, T defaultValue, const MemberPointers&&... memberPointers) -> ParameterDescriptorWithDefaultT<T, S, false, 0, false, T, MemberPointers...>
485{
486 return ParameterDescriptorWithDefaultT<T, S, false, 0, false, T, MemberPointers...>(
487 std::move(typeName),
488 std::move(parameterName),
489 std::move(defaultValue),
490 std::forward<const MemberPointers>(memberPointers)...);
491}
492
493} // namespace framework
494} // namespace dw
495
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)
497
498namespace dw
499{
500namespace framework
501{
502
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)
511{
513 std::move(typeName),
514 std::move(parameterName),
515 std::move(defaultValue),
516 std::forward<const MemberPointers>(memberPointers)...);
517}
518
520template <typename NodeT>
521// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
522// coverity[autosar_cpp14_a7_1_5_violation] RFD Accepted: TID-1984
523constexpr auto describeParameters()
524{
526}
527
528namespace detail
529{
530
532template <
533 typename Param, typename MemberPtr,
534 typename std::enable_if_t<!Param::HAS_DEFAULT, void>* = nullptr>
535// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
536void populateDefault(const Param& param, MemberPtr& memberPtr)
537{
538 static_cast<void>(param);
539 static_cast<void>(memberPtr);
540}
541
543template <
544 typename Param, typename MemberPtr,
545 typename std::enable_if_t<Param::HAS_DEFAULT, void>* = nullptr>
546// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
547void populateDefault(const Param& param, MemberPtr& memberPtr)
548{
549 memberPtr = param.defaultValue;
550}
551
553template <
554 typename Param, typename MemberPtr,
555 typename std::enable_if_t<!Param::HAS_DEFAULT, void>* = nullptr>
556// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
557void populateArrayDefault(const Param& param, MemberPtr& memberPtr, size_t index)
558{
559 static_cast<void>(param);
560 static_cast<void>(memberPtr);
561 static_cast<void>(index);
562}
563
565template <
566 typename Param, typename MemberPtr,
567 typename std::enable_if_t<Param::HAS_DEFAULT, void>* = nullptr>
568// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
569void populateArrayDefault(const Param& param, MemberPtr& memberPtr, size_t index)
570{
571 memberPtr[index] = param.defaultValue[index];
572}
573
575template <
576 size_t MemberIndex, typename ArgType, typename MemberPtrs,
577 typename std::enable_if_t<std::tuple_size<MemberPtrs>() == 0, void>* = nullptr>
578// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
579auto getMemberPtr(ArgType& arg, MemberPtrs memberPtrs) -> ArgType&
580{
581 static_cast<void>(memberPtrs);
582 return arg;
583}
584
586template <
587 size_t MemberIndex, typename ArgType, typename MemberPtrs,
588 typename std::enable_if_t<MemberIndex + 1 == std::tuple_size<MemberPtrs>(), void>* = nullptr>
589// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
590// coverity[autosar_cpp14_a7_1_5_violation]
591auto& getMemberPtr(ArgType& arg, MemberPtrs memberPtrs)
592{
593 // coverity[autosar_cpp14_a8_5_2_violation]
594 auto member = std::get<MemberIndex>(memberPtrs);
595 return arg.*member;
596}
597
599template <
600 size_t MemberIndex, typename ArgType, typename MemberPtrs,
601 typename std::enable_if_t<MemberIndex + 1 < std::tuple_size<MemberPtrs>(), void>* = nullptr>
602// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
603auto& getMemberPtr(ArgType& arg, MemberPtrs memberPtrs)
604{
605 auto& member = std::get<MemberIndex>(memberPtrs);
606 auto& m = arg.*member;
607 return getMemberPtr<MemberIndex + 1>(m, memberPtrs);
608}
609
611template <typename NodeT, size_t ConstructorParameterIndex>
612// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
613constexpr size_t constructorArgumentParameterSize()
614{
615 // coverity[autosar_cpp14_a13_5_3_violation]
616 return dw::core::tuple_size<
617 std::tuple_element_t<
619 std::tuple_element_t<
620 ConstructorParameterIndex,
621 decltype(describeParameters<NodeT>())>>>();
622}
623
625template <typename ParamT>
626// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
627constexpr bool isIndexParameter()
628{
629 return ParamT::IS_INDEX;
630}
631
633template <typename ParamT>
634// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
635constexpr bool isArrayParameter()
636{
637 // coverity[autosar_cpp14_a5_1_1_violation] RFD Accepted: TID-2056
638 return ParamT::ARRAY_SIZE > 0U;
639}
640
642template <typename ParamT>
643// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
644constexpr bool isAbstractParameter()
645{
646 return ParamT::IS_ABSTRACT;
647}
648
650template <
651 typename ArgType, typename ParamT,
652 typename std::enable_if_t<isAbstractParameter<ParamT>(), void>* = nullptr>
653// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
654void populateParameter(const ParameterProvider& provider, ArgType& arg, const ParamT& param)
655{
656 static_cast<void>(provider);
657 static_cast<void>(arg);
658 static_cast<void>(param);
659}
660
666template <
667 typename ArgType, typename ParamT,
668 typename std::enable_if_t<!isAbstractParameter<ParamT>() && !isArrayParameter<ParamT>() && !isIndexParameter<ParamT>(), void>* = nullptr>
669// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
670void populateParameter(const ParameterProvider& provider, ArgType& arg, const ParamT& param)
671{
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)};
676 if (!hadParameter)
677 {
678 populateDefault(param, memberPtr);
679 }
680}
681
687template <
688 typename ArgType, typename ParamT,
689 typename std::enable_if_t<!isAbstractParameter<ParamT>() && !isArrayParameter<ParamT>() && isIndexParameter<ParamT>(), void>* = nullptr>
690// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
691void populateParameter(const ParameterProvider& provider, ArgType& arg, const ParamT& param)
692{
693 using DataType = typename ParamT::Type;
694 using SemanticDataType = typename ParamT::SemanticType;
695 DataType& memberPtr = getMemberPtr<0>(arg, param.memberPointers);
696
697 size_t index = static_cast<size_t>(-1);
698 bool hadParameter = provider.getOptional<size_t, size_t>(param.parameterName, &index);
699 if (hadParameter)
700 {
701 hadParameter = provider.getOptional<SemanticDataType, DataType>("", index, &memberPtr);
702 }
703 if (!hadParameter)
704 {
705 populateDefault(param, memberPtr);
706 }
707}
708
714template <
715 typename ArgType, typename ParamT,
716 typename std::enable_if_t<!isAbstractParameter<ParamT>() && isArrayParameter<ParamT>(), void>* = nullptr>
717// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
718void populateParameter(const ParameterProvider& provider, ArgType& arg, const ParamT& param)
719{
720 using DataType = typename ParamT::Type;
721 using SemanticDataType = typename ParamT::SemanticType;
722
723 constexpr size_t arraySize = ParamT::ARRAY_SIZE;
724
725 DataType(&memberPtr)[arraySize] = getMemberPtr<0>(arg, param.memberPointers);
726 for (size_t i = 0; i < arraySize; ++i)
727 {
728 bool hadParameter = provider.getOptional<SemanticDataType, DataType>(param.parameterName, i, &memberPtr[i]);
729 if (!hadParameter)
730 {
731 populateArrayDefault(param, memberPtr, i);
732 }
733 }
734}
735
737template <typename ArgType>
738// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
739void populateParametersRecursion(const ParameterProvider& provider, ArgType& arg, const dw::core::Tuple<>& t)
740{
741 static_cast<void>(provider);
742 static_cast<void>(arg);
743 static_cast<void>(t);
744}
745
747template <typename ArgType, typename THead>
748// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
749void populateParametersRecursion(const ParameterProvider& provider, ArgType& arg, const dw::core::Tuple<THead>& t)
750{
751 populateParameter(provider, arg, t.m_head);
752}
753
755template <
756 typename ArgType, typename THead, typename... TTail,
757 typename std::enable_if_t<sizeof...(TTail) != 0>* = nullptr>
758// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
759void populateParametersRecursion(const ParameterProvider& provider, ArgType& arg, const dw::core::Tuple<THead, TTail...>& t)
760{
761 populateParameter(provider, arg, t.m_head);
762 populateParametersRecursion(provider, arg, t.m_tail);
763}
764
770template <typename NodeT, size_t ConstructorParameterIndex, typename ConstructorArgsType>
771// TODO(dwplc): FP -- The other populateParameters() functions are defined in the parent namespace
772// coverity[autosar_cpp14_a2_10_5_violation]
773void populateParameters(const ParameterProvider& provider, ConstructorArgsType& constructorArguments)
774{
775 try
776 {
777 // coverity[autosar_cpp14_a8_5_2_violation]
778 auto& arg = std::get<ConstructorParameterIndex>(constructorArguments);
779 // coverity[autosar_cpp14_a8_5_2_violation]
780 constexpr auto params = std::get<dw::framework::PARAMETER_CONSTRUCTOR_ARGUMENT_DESCRIPTOR>(
781 std::get<ConstructorParameterIndex>(describeParameters<NodeT>()));
782 // coverity[cert_err59_cpp_violation]
783 populateParametersRecursion(provider, arg, params);
784 }
785 catch (ExceptionWithStatus& e)
786 {
787 throw ExceptionWithStatus(e.statusCode(), "Exception while populating parameters of mangled node type ", typeid(NodeT).name(), ": ", e.message());
788 }
789}
790
791} // namespace detail
792
794template <
795 typename NodeT,
796 class ConstructorArguments,
797 typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 1, void>* = nullptr>
798// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
799void populateParameters(ConstructorArguments& constructorArguments, const ParameterProvider& provider)
800{
801 detail::populateParameters<NodeT, 0>(provider, constructorArguments);
802}
803
805template <
806 typename NodeT,
807 class ConstructorArguments,
808 typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 2, void>* = nullptr>
809// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
810void populateParameters(ConstructorArguments& constructorArguments, const ParameterProvider& provider)
811{
812 detail::populateParameters<NodeT, 0>(provider, constructorArguments);
813 detail::populateParameters<NodeT, 1>(provider, constructorArguments);
814}
815
817template <
818 typename NodeT,
819 class ConstructorArguments,
820 typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 3, void>* = nullptr>
821// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
822void populateParameters(ConstructorArguments& constructorArguments, const ParameterProvider& provider)
823{
824 detail::populateParameters<NodeT, 0>(provider, constructorArguments);
825 detail::populateParameters<NodeT, 1>(provider, constructorArguments);
826 detail::populateParameters<NodeT, 2>(provider, constructorArguments);
827}
828
830template <
831 typename NodeT,
832 class ConstructorArguments,
833 typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 4, void>* = nullptr>
834// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
835void populateParameters(ConstructorArguments& constructorArguments, const ParameterProvider& provider)
836{
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);
841}
842
844template <
845 typename NodeT,
846 class ConstructorArguments,
847 typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 5, void>* = nullptr>
848// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
849void populateParameters(ConstructorArguments& constructorArguments, const ParameterProvider& provider)
850{
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);
856}
857
859template <
860 typename NodeT,
861 class ConstructorArguments,
862 typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 6, void>* = nullptr>
863// Output parameter is needed to populate member of arbitrary struct
864// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
865void populateParameters(ConstructorArguments& constructorArguments, const ParameterProvider& provider)
866{
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);
873}
874
875namespace detail
876{
877
878// Get the Number of constructor arguments of the passed node.
879template <typename NodeT>
880// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
881constexpr std::size_t parameterConstructorArgumentSize()
882{
883 return std::tuple_size<decltype(describeParameters<NodeT>())>::value;
884}
885
887template <
888 typename NodeT, size_t ConstructorArgumentIndex,
889 typename std::enable_if_t<ConstructorArgumentIndex == parameterConstructorArgumentSize<NodeT>(), void>* = nullptr>
890// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
891// coverity[autosar_cpp14_a7_1_5_violation]
893{
894 return std::make_tuple();
895}
896
898template <
899 typename NodeT, size_t ConstructorArgumentIndex,
900 typename std::enable_if_t<ConstructorArgumentIndex<parameterConstructorArgumentSize<NodeT>(), void>* = nullptr>
901 // coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
902 // coverity[autosar_cpp14_a7_1_5_violation]
904{
905 using NodeParams = decltype(describeParameters<NodeT>());
906
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>>;
910 ArgType arg{};
911
912 return std::tuple_cat(std::make_tuple(arg), createConstructorArguments<NodeT, ConstructorArgumentIndex + 1>());
913}
914
915} // namespace detail
916
918template <typename NodeT>
919// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
920// coverity[autosar_cpp14_a7_1_5_violation]
922{
923 return detail::createConstructorArguments<NodeT, 0>();
924}
925
926namespace detail
927{
928
930template <class T, class Tuple, size_t... Is>
931// coverity[autosar_cpp14_a2_10_5_violation] RFD Pending: TID-2053
932auto makeUniqueFromTuple(const Tuple&& tuple, std::index_sequence<Is...>) -> std::unique_ptr<T>
933{
934 // coverity[use_after_move]
935 return std::make_unique<T>(std::get<Is>(std::move(tuple))...);
936}
937}
938
940template <typename NodeT, class ConstructorArguments>
941// coverity[autosar_cpp14_a2_10_5_violation] RFD Pending: TID-2053
942auto makeUniqueFromTuple(const ConstructorArguments&& constructorArguments) -> std::unique_ptr<NodeT>
943{
944 return detail::makeUniqueFromTuple<NodeT>(
945 std::move(constructorArguments),
946 std::make_index_sequence<std::tuple_size<std::decay_t<ConstructorArguments>>::value>{});
947}
948
957template <typename NodeT>
958// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
959auto create(const ParameterProvider& provider) -> std::unique_ptr<NodeT>
960{
961 // coverity[autosar_cpp14_a8_5_2_violation]
962 auto constructorArguments = createConstructorArguments<NodeT>();
963 populateParameters<NodeT>(constructorArguments, provider);
964 return makeUniqueFromTuple<NodeT>(std::move(constructorArguments));
965}
966
967// Number of parameters (sum across all constructor arguments)
968namespace detail
969{
970
972template <
973 typename NodeT, size_t ConstructorArgumentIndex,
974 typename std::enable_if_t<ConstructorArgumentIndex == parameterConstructorArgumentSize<NodeT>(), void>* = nullptr>
975// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
976constexpr std::size_t parameterSize()
977{
978 // coverity[autosar_cpp14_a5_1_1_violation] RFD Accepted: TID-2056
979 return 0U;
980}
981
983template <
984 typename NodeT, size_t ConstructorArgumentIndex,
985 typename std::enable_if_t<ConstructorArgumentIndex<parameterConstructorArgumentSize<NodeT>(), void>* = nullptr>
986 // coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
987 constexpr std::size_t parameterSize()
988{
989 return constructorArgumentParameterSize<NodeT, ConstructorArgumentIndex>() + parameterSize<NodeT, ConstructorArgumentIndex + 1>();
990}
991
992} // namespace detail
993
995template <typename NodeT>
996// coverity[autosar_cpp14_a2_10_5_violation] RFD Pending: TID-2053
997constexpr std::size_t parameterSize()
998{
999 return detail::parameterSize<NodeT, 0>();
1000}
1001
1002} // namespace framework
1003} // namespace dw
1004
1005#endif // DW_FRAMEWORK_PARAMETERDESCRIPTOR_HPP_
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 &&parameterName, const MemberPointers &&... memberPointers)
constexpr auto describeArrayParameterWithDefault(dw::core::StringView const &&typeName, dw::core::StringView const &&parameterName, 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 &&parameterName)
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 &&parameterName, 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 &&parameterName, 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 &&parameterName, 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 &&parameterName)
static constexpr const size_t PARAMETER_CONSTRUCTOR_ARGUMENT_DESCRIPTOR
Definition: Buffer.hpp:40
std::tuple< const MemberPointers... > memberPointers
constexpr ParameterDescriptorT(dw::core::StringView const &&typeName_, dw::core::StringView const &&parameterName_, const MemberPointers &&... memberPointers_)
constexpr ParameterDescriptorWithDefaultT(dw::core::StringView const &&typeName_, dw::core::StringView const &&parameterName_, const DefaultType &&defaultValue_, const MemberPointers &&... memberPointers_)