Compute Graph Framework SDK Reference  5.12
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/Tuple.hpp>
38
39namespace dw
40{
41namespace framework
42{
43
44// Indices within the tuple describing constructor arguments
45// coverity[autosar_cpp14_a0_1_1_violation] FP: nvbugs/2813925
46// coverity[autosar_cpp14_m0_1_4_violation] FP: nvbugs/2813925
47static constexpr const size_t PARAMETER_CONSTRUCTOR_ARGUMENT_TYPE{0U};
48// coverity[autosar_cpp14_a0_1_1_violation] FP: nvbugs/2813925
49// coverity[autosar_cpp14_m0_1_4_violation] RFD Pending: TID-2055
50static constexpr const size_t PARAMETER_CONSTRUCTOR_ARGUMENT_DESCRIPTOR{1U};
51
58constexpr std::tuple<> describeConstructorArguments()
59{
60 return std::make_tuple();
61}
62
69template <
70 typename Argument1T,
71 typename Arg1>
72// Overloaded functions are provided for ease of use
73// coverity[autosar_cpp14_a2_10_5_violation]
74constexpr auto describeConstructorArguments(const Arg1&& arg1)
75{
76 return std::make_tuple(
77 std::make_tuple(
78 static_cast<Argument1T*>(nullptr),
79 std::forward<const Arg1>(arg1)));
80}
81
88template <
89 typename Argument1T, typename Argument2T,
90 typename Arg1, typename Arg2>
91// Overloaded functions are provided for ease of use
92// coverity[autosar_cpp14_a2_10_5_violation]
93constexpr auto describeConstructorArguments(const Arg1&& arg1, const Arg2&& arg2) -> std::tuple<std::tuple<Argument1T*, Arg1>, std::tuple<Argument2T*, Arg2>>
94{
95 return std::make_tuple(
96 std::make_tuple(
97 static_cast<Argument1T*>(nullptr),
98 std::forward<const Arg1>(arg1)),
99 std::make_tuple(
100 static_cast<Argument2T*>(nullptr),
101 std::forward<const Arg2>(arg2)));
102}
103
110template <
111 typename Argument1T, typename Argument2T, typename Argument3T,
112 typename Arg1, typename Arg2, typename Arg3>
113// Overloaded functions are provided for ease of use
114// coverity[autosar_cpp14_a2_10_5_violation]
115constexpr auto describeConstructorArguments(const Arg1&& arg1, const Arg2&& arg2, const Arg3&& arg3)
116{
117 return std::make_tuple(
118 std::make_tuple(
119 static_cast<Argument1T*>(nullptr),
120 std::forward<const Arg1>(arg1)),
121 std::make_tuple(
122 static_cast<Argument2T*>(nullptr),
123 std::forward<const Arg2>(arg2)),
124 std::make_tuple(
125 static_cast<Argument3T*>(nullptr),
126 std::forward<const Arg3>(arg3)));
127}
128
135template <
136 typename Argument1T, typename Argument2T, typename Argument3T, typename Argument4T,
137 typename Arg1, typename Arg2, typename Arg3, typename Arg4>
138// Overloaded functions are provided for ease of use
139// coverity[autosar_cpp14_a2_10_5_violation]
140constexpr auto describeConstructorArguments(const Arg1&& arg1, const Arg2&& arg2, const Arg3&& arg3, const Arg4&& arg4)
141{
142 return std::make_tuple(
143 std::make_tuple(
144 static_cast<Argument1T*>(nullptr),
145 std::forward<const Arg1>(arg1)),
146 std::make_tuple(
147 static_cast<Argument2T*>(nullptr),
148 std::forward<const Arg2>(arg2)),
149 std::make_tuple(
150 static_cast<Argument3T*>(nullptr),
151 std::forward<const Arg3>(arg3)),
152 std::make_tuple(
153 static_cast<Argument4T*>(nullptr),
154 std::forward<const Arg4>(arg4)));
155}
156
163template <
164 typename Argument1T, typename Argument2T, typename Argument3T, typename Argument4T, typename Argument5T,
165 typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5>
166// Overloaded functions are provided for ease of use
167// coverity[autosar_cpp14_a2_10_5_violation]
168constexpr auto describeConstructorArguments(const Arg1&& arg1, const Arg2&& arg2, const Arg3&& arg3, const Arg4&& arg4, const Arg5&& arg5)
169{
170 return std::make_tuple(
171 std::make_tuple(
172 static_cast<Argument1T*>(nullptr),
173 std::forward<const Arg1>(arg1)),
174 std::make_tuple(
175 static_cast<Argument2T*>(nullptr),
176 std::forward<const Arg2>(arg2)),
177 std::make_tuple(
178 static_cast<Argument3T*>(nullptr),
179 std::forward<const Arg3>(arg3)),
180 std::make_tuple(
181 static_cast<Argument4T*>(nullptr),
182 std::forward<const Arg4>(arg4)),
183 std::make_tuple(
184 static_cast<Argument5T*>(nullptr),
185 std::forward<const Arg5>(arg5)));
186}
187
194template <
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>
197// Overloaded functions are provided for ease of use
198// coverity[autosar_cpp14_a2_10_5_violation]
199constexpr auto describeConstructorArguments(const Arg1&& arg1, const Arg2&& arg2, const Arg3&& arg3, const Arg4&& arg4, const Arg5&& arg5, const Arg6&& arg6)
200{
201 return std::make_tuple(
202 std::make_tuple(
203 static_cast<Argument1T*>(nullptr),
204 std::forward<const Arg1>(arg1)),
205 std::make_tuple(
206 static_cast<Argument2T*>(nullptr),
207 std::forward<const Arg2>(arg2)),
208 std::make_tuple(
209 static_cast<Argument3T*>(nullptr),
210 std::forward<const Arg3>(arg3)),
211 std::make_tuple(
212 static_cast<Argument4T*>(nullptr),
213 std::forward<const Arg4>(arg4)),
214 std::make_tuple(
215 static_cast<Argument5T*>(nullptr),
216 std::forward<const Arg5>(arg5)),
217 std::make_tuple(
218 static_cast<Argument6T*>(nullptr),
219 std::forward<const Arg6>(arg6)));
220}
221
228template <typename... Args>
229// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
230constexpr auto describeConstructorArgument(const Args&&... args) -> dw::core::Tuple<Args...>
231{
232 return dw::core::make_tuple(
233 std::forward<const Args>(args)...);
234}
235
236// Indices within the tuple describing parameters
237// coverity[autosar_cpp14_a0_1_1_violation] FP: nvbugs/2813925
238// coverity[autosar_cpp14_m0_1_4_violation] RFD Pending: TID-2055
239static constexpr const size_t PARAMETER_TYPE_NAME{0U};
240// coverity[autosar_cpp14_a0_1_1_violation] FP: nvbugs/2813925
241// coverity[autosar_cpp14_m0_1_4_violation] RFD Pending: TID-2055
242static constexpr const size_t PARAMETER_NAME{1U};
243// coverity[autosar_cpp14_a0_1_1_violation] FP: nvbugs/2813925
244// coverity[autosar_cpp14_m0_1_4_violation] RFD Pending: TID-2055
245static constexpr const size_t PARAMETER_TYPE{2U};
246// coverity[autosar_cpp14_a0_1_1_violation] FP: nvbugs/2813925
247// coverity[autosar_cpp14_m0_1_4_violation] RFD Pending: TID-2055
248static constexpr const size_t PARAMETER_SEMANTIC_TYPE{3U};
249// coverity[autosar_cpp14_a0_1_1_violation] FP: nvbugs/2813925
250// coverity[autosar_cpp14_m0_1_4_violation] RFD Pending: TID-2055
251static constexpr const size_t PARAMETER_IS_INDEX{4U};
252// coverity[autosar_cpp14_a0_1_1_violation] FP: nvbugs/2813925
253// coverity[autosar_cpp14_m0_1_4_violation] RFD Pending: TID-2055
254static constexpr const size_t PARAMETER_ARRAY_SIZE{5U};
255// coverity[autosar_cpp14_a0_1_1_violation] FP: nvbugs/2813925
256// coverity[autosar_cpp14_m0_1_4_violation] RFD Pending: TID-2055
257static constexpr const size_t PARAMETER_MEMBER_PTRS{6U};
258// coverity[autosar_cpp14_a0_1_1_violation] FP: nvbugs/2813925
259// coverity[autosar_cpp14_m0_1_4_violation] RFD Pending: TID-2055
260static constexpr const size_t PARAMETER_DEFAULT_VALUE{7U};
261
262} // namespace framework
263} // namespace dw
264
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)
268
269namespace dw
270{
271namespace framework
272{
273
282template <typename T, typename S, typename... MemberPointers>
283// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
284constexpr auto describeParameter(
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...>>
286{
287 return std::make_tuple(
288 std::move(typeName),
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>(),
294 std::move(
295 std::make_tuple<const MemberPointers...>(std::forward<const MemberPointers>(memberPointers)...)));
296}
297
298} // namespace framework
299} // namespace dw
300
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)
303
304namespace dw
305{
306namespace framework
307{
308
314template <typename T>
316 dw::core::StringView const&& typeName, dw::core::StringView const&& parameterName)
317{
318 return std::make_tuple(
319 std::move(typeName),
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>());
325}
326
332template <typename T, size_t ArraySize>
334 dw::core::StringView const&& typeName, dw::core::StringView const&& parameterName)
335{
336 return std::make_tuple(
337 std::move(typeName),
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>());
343}
344
345} // namespace framework
346} // namespace dw
347
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)
350
351namespace dw
352{
353namespace framework
354{
355
362template <typename T, typename S, typename... MemberPointers>
364 dw::core::StringView const&& typeName, dw::core::StringView const&& parameterName, const MemberPointers&&... memberPointers)
365{
366 return std::make_tuple(
367 std::move(typeName),
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>(),
373 std::move(
374 std::make_tuple<const MemberPointers...>(std::forward<const MemberPointers>(memberPointers)...)));
375}
376
377} // namespace framework
378} // namespace dw
379
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)
382
383namespace dw
384{
385namespace framework
386{
387
393template <typename T, typename S, size_t ArraySize, typename... MemberPointers>
395 dw::core::StringView const&& typeName, dw::core::StringView const&& parameterName, const MemberPointers&&... memberPointers)
396{
397 return std::make_tuple(
398 std::move(typeName),
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>(),
404 std::move(
405 std::make_tuple<const MemberPointers...>(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) -> 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...>>
429{
430 // coverity[autosar_cpp14_a5_1_1_violation]
431 // coverity[autosar_cpp14_a5_2_2_violation]
432 return describeParameter<T, S>(
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) -> 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>
485{
486 return std::make_tuple(
487 std::move(typeName),
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>(),
493 std::move(
494 std::make_tuple<const MemberPointers...>(std::forward<const MemberPointers>(memberPointers)...)),
495 std::move(defaultValue));
496}
497
498} // namespace framework
499} // namespace dw
500
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)
502
503namespace dw
504{
505namespace framework
506{
507
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)
516{
517 return std::make_tuple(
518 std::move(typeName),
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>(),
524 std::move(
525 std::make_tuple<const MemberPointers...>(std::forward<const MemberPointers>(memberPointers)...)),
526 std::move(defaultValue));
527}
528
530template <typename NodeT>
531// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
532// coverity[autosar_cpp14_a7_1_5_violation] RFD Accepted: TID-1984
533constexpr auto describeParameters()
534{
536}
537
538namespace detail
539{
540
542template <
543 typename Param, typename MemberPtr,
544 typename std::enable_if_t<std::tuple_size<Param>() <= PARAMETER_DEFAULT_VALUE, void>* = nullptr>
545// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
546void populateDefault(const Param& param, MemberPtr& memberPtr)
547{
548 static_cast<void>(param);
549 static_cast<void>(memberPtr);
550}
551
553template <
554 typename Param, typename MemberPtr,
555 typename std::enable_if_t<PARAMETER_DEFAULT_VALUE<std::tuple_size<Param>(), void>* = nullptr>
556 // coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
557 void populateDefault(const Param& param, MemberPtr& memberPtr)
558{
559 // coverity[autosar_cpp14_a8_5_2_violation]
560 auto defaultValue = std::get<PARAMETER_DEFAULT_VALUE>(param);
561 memberPtr = defaultValue;
562}
563
565template <
566 typename Param, typename MemberPtr,
567 typename std::enable_if_t<std::tuple_size<Param>() <= PARAMETER_DEFAULT_VALUE, void>* = nullptr>
568void populateArrayDefault(const Param& param, MemberPtr& memberPtr, size_t index)
569{
570 static_cast<void>(param);
571 static_cast<void>(memberPtr);
572 static_cast<void>(index);
573}
574
576template <
577 typename Param, typename MemberPtr,
578 typename std::enable_if_t<PARAMETER_DEFAULT_VALUE<std::tuple_size<Param>(), void>* = nullptr>
579 // coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
580 void populateArrayDefault(const Param& param, MemberPtr& memberPtr, size_t index)
581{
582 auto defaultValue = std::get<PARAMETER_DEFAULT_VALUE>(param);
583 memberPtr[index] = defaultValue[index];
584}
585
587template <
588 size_t MemberIndex, typename ArgType, typename MemberPtrs,
589 typename std::enable_if_t<std::tuple_size<MemberPtrs>() == 0, void>* = nullptr>
590// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
591auto getMemberPtr(ArgType& arg, MemberPtrs memberPtrs) -> ArgType&
592{
593 static_cast<void>(memberPtrs);
594 return arg;
595}
596
598template <
599 size_t MemberIndex, typename ArgType, typename MemberPtrs,
600 typename std::enable_if_t<MemberIndex + 1 == std::tuple_size<MemberPtrs>(), void>* = nullptr>
601// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
602// coverity[autosar_cpp14_a7_1_5_violation]
603auto& getMemberPtr(ArgType& arg, MemberPtrs memberPtrs)
604{
605 // coverity[autosar_cpp14_a8_5_2_violation]
606 auto member = std::get<MemberIndex>(memberPtrs);
607 return arg.*member;
608}
609
611template <
612 size_t MemberIndex, typename ArgType, typename MemberPtrs,
613 typename std::enable_if_t<MemberIndex + 1 < std::tuple_size<MemberPtrs>(), void>* = nullptr>
614// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
615auto& getMemberPtr(ArgType& arg, MemberPtrs memberPtrs)
616{
617 auto& member = std::get<MemberIndex>(memberPtrs);
618 auto& m = arg.*member;
619 return getMemberPtr<MemberIndex + 1>(m, memberPtrs);
620}
621
623template <typename NodeT, size_t ConstructorParameterIndex>
624// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
625constexpr size_t constructorArgumentParameterSize()
626{
627 // coverity[autosar_cpp14_a13_5_3_violation]
628 return dw::core::tuple_size<
629 std::tuple_element_t<
631 std::tuple_element_t<
632 ConstructorParameterIndex,
633 decltype(describeParameters<NodeT>())>>>();
634}
635
637template <typename ParamT>
638// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
639constexpr bool isIndexParameter()
640{
641 return std::tuple_element_t<PARAMETER_IS_INDEX, ParamT>::value;
642}
643
645template <typename ParamT>
646// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
647constexpr bool isArrayParameter()
648{
649 // coverity[autosar_cpp14_a5_1_1_violation] RFD Accepted: TID-2056
650 return std::tuple_element_t<PARAMETER_ARRAY_SIZE, ParamT>::value > 0U;
651}
652
654template <typename ParamT>
655// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
656constexpr bool isAbstractParameter()
657{
658 return std::tuple_size<ParamT>::value <= PARAMETER_MEMBER_PTRS;
659}
660
662template <
663 typename ArgType, typename ParamT,
664 typename std::enable_if_t<isAbstractParameter<ParamT>(), void>* = nullptr>
665// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
666void populateParameter(const ParameterProvider& provider, ArgType& arg, const ParamT& param)
667{
668 (void)provider;
669 (void)arg;
670 (void)param;
671}
672
678template <
679 typename ArgType, typename ParamT,
680 typename std::enable_if_t<!isAbstractParameter<ParamT>() && !isArrayParameter<ParamT>() && !isIndexParameter<ParamT>(), void>* = nullptr>
681// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
682void populateParameter(const ParameterProvider& provider, ArgType& arg, const ParamT& param)
683{
684 using DataType = std::remove_pointer_t<
685 std::tuple_element_t<
686 PARAMETER_TYPE, ParamT>>;
687 using SemanticDataType = std::remove_pointer_t<
688 std::tuple_element_t<
689 PARAMETER_SEMANTIC_TYPE, ParamT>>;
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)};
692 if (!hadParameter)
693 {
694 populateDefault(param, memberPtr);
695 }
696}
697
703template <
704 typename ArgType, typename ParamT,
705 typename std::enable_if_t<!isAbstractParameter<ParamT>() && !isArrayParameter<ParamT>() && isIndexParameter<ParamT>(), void>* = nullptr>
706// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
707void populateParameter(const ParameterProvider& provider, ArgType& arg, const ParamT& param)
708{
709 using DataType = std::remove_pointer_t<
710 std::tuple_element_t<
711 PARAMETER_TYPE, ParamT>>;
712 using SemanticDataType = std::remove_pointer_t<
713 std::tuple_element_t<
714 PARAMETER_SEMANTIC_TYPE, ParamT>>;
715 DataType& memberPtr = getMemberPtr<0>(arg, std::get<PARAMETER_MEMBER_PTRS>(param));
716
717 size_t index = static_cast<size_t>(-1);
718 bool hadParameter = provider.getOptional<size_t, size_t>(std::get<PARAMETER_NAME>(param), &index);
719 if (hadParameter)
720 {
721 hadParameter = provider.getOptional<SemanticDataType, DataType>("", index, &memberPtr);
722 }
723 if (!hadParameter)
724 {
725 populateDefault(param, memberPtr);
726 }
727}
728
734template <
735 typename ArgType, typename ParamT,
736 typename std::enable_if_t<!isAbstractParameter<ParamT>() && isArrayParameter<ParamT>(), void>* = nullptr>
737// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
738void populateParameter(const ParameterProvider& provider, ArgType& arg, const ParamT& param)
739{
740 using DataType = std::remove_pointer_t<
741 std::tuple_element_t<
742 PARAMETER_TYPE, ParamT>>;
743 using SemanticDataType = std::remove_pointer_t<
744 std::tuple_element_t<
745 PARAMETER_SEMANTIC_TYPE, ParamT>>;
746
747 constexpr size_t arraySize = std::tuple_element_t<PARAMETER_ARRAY_SIZE, ParamT>::value;
748
749 DataType(&memberPtr)[arraySize] = getMemberPtr<0>(arg, std::get<PARAMETER_MEMBER_PTRS>(param));
750 for (size_t i = 0; i < arraySize; ++i)
751 {
752 bool hadParameter = provider.getOptional<SemanticDataType, DataType>(std::get<PARAMETER_NAME>(param), i, &memberPtr[i]);
753 if (!hadParameter)
754 {
755 populateArrayDefault(param, memberPtr, i);
756 }
757 }
758}
759
761template <typename ArgType>
762// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
763void populateParametersRecursion(const ParameterProvider& provider, ArgType& arg, const dw::core::Tuple<>& t)
764{
765 (void)provider;
766 (void)arg;
767 (void)t;
768}
769
771template <typename ArgType, typename THead>
772// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
773void populateParametersRecursion(const ParameterProvider& provider, ArgType& arg, const dw::core::Tuple<THead>& t)
774{
775 populateParameter(provider, arg, t.m_head);
776}
777
779template <
780 typename ArgType, typename THead, typename... TTail,
781 typename std::enable_if_t<sizeof...(TTail) != 0>* = nullptr>
782// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
783void populateParametersRecursion(const ParameterProvider& provider, ArgType& arg, const dw::core::Tuple<THead, TTail...>& t)
784{
785 populateParameter(provider, arg, t.m_head);
786 populateParametersRecursion(provider, arg, t.m_tail);
787}
788
794template <typename NodeT, size_t ConstructorParameterIndex, typename ConstructorArgsType>
795// TODO(dwplc): FP -- The other populateParameters() functions are defined in the parent namespace
796// coverity[autosar_cpp14_a2_10_5_violation]
797void populateParameters(const ParameterProvider& provider, ConstructorArgsType& constructorArguments)
798{
799 try
800 {
801 // coverity[autosar_cpp14_a8_5_2_violation]
802 auto& arg = std::get<ConstructorParameterIndex>(constructorArguments);
803 // coverity[autosar_cpp14_a8_5_2_violation]
804 constexpr auto params = std::get<dw::framework::PARAMETER_CONSTRUCTOR_ARGUMENT_DESCRIPTOR>(
805 std::get<ConstructorParameterIndex>(describeParameters<NodeT>()));
806 // coverity[cert_err59_cpp_violation]
807 populateParametersRecursion(provider, arg, params);
808 }
809 catch (ExceptionWithStatus& e)
810 {
811 throw ExceptionWithStatus(e.statusCode(), "Exception while populating parameters of mangled node type ", typeid(NodeT).name(), ": ", e.message());
812 }
813}
814
815} // namespace detail
816
818template <
819 typename NodeT,
820 class ConstructorArguments,
821 typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 1, void>* = nullptr>
822// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
823void populateParameters(ConstructorArguments& constructorArguments, const ParameterProvider& provider)
824{
825 detail::populateParameters<NodeT, 0>(provider, constructorArguments);
826}
827
829template <
830 typename NodeT,
831 class ConstructorArguments,
832 typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 2, void>* = nullptr>
833// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
834void populateParameters(ConstructorArguments& constructorArguments, const ParameterProvider& provider)
835{
836 detail::populateParameters<NodeT, 0>(provider, constructorArguments);
837 detail::populateParameters<NodeT, 1>(provider, constructorArguments);
838}
839
841template <
842 typename NodeT,
843 class ConstructorArguments,
844 typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 3, void>* = nullptr>
845// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
846void populateParameters(ConstructorArguments& constructorArguments, const ParameterProvider& provider)
847{
848 detail::populateParameters<NodeT, 0>(provider, constructorArguments);
849 detail::populateParameters<NodeT, 1>(provider, constructorArguments);
850 detail::populateParameters<NodeT, 2>(provider, constructorArguments);
851}
852
854template <
855 typename NodeT,
856 class ConstructorArguments,
857 typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 4, void>* = nullptr>
858// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
859void populateParameters(ConstructorArguments& constructorArguments, const ParameterProvider& provider)
860{
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);
865}
866
868template <
869 typename NodeT,
870 class ConstructorArguments,
871 typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 5, void>* = nullptr>
872// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
873void populateParameters(ConstructorArguments& constructorArguments, const ParameterProvider& provider)
874{
875
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);
881}
882
884template <
885 typename NodeT,
886 class ConstructorArguments,
887 typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 6, void>* = nullptr>
888// Output parameter is needed to populate member of arbitrary struct
889// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
890void populateParameters(ConstructorArguments& constructorArguments, const ParameterProvider& provider)
891{
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);
898}
899
900namespace detail
901{
902
903// Get the Number of constructor arguments of the passed node.
904template <typename NodeT>
905// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
906constexpr std::size_t parameterConstructorArgumentSize()
907{
908 return std::tuple_size<decltype(describeParameters<NodeT>())>::value;
909}
910
912template <
913 typename NodeT, size_t ConstructorArgumentIndex,
914 typename std::enable_if_t<ConstructorArgumentIndex == parameterConstructorArgumentSize<NodeT>(), void>* = nullptr>
915// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
916// coverity[autosar_cpp14_a7_1_5_violation]
918{
919 return std::make_tuple();
920}
921
923template <
924 typename NodeT, size_t ConstructorArgumentIndex,
925 typename std::enable_if_t<ConstructorArgumentIndex<parameterConstructorArgumentSize<NodeT>(), void>* = nullptr>
926 // coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
927 // coverity[autosar_cpp14_a7_1_5_violation]
929{
930 using NodeParams = decltype(describeParameters<NodeT>());
931
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>>;
935 ArgType arg{};
936
937 return std::tuple_cat(std::make_tuple(arg), createConstructorArguments<NodeT, ConstructorArgumentIndex + 1>());
938}
939
940} // namespace detail
941
943template <typename NodeT>
944// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
945// coverity[autosar_cpp14_a7_1_5_violation]
947{
948 return detail::createConstructorArguments<NodeT, 0>();
949}
950
951namespace detail
952{
953
955template <class T, class Tuple, size_t... Is>
956// coverity[autosar_cpp14_a2_10_5_violation] RFD Pending: TID-2053
957auto makeUniqueFromTuple(const Tuple&& tuple, std::index_sequence<Is...>) -> std::unique_ptr<T>
958{
959 // coverity[use_after_move]
960 return std::unique_ptr<T>(new T{std::get<Is>(std::move(tuple))...});
961}
962}
963
965template <typename NodeT, class ConstructorArguments>
966// coverity[autosar_cpp14_a2_10_5_violation] RFD Pending: TID-2053
967auto makeUniqueFromTuple(const ConstructorArguments&& constructorArguments) -> std::unique_ptr<NodeT>
968{
969 return detail::makeUniqueFromTuple<NodeT>(
970 std::move(constructorArguments),
971 std::make_index_sequence<std::tuple_size<std::decay_t<ConstructorArguments>>::value>{});
972}
973
982template <typename NodeT>
983// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
984auto create(const ParameterProvider& provider) -> std::unique_ptr<NodeT>
985{
986 // coverity[autosar_cpp14_a8_5_2_violation]
987 auto constructorArguments = createConstructorArguments<NodeT>();
988 populateParameters<NodeT>(constructorArguments, provider);
989 return makeUniqueFromTuple<NodeT>(std::move(constructorArguments));
990}
991
992// Number of parameters (sum across all constructor arguments)
993namespace detail
994{
995
997template <
998 typename NodeT, size_t ConstructorArgumentIndex,
999 typename std::enable_if_t<ConstructorArgumentIndex == parameterConstructorArgumentSize<NodeT>(), void>* = nullptr>
1000// coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
1001constexpr std::size_t parameterSize()
1002{
1003 // coverity[autosar_cpp14_a5_1_1_violation] RFD Accepted: TID-2056
1004 return 0U;
1005}
1006
1008template <
1009 typename NodeT, size_t ConstructorArgumentIndex,
1010 typename std::enable_if_t<ConstructorArgumentIndex<parameterConstructorArgumentSize<NodeT>(), void>* = nullptr>
1011 // coverity[autosar_cpp14_a2_10_5_violation] FP: nvbugs/3907242
1012 constexpr std::size_t parameterSize()
1013{
1014 return constructorArgumentParameterSize<NodeT, ConstructorArgumentIndex>() + parameterSize<NodeT, ConstructorArgumentIndex + 1>();
1015}
1016
1017} // namespace detail
1018
1020template <typename NodeT>
1021// coverity[autosar_cpp14_a2_10_5_violation] RFD Pending: TID-2053
1022constexpr std::size_t parameterSize()
1023{
1024 return detail::parameterSize<NodeT, 0>();
1025}
1026
1027} // namespace framework
1028} // namespace dw
1029
1030#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 describeParameter(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... > >
constexpr auto describeUnnamedArrayParameter(dw::core::StringView const &&typeName, const MemberPointers &&... memberPointers)
constexpr auto describeAbstractParameter(dw::core::StringView const &&typeName, dw::core::StringView const &&parameterName)
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 &&parameterName, 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 &&parameterName)
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 &&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 >
Definition: Buffer.hpp:40