Compute Graph Framework SDK Reference
5.4.5418 Release
For Test and Development only

ParameterDescriptor.hpp
Go to the documentation of this file.
1 //
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-2022 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 <dw/core/container/StringView.hpp>
37 #include <dw/core/language/Tuple.hpp>
38 
39 namespace dw
40 {
41 namespace framework
42 {
43 
44 // Indices within the tuple describing constructor arguments
45 // coverity[autosar_cpp14_a0_1_1_violation]
46 // coverity[autosar_cpp14_m0_1_4_violation]
47 static constexpr size_t PARAMETER_CONSTRUCTOR_ARGUMENT_TYPE{0U};
48 // coverity[autosar_cpp14_a0_1_1_violation]
49 // coverity[autosar_cpp14_m0_1_4_violation]
50 static constexpr size_t PARAMETER_CONSTRUCTOR_ARGUMENT_DESCRIPTOR{1U};
51 
58 constexpr std::tuple<> describeConstructorArguments()
59 {
60  return std::make_tuple();
61 }
62 
69 template <
70  typename Argument1T,
71  typename Arg1>
72 // coverity[autosar_cpp14_a13_3_1_violation]
73 constexpr auto describeConstructorArguments(const Arg1&& arg1)
74 {
75  return std::make_tuple(
76  std::make_tuple(
77  static_cast<Argument1T*>(nullptr),
78  std::forward<const Arg1>(arg1)));
79 }
80 
87 template <
88  typename Argument1T, typename Argument2T,
89  typename Arg1, typename Arg2>
90 // coverity[autosar_cpp14_a13_3_1_violation]
91 constexpr auto describeConstructorArguments(const Arg1&& arg1, const Arg2&& arg2)
92 {
93  return std::make_tuple(
94  std::make_tuple(
95  static_cast<Argument1T*>(nullptr),
96  std::forward<const Arg1>(arg1)),
97  std::make_tuple(
98  static_cast<Argument2T*>(nullptr),
99  std::forward<const Arg2>(arg2)));
100 }
101 
108 template <
109  typename Argument1T, typename Argument2T, typename Argument3T,
110  typename Arg1, typename Arg2, typename Arg3>
111 // coverity[autosar_cpp14_a13_3_1_violation]
112 constexpr auto describeConstructorArguments(const Arg1&& arg1, const Arg2&& arg2, const Arg3&& arg3)
113 {
114  return std::make_tuple(
115  std::make_tuple(
116  static_cast<Argument1T*>(nullptr),
117  std::forward<const Arg1>(arg1)),
118  std::make_tuple(
119  static_cast<Argument2T*>(nullptr),
120  std::forward<const Arg2>(arg2)),
121  std::make_tuple(
122  static_cast<Argument3T*>(nullptr),
123  std::forward<const Arg3>(arg3)));
124 }
125 
132 template <
133  typename Argument1T, typename Argument2T, typename Argument3T, typename Argument4T,
134  typename Arg1, typename Arg2, typename Arg3, typename Arg4>
135 // coverity[autosar_cpp14_a13_3_1_violation]
136 constexpr auto describeConstructorArguments(const Arg1&& arg1, const Arg2&& arg2, const Arg3&& arg3, const Arg4&& arg4)
137 {
138  return std::make_tuple(
139  std::make_tuple(
140  static_cast<Argument1T*>(nullptr),
141  std::forward<const Arg1>(arg1)),
142  std::make_tuple(
143  static_cast<Argument2T*>(nullptr),
144  std::forward<const Arg2>(arg2)),
145  std::make_tuple(
146  static_cast<Argument3T*>(nullptr),
147  std::forward<const Arg3>(arg3)),
148  std::make_tuple(
149  static_cast<Argument4T*>(nullptr),
150  std::forward<const Arg4>(arg4)));
151 }
152 
159 template <
160  typename Argument1T, typename Argument2T, typename Argument3T, typename Argument4T, typename Argument5T,
161  typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5>
162 // coverity[autosar_cpp14_a13_3_1_violation]
163 constexpr auto describeConstructorArguments(const Arg1&& arg1, const Arg2&& arg2, const Arg3&& arg3, const Arg4&& arg4, const Arg5&& arg5)
164 {
165  return std::make_tuple(
166  std::make_tuple(
167  static_cast<Argument1T*>(nullptr),
168  std::forward<const Arg1>(arg1)),
169  std::make_tuple(
170  static_cast<Argument2T*>(nullptr),
171  std::forward<const Arg2>(arg2)),
172  std::make_tuple(
173  static_cast<Argument3T*>(nullptr),
174  std::forward<const Arg3>(arg3)),
175  std::make_tuple(
176  static_cast<Argument4T*>(nullptr),
177  std::forward<const Arg4>(arg4)),
178  std::make_tuple(
179  static_cast<Argument5T*>(nullptr),
180  std::forward<const Arg5>(arg5)));
181 }
182 
189 template <typename... Args>
190 constexpr auto describeConstructorArgument(const Args&&... args)
191 {
192  return dw::core::make_tuple(
193  std::forward<const Args>(args)...);
194 }
195 
196 // Indices within the tuple describing parameters
197 // coverity[autosar_cpp14_a0_1_1_violation]
198 // coverity[autosar_cpp14_m0_1_4_violation]
199 static constexpr size_t PARAMETER_TYPE_NAME{0U};
200 // coverity[autosar_cpp14_a0_1_1_violation]
201 // coverity[autosar_cpp14_m0_1_4_violation]
202 static constexpr size_t PARAMETER_NAME{1U};
203 // coverity[autosar_cpp14_a0_1_1_violation]
204 // coverity[autosar_cpp14_m0_1_4_violation]
205 static constexpr size_t PARAMETER_TYPE{2U};
206 // coverity[autosar_cpp14_a0_1_1_violation]
207 // coverity[autosar_cpp14_m0_1_4_violation]
208 static constexpr size_t PARAMETER_SEMANTIC_TYPE{3U};
209 // coverity[autosar_cpp14_a0_1_1_violation]
210 // coverity[autosar_cpp14_m0_1_4_violation]
211 static constexpr size_t PARAMETER_IS_INDEX{4U};
212 // coverity[autosar_cpp14_a0_1_1_violation]
213 // coverity[autosar_cpp14_m0_1_4_violation]
214 static constexpr size_t PARAMETER_ARRAY_SIZE{5U};
215 // coverity[autosar_cpp14_a0_1_1_violation]
216 // coverity[autosar_cpp14_m0_1_4_violation]
217 static constexpr size_t PARAMETER_MEMBER_PTRS{6U};
218 // coverity[autosar_cpp14_a0_1_1_violation]
219 // coverity[autosar_cpp14_m0_1_4_violation]
220 static constexpr size_t PARAMETER_DEFAULT_VALUE{7U};
221 
222 } // namespace framework
223 } // namespace dw
224 
225 #define _DW_PARAMETER_TYPE_NAME_STRING_VIEW(TYPE_NAME_STR) TYPE_NAME_STR##_sv
226 // TODO(dwplc): FP -- Cannot enclose template type in parentheses
227 // the macro must perform stringification of the type as well as accept an arbitrary number of member pointers
228 // coverity[autosar_cpp14_m16_0_6_violation]
229 // coverity[autosar_cpp14_m16_3_1_violation]
230 #define DW_DESCRIBE_PARAMETER(TYPE_NAME, args...) dw::framework::describeParameter<TYPE_NAME, TYPE_NAME>(_DW_PARAMETER_TYPE_NAME_STRING_VIEW(#TYPE_NAME), ##args)
231 // TODO(dwplc): FP -- Cannot enclose template type in parentheses
232 // the macro must perform stringification of the type as well as accept an arbitrary number of member pointers
233 // coverity[autosar_cpp14_m16_0_6_violation]
234 // coverity[autosar_cpp14_m16_3_1_violation]
235 #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)
236 
237 namespace dw
238 {
239 namespace framework
240 {
241 
250 template <typename T, typename S, typename... MemberPointers>
251 constexpr auto describeParameter(
252  dw::core::StringView const&& typeName, dw::core::StringView const&& parameterName, const MemberPointers&&... memberPointers)
253 {
254  return std::make_tuple(
255  std::move(typeName),
256  std::move(parameterName),
257  static_cast<T*>(nullptr),
258  static_cast<S*>(nullptr),
259  false,
260  static_cast<size_t>(0),
261  std::move(
262  std::make_tuple<const MemberPointers...>(std::forward<const MemberPointers>(memberPointers)...)));
263 }
264 
265 } // namespace framework
266 } // namespace dw
267 
268 // TODO(dwplc): FP -- Cannot enclose template type in parentheses
269 // the macro must perform stringification of the type as well as accept an arbitrary number of member pointers
270 // coverity[autosar_cpp14_m16_0_6_violation]
271 // coverity[autosar_cpp14_m16_3_1_violation]
272 #define DW_DESCRIBE_ABSTRACT_PARAMETER(TYPE_NAME, args...) dw::framework::describeAbstractParameter<TYPE_NAME>(_DW_PARAMETER_TYPE_NAME_STRING_VIEW(#TYPE_NAME), ##args)
273 // TODO(dwplc): FP -- Cannot enclose template type in parentheses
274 // the macro must perform stringification of the type as well as accept an arbitrary number of member pointers
275 // coverity[autosar_cpp14_m16_0_6_violation]
276 // coverity[autosar_cpp14_m16_3_1_violation]
277 #define DW_DESCRIBE_ABSTRACT_ARRAY_PARAMETER(TYPE_NAME, args...) dw::framework::describeAbstractArrayParameter<TYPE_NAME>(_DW_PARAMETER_TYPE_NAME_STRING_VIEW(#TYPE_NAME), ##args)
278 
279 namespace dw
280 {
281 namespace framework
282 {
283 
289 template <typename T>
291  dw::core::StringView const&& typeName, dw::core::StringView const&& parameterName)
292 {
293  return std::make_tuple(
294  std::move(typeName),
295  std::move(parameterName),
296  static_cast<T*>(nullptr),
297  static_cast<T*>(nullptr),
298  false,
299  static_cast<size_t>(0));
300 }
301 
307 template <typename T>
309  dw::core::StringView const&& typeName, dw::core::StringView const&& parameterName, size_t arraySize)
310 {
311  return std::make_tuple(
312  std::move(typeName),
313  std::move(parameterName),
314  static_cast<T*>(nullptr),
315  static_cast<T*>(nullptr),
316  false,
317  arraySize);
318 }
319 
320 } // namespace framework
321 } // namespace dw
322 
323 // TODO(dwplc): FP -- Cannot enclose template type in parentheses
324 // the macro must perform stringification of the type as well as accept an arbitrary number of member pointers
325 // coverity[autosar_cpp14_m16_0_6_violation]
326 // coverity[autosar_cpp14_m16_3_1_violation]
327 #define DW_DESCRIBE_INDEX_PARAMETER(TYPE_NAME, args...) dw::framework::describeIndexParameter<TYPE_NAME, TYPE_NAME>(_DW_PARAMETER_TYPE_NAME_STRING_VIEW(#TYPE_NAME), ##args)
328 // TODO(dwplc): FP -- Cannot enclose template type in parentheses
329 // the macro must perform stringification of the type as well as accept an arbitrary number of member pointers
330 // coverity[autosar_cpp14_m16_0_6_violation]
331 // coverity[autosar_cpp14_m16_3_1_violation]
332 #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)
333 
334 namespace dw
335 {
336 namespace framework
337 {
338 
345 template <typename T, typename S, typename... MemberPointers>
346 constexpr auto describeIndexParameter(
347  dw::core::StringView const&& typeName, dw::core::StringView const&& parameterName, const MemberPointers&&... memberPointers)
348 {
349  return std::make_tuple(
350  std::move(typeName),
351  std::move(parameterName),
352  static_cast<T*>(nullptr),
353  static_cast<S*>(nullptr),
354  true,
355  static_cast<size_t>(0),
356  std::move(
357  std::make_tuple<const MemberPointers...>(std::forward<const MemberPointers>(memberPointers)...)));
358 }
359 
360 } // namespace framework
361 } // namespace dw
362 
363 // TODO(dwplc): FP -- Cannot enclose template type in parentheses
364 // the macro must perform stringification of the type as well as accept an arbitrary number of member pointers
365 // coverity[autosar_cpp14_m16_0_6_violation]
366 // coverity[autosar_cpp14_m16_3_1_violation]
367 #define DW_DESCRIBE_ARRAY_PARAMETER(TYPE_NAME, args...) dw::framework::describeArrayParameter<TYPE_NAME, TYPE_NAME>(_DW_PARAMETER_TYPE_NAME_STRING_VIEW(#TYPE_NAME), ##args)
368 // TODO(dwplc): FP -- Cannot enclose template type in parentheses
369 // the macro must perform stringification of the type as well as accept an arbitrary number of member pointers
370 // coverity[autosar_cpp14_m16_0_6_violation]
371 // coverity[autosar_cpp14_m16_3_1_violation]
372 #define DW_DESCRIBE_ARRAY_PARAMETER_WITH_SEMANTIC(TYPE_NAME, SEMANTIC_TYPE_NAME, args...) dw::framework::describeArrayParameter<TYPE_NAME, SEMANTIC_TYPE_NAME>(_DW_PARAMETER_TYPE_NAME_STRING_VIEW(#TYPE_NAME), ##args)
373 
374 namespace dw
375 {
376 namespace framework
377 {
378 
384 template <typename T, typename S, typename... MemberPointers>
385 constexpr auto describeArrayParameter(
386  dw::core::StringView const&& typeName, dw::core::StringView const&& parameterName, size_t arraySize, const MemberPointers&&... memberPointers)
387 {
388  return std::make_tuple(
389  std::move(typeName),
390  std::move(parameterName),
391  static_cast<T*>(nullptr),
392  static_cast<S*>(nullptr),
393  false,
394  arraySize,
395  std::move(
396  std::make_tuple<const MemberPointers...>(std::forward<const MemberPointers>(memberPointers)...)));
397 }
398 
399 } // namespace framework
400 } // namespace dw
401 
402 // TODO(dwplc): FP -- Cannot enclose template type in parentheses
403 // the macro must perform stringification of the type as well as accept an arbitrary number of member pointers
404 // coverity[autosar_cpp14_m16_0_6_violation]
405 // coverity[autosar_cpp14_m16_3_1_violation]
406 #define DW_DESCRIBE_UNNAMED_PARAMETER(TYPE_NAME, args...) dw::framework::describeUnnamedParameter<TYPE_NAME, TYPE_NAME>(_DW_PARAMETER_TYPE_NAME_STRING_VIEW(#TYPE_NAME), ##args)
407 // TODO(dwplc): FP -- Cannot enclose template type in parentheses
408 // the macro must perform stringification of the type as well as accept an arbitrary number of member pointers
409 // coverity[autosar_cpp14_m16_0_6_violation]
410 // coverity[autosar_cpp14_m16_3_1_violation]
411 #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)
412 
413 namespace dw
414 {
415 namespace framework
416 {
417 
424 template <typename T, typename S, typename... MemberPointers>
426  dw::core::StringView const&& typeName, const MemberPointers&&... memberPointers)
427 {
428  return describeParameter<T, S>(
429  std::move(typeName),
430  ""_sv,
431  std::forward<const MemberPointers>(memberPointers)...);
432 }
433 
434 } // namespace framework
435 } // namespace dw
436 
437 // TODO(dwplc): FP -- Cannot enclose template type in parentheses
438 // the macro must perform stringification of the type as well as accept an arbitrary number of member pointers
439 // coverity[autosar_cpp14_m16_0_6_violation]
440 // coverity[autosar_cpp14_m16_3_1_violation]
441 #define DW_DESCRIBE_UNNAMED_ARRAY_PARAMETER(TYPE_NAME, args...) dw::framework::describeUnnamedArrayParameter<TYPE_NAME, TYPE_NAME>(_DW_PARAMETER_TYPE_NAME_STRING_VIEW(#TYPE_NAME), ##args)
442 // TODO(dwplc): FP -- Cannot enclose template type in parentheses
443 // the macro must perform stringification of the type as well as accept an arbitrary number of member pointers
444 // coverity[autosar_cpp14_m16_0_6_violation]
445 // coverity[autosar_cpp14_m16_3_1_violation]
446 #define DW_DESCRIBE_UNNAMED_ARRAY_PARAMETER_WITH_SEMANTIC(TYPE_NAME, SEMANTIC_TYPE_NAME, args...) dw::framework::describeUnnamedArrayParameter<TYPE_NAME, SEMANTIC_TYPE_NAME>(_DW_PARAMETER_TYPE_NAME_STRING_VIEW(#TYPE_NAME), ##args)
447 
448 namespace dw
449 {
450 namespace framework
451 {
452 
459 template <typename T, typename S, typename... MemberPointers>
461  dw::core::StringView const&& typeName, size_t arraySize, const MemberPointers&&... memberPointers)
462 {
463  return describeArrayParameter<T, S>(
464  std::move(typeName),
465  ""_sv,
466  arraySize,
467  std::forward<const MemberPointers>(memberPointers)...);
468 }
469 
470 } // namespace framework
471 } // namespace dw
472 
473 // TODO(dwplc): FP -- Cannot enclose template type in parentheses
474 // the macro must perform stringification of the type as well as accept an arbitrary number of member pointers
475 // coverity[autosar_cpp14_m16_0_6_violation]
476 // coverity[autosar_cpp14_m16_3_1_violation]
477 #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)
478 
479 namespace dw
480 {
481 namespace framework
482 {
483 
489 template <typename T, typename S, typename... MemberPointers>
491  dw::core::StringView const&& typeName, dw::core::StringView const&& parameterName, T defaultValue, const MemberPointers&&... memberPointers)
492 {
493  return std::make_tuple(
494  std::move(typeName),
495  std::move(parameterName),
496  static_cast<T*>(nullptr),
497  static_cast<S*>(nullptr),
498  false,
499  static_cast<size_t>(0),
500  std::move(
501  std::make_tuple<const MemberPointers...>(std::forward<const MemberPointers>(memberPointers)...)),
502  std::move(defaultValue));
503 }
504 
505 } // namespace framework
506 } // namespace dw
507 
508 // TODO(dwplc): FP -- Cannot enclose template type in parentheses
509 // the macro must perform stringification of the type as well as accept an arbitrary number of member pointers
510 // coverity[autosar_cpp14_m16_0_6_violation]
511 // coverity[autosar_cpp14_m16_3_1_violation]
512 #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)
513 
514 namespace dw
515 {
516 namespace framework
517 {
518 
524 template <typename T, typename S, size_t ArraySize, typename... MemberPointers>
526  dw::core::StringView const&& typeName, dw::core::StringView const&& parameterName, std::array<T, ArraySize> defaultValue, const MemberPointers&&... memberPointers)
527 {
528  return std::make_tuple(
529  std::move(typeName),
530  std::move(parameterName),
531  static_cast<T*>(nullptr),
532  static_cast<S*>(nullptr),
533  false,
534  ArraySize,
535  std::move(
536  std::make_tuple<const MemberPointers...>(std::forward<const MemberPointers>(memberPointers)...)),
537  std::move(defaultValue));
538 }
539 
541 template <typename NodeT>
542 constexpr auto describeParameters()
543 {
544  return NodeT::describeParameters();
545 }
546 
547 namespace detail
548 {
549 
551 template <
552  typename Param, typename MemberPtr,
553  typename std::enable_if_t<std::tuple_size<Param>() <= PARAMETER_DEFAULT_VALUE, void>* = nullptr>
554 // Output parameter is needed to populate member of arbitrary struct
555 // coverity[autosar_cpp14_a8_4_8_violation]
556 void populateDefault(const Param& param, MemberPtr& memberPtr)
557 {
558  static_cast<void>(param);
559  static_cast<void>(memberPtr);
560 }
561 
563 template <
564  typename Param, typename MemberPtr,
565  typename std::enable_if_t<PARAMETER_DEFAULT_VALUE<std::tuple_size<Param>(), void>* = nullptr>
566  // Output parameter is needed to populate member of arbitrary struct
567  // coverity[autosar_cpp14_a8_4_8_violation]
568  void populateDefault(const Param& param, MemberPtr& memberPtr)
569 {
570  auto defaultValue = std::get<PARAMETER_DEFAULT_VALUE>(param);
571  memberPtr = defaultValue;
572 }
573 
575 template <
576  typename Param, typename MemberPtr,
577  typename std::enable_if_t<std::tuple_size<Param>() <= PARAMETER_DEFAULT_VALUE, void>* = nullptr>
578 // Output parameter is needed to populate member of arbitrary struct
579 // coverity[autosar_cpp14_a8_4_8_violation]
580 void populateArrayDefault(const Param& param, MemberPtr& memberPtr, size_t index)
581 {
582  static_cast<void>(param);
583  static_cast<void>(memberPtr);
584  static_cast<void>(index);
585 }
586 
588 template <
589  typename Param, typename MemberPtr,
590  typename std::enable_if_t<PARAMETER_DEFAULT_VALUE<std::tuple_size<Param>(), void>* = nullptr>
591  // Output parameter is needed to populate member of arbitrary struct
592  // coverity[autosar_cpp14_a8_4_8_violation]
593  void populateArrayDefault(const Param& param, MemberPtr& memberPtr, size_t index)
594 {
595  auto defaultValue = std::get<PARAMETER_DEFAULT_VALUE>(param);
596  memberPtr[index] = defaultValue[index];
597 }
598 
600 template <
601  size_t MemberIndex, typename ArgType, typename MemberPtrs,
602  typename std::enable_if_t<std::tuple_size<MemberPtrs>() == 0, void>* = nullptr>
603 // Output parameter is needed to populate member of arbitrary struct
604 // coverity[autosar_cpp14_a8_4_8_violation]
605 auto& getMemberPtr(ArgType& arg, MemberPtrs memberPtrs)
606 {
607  static_cast<void>(memberPtrs);
608  return arg;
609 }
610 
612 template <
613  size_t MemberIndex, typename ArgType, typename MemberPtrs,
614  typename std::enable_if_t<MemberIndex + 1 == std::tuple_size<MemberPtrs>(), void>* = nullptr>
615 // Output parameter is needed to populate member of arbitrary struct
616 // coverity[autosar_cpp14_a8_4_8_violation]
617 auto& getMemberPtr(ArgType& arg, MemberPtrs memberPtrs)
618 {
619  auto member = std::get<MemberIndex>(memberPtrs);
620  return arg.*member;
621 }
622 
624 template <
625  size_t MemberIndex, typename ArgType, typename MemberPtrs,
626  typename std::enable_if_t<MemberIndex + 1 < std::tuple_size<MemberPtrs>(), void>* = nullptr>
627 // Output parameter is needed to populate member of arbitrary struct
628 // coverity[autosar_cpp14_a8_4_8_violation]
629 auto& getMemberPtr(ArgType& arg, MemberPtrs memberPtrs)
630 {
631  auto& member = std::get<MemberIndex>(memberPtrs);
632  auto& m = arg.*member;
633  return getMemberPtr<MemberIndex + 1>(m, memberPtrs);
634 }
635 
637 template <typename NodeT, size_t ConstructorParameterIndex>
638 constexpr size_t constructorArgumentParameterSize()
639 {
640  return dw::core::tuple_size<
641  std::tuple_element_t<
643  std::tuple_element_t<
644  ConstructorParameterIndex,
645  decltype(describeParameters<NodeT>())>>>();
646 }
647 
649 template <
650  typename NodeT, size_t ConstructorParameterIndex, size_t ParamIndex, typename ArgType,
651  typename std::enable_if_t<ParamIndex == constructorArgumentParameterSize<NodeT, ConstructorParameterIndex>(), void>* = nullptr>
652 // Output parameter is needed to populate member of arbitrary struct
653 // coverity[autosar_cpp14_a8_4_8_violation]
654 void populateParametersRecursion(const ParameterProvider& provider, ArgType& arg)
655 {
656  static_cast<void>(arg);
657  static_cast<void>(provider);
658 }
659 
661 template <typename NodeT, size_t ConstructorParameterIndex, size_t ParamIndex>
662 constexpr bool isIndexParameter()
663 {
664  constexpr auto param = dw::core::get<ParamIndex>(
665  std::get<PARAMETER_CONSTRUCTOR_ARGUMENT_DESCRIPTOR>(
666  std::get<ConstructorParameterIndex>(describeParameters<NodeT>())));
667  return std::get<PARAMETER_IS_INDEX>(param);
668 }
669 
671 template <typename NodeT, size_t ConstructorParameterIndex, size_t ParamIndex>
672 constexpr bool isArrayParameter()
673 {
674  constexpr auto param = dw::core::get<ParamIndex>(
675  std::get<PARAMETER_CONSTRUCTOR_ARGUMENT_DESCRIPTOR>(
676  std::get<ConstructorParameterIndex>(describeParameters<NodeT>())));
677  constexpr size_t arraySize = std::get<
678  PARAMETER_ARRAY_SIZE>(param);
679  return arraySize > 0;
680 }
681 
683 template <typename NodeT, size_t ConstructorParameterIndex, size_t ParamIndex>
684 constexpr bool isAbstractParameter()
685 {
686  constexpr auto param = dw::core::get<ParamIndex>(
687  std::get<PARAMETER_CONSTRUCTOR_ARGUMENT_DESCRIPTOR>(
688  std::get<ConstructorParameterIndex>(describeParameters<NodeT>())));
689  return std::tuple_size<decltype(param)>() <= PARAMETER_MEMBER_PTRS;
690 }
691 
693 template <
694  typename NodeT, size_t ConstructorParameterIndex, size_t ParamIndex, typename ArgType,
695  typename std::enable_if_t<isAbstractParameter<NodeT, ConstructorParameterIndex, ParamIndex>(), void>* = nullptr>
696 // Output parameter is needed to populate member of arbitrary struct
697 // coverity[autosar_cpp14_a8_4_8_violation]
698 void populateParameter(const ParameterProvider& provider, ArgType& arg)
699 {
700  static_cast<void>(arg);
701  static_cast<void>(provider);
702 }
703 
709 template <
710  typename NodeT, size_t ConstructorParameterIndex, size_t ParamIndex, typename ArgType,
711  typename std::enable_if_t<!isAbstractParameter<NodeT, ConstructorParameterIndex, ParamIndex>() && !isArrayParameter<NodeT, ConstructorParameterIndex, ParamIndex>() && !isIndexParameter<NodeT, ConstructorParameterIndex, ParamIndex>(), void>* = nullptr>
712 // Output parameter is needed to populate member of arbitrary struct
713 // coverity[autosar_cpp14_a8_4_8_violation]
714 void populateParameter(const ParameterProvider& provider, ArgType& arg)
715 {
716  constexpr auto param = dw::core::get<ParamIndex>(
717  std::get<PARAMETER_CONSTRUCTOR_ARGUMENT_DESCRIPTOR>(
718  std::get<ConstructorParameterIndex>(describeParameters<NodeT>())));
719 
720  using DataType = std::remove_pointer_t<
721  std::tuple_element_t<
722  PARAMETER_TYPE, decltype(param)>>;
723  using SemanticDataType = std::remove_pointer_t<
724  std::tuple_element_t<
725  PARAMETER_SEMANTIC_TYPE, decltype(param)>>;
726 
727  DataType& memberPtr = getMemberPtr<0>(arg, std::get<PARAMETER_MEMBER_PTRS>(param));
728  bool hadParameter = provider.getOptional<SemanticDataType, DataType>(std::get<PARAMETER_NAME>(param), &memberPtr);
729  if (!hadParameter)
730  {
731  populateDefault(param, memberPtr);
732  }
733 }
734 
740 template <
741  typename NodeT, size_t ConstructorParameterIndex, size_t ParamIndex, typename ArgType,
742  typename std::enable_if_t<!isAbstractParameter<NodeT, ConstructorParameterIndex, ParamIndex>() && !isArrayParameter<NodeT, ConstructorParameterIndex, ParamIndex>() && isIndexParameter<NodeT, ConstructorParameterIndex, ParamIndex>(), void>* = nullptr>
743 // Output parameter is needed to populate member of arbitrary struct
744 // coverity[autosar_cpp14_a8_4_8_violation]
745 void populateParameter(const ParameterProvider& provider, ArgType& arg)
746 {
747  constexpr auto param = dw::core::get<ParamIndex>(
748  std::get<PARAMETER_CONSTRUCTOR_ARGUMENT_DESCRIPTOR>(
749  std::get<ConstructorParameterIndex>(describeParameters<NodeT>())));
750 
751  using DataType = std::remove_pointer_t<
752  std::tuple_element_t<
753  PARAMETER_TYPE, decltype(param)>>;
754  using SemanticDataType = std::remove_pointer_t<
755  std::tuple_element_t<
756  PARAMETER_SEMANTIC_TYPE, decltype(param)>>;
757  DataType& memberPtr = getMemberPtr<0>(arg, std::get<PARAMETER_MEMBER_PTRS>(param));
758 
759  size_t index = static_cast<size_t>(-1);
760  bool hadParameter = provider.getOptional<size_t, size_t>(std::get<PARAMETER_NAME>(param), &index);
761  if (hadParameter)
762  {
763  hadParameter = provider.getOptional<SemanticDataType, DataType>("", index, &memberPtr);
764  }
765  if (!hadParameter)
766  {
767  populateDefault(param, memberPtr);
768  }
769 }
770 
776 template <
777  typename NodeT, size_t ConstructorParameterIndex, size_t ParamIndex, typename ArgType,
778  typename std::enable_if_t<!isAbstractParameter<NodeT, ConstructorParameterIndex, ParamIndex>() && isArrayParameter<NodeT, ConstructorParameterIndex, ParamIndex>(), void>* = nullptr>
779 // Output parameter is needed to populate member of arbitrary struct
780 // coverity[autosar_cpp14_a8_4_8_violation]
781 void populateParameter(const ParameterProvider& provider, ArgType& arg)
782 {
783  constexpr auto param = dw::core::get<ParamIndex>(
784  std::get<PARAMETER_CONSTRUCTOR_ARGUMENT_DESCRIPTOR>(
785  std::get<ConstructorParameterIndex>(describeParameters<NodeT>())));
786 
787  using DataType = std::remove_pointer_t<
788  std::tuple_element_t<
789  PARAMETER_TYPE, decltype(param)>>;
790  using SemanticDataType = std::remove_pointer_t<
791  std::tuple_element_t<
792  PARAMETER_SEMANTIC_TYPE, decltype(param)>>;
793 
794  constexpr size_t arraySize = std::get<PARAMETER_ARRAY_SIZE>(
795  param);
796 
797  DataType(&memberPtr)[arraySize] = getMemberPtr<0>(arg, std::get<PARAMETER_MEMBER_PTRS>(param));
798  for (size_t i = 0; i < arraySize; ++i)
799  {
800  bool hadParameter = provider.getOptional<SemanticDataType, DataType>(std::get<PARAMETER_NAME>(param), i, &memberPtr[i]);
801  if (!hadParameter)
802  {
803  populateArrayDefault(param, memberPtr, i);
804  }
805  }
806 }
807 
809 template <
810  typename NodeT, size_t ConstructorParameterIndex, size_t ParamIndex, typename ArgType,
811  typename std::enable_if_t<ParamIndex<constructorArgumentParameterSize<NodeT, ConstructorParameterIndex>(), void>* = nullptr>
812  // Output parameter is needed to populate member of arbitrary struct
813  // coverity[autosar_cpp14_a8_4_8_violation]
814  void populateParametersRecursion(const ParameterProvider& provider, ArgType& arg)
815 {
816  populateParameter<NodeT, ConstructorParameterIndex, ParamIndex>(provider, arg);
817 
818  populateParametersRecursion<NodeT, ConstructorParameterIndex, ParamIndex + 1>(provider, arg);
819 }
820 
826 template <typename NodeT, size_t ConstructorParameterIndex, typename ArgType>
827 // Output parameter is needed to populate member of arbitrary struct
828 // coverity[autosar_cpp14_a8_4_8_violation]
829 void populateParameters(const ParameterProvider& provider, ArgType& arg)
830 {
831  try
832  {
833  populateParametersRecursion<NodeT, ConstructorParameterIndex, 0>(provider, arg);
834  }
835  catch (Exception& e)
836  {
837  throw Exception(e.status(), "Exception while populating parameters of mangled node type ", typeid(NodeT).name(), ": ", e.messageStr());
838  }
839 }
840 
841 } // namespace detail
842 
844 template <
845  typename NodeT,
846  class ConstructorArguments,
847  typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 1, void>* = nullptr>
848 // Output parameter is needed to populate member of arbitrary struct
849 // coverity[autosar_cpp14_a8_4_8_violation]
850 void populateParameters(ConstructorArguments& constructorArguments, const ParameterProvider& provider)
851 {
852  auto& arg0 = std::get<0>(constructorArguments);
853  detail::populateParameters<NodeT, 0>(arg0, provider);
854 }
855 
857 template <
858  typename NodeT,
859  class ConstructorArguments,
860  typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 2, void>* = nullptr>
861 // Output parameter is needed to populate member of arbitrary struct
862 // coverity[autosar_cpp14_a8_4_8_violation]
863 void populateParameters(ConstructorArguments& constructorArguments, const ParameterProvider& provider)
864 {
865  auto& arg0 = std::get<0>(constructorArguments);
866  detail::populateParameters<NodeT, 0>(provider, arg0);
867  auto& arg1 = std::get<1>(constructorArguments);
868  detail::populateParameters<NodeT, 1>(provider, arg1);
869 }
870 
872 template <
873  typename NodeT,
874  class ConstructorArguments,
875  typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 3, void>* = nullptr>
876 // Output parameter is needed to populate member of arbitrary struct
877 // coverity[autosar_cpp14_a8_4_8_violation]
878 void populateParameters(ConstructorArguments& constructorArguments, const ParameterProvider& provider)
879 {
880  auto& arg0 = std::get<0>(constructorArguments);
881  detail::populateParameters<NodeT, 0>(provider, arg0);
882  auto& arg1 = std::get<1>(constructorArguments);
883  detail::populateParameters<NodeT, 1>(provider, arg1);
884  auto& arg2 = std::get<2>(constructorArguments);
885  detail::populateParameters<NodeT, 2>(provider, arg2);
886 }
887 
889 template <
890  typename NodeT,
891  class ConstructorArguments,
892  typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 4, void>* = nullptr>
893 // Output parameter is needed to populate member of arbitrary struct
894 // coverity[autosar_cpp14_a8_4_8_violation]
895 void populateParameters(ConstructorArguments& constructorArguments, const ParameterProvider& provider)
896 {
897  auto& arg0 = std::get<0>(constructorArguments);
898  detail::populateParameters<NodeT, 0>(provider, arg0);
899  auto& arg1 = std::get<1>(constructorArguments);
900  detail::populateParameters<NodeT, 1>(provider, arg1);
901  auto& arg2 = std::get<2>(constructorArguments);
902  detail::populateParameters<NodeT, 2>(provider, arg2);
903  auto& arg3 = std::get<3>(constructorArguments);
904  detail::populateParameters<NodeT, 3>(provider, arg3);
905 }
906 
908 template <
909  typename NodeT,
910  class ConstructorArguments,
911  typename std::enable_if_t<std::tuple_size<ConstructorArguments>() == 5, void>* = nullptr>
912 // Output parameter is needed to populate member of arbitrary struct
913 // coverity[autosar_cpp14_a8_4_8_violation]
914 void populateParameters(ConstructorArguments& constructorArguments, const ParameterProvider& provider)
915 {
916  auto& arg0 = std::get<0>(constructorArguments);
917  detail::populateParameters<NodeT, 0>(provider, arg0);
918  auto& arg1 = std::get<1>(constructorArguments);
919  detail::populateParameters<NodeT, 1>(provider, arg1);
920  auto& arg2 = std::get<2>(constructorArguments);
921  detail::populateParameters<NodeT, 2>(provider, arg2);
922  auto& arg3 = std::get<3>(constructorArguments);
923  detail::populateParameters<NodeT, 3>(provider, arg3);
924  auto& arg4 = std::get<4>(constructorArguments);
925  detail::populateParameters<NodeT, 4>(provider, arg4);
926 }
927 
928 namespace detail
929 {
930 
931 // Get the Number of constructor arguments of the passed node.
932 template <typename NodeT>
933 constexpr std::size_t parameterConstructorArgumentSize()
934 {
935  return std::tuple_size<decltype(describeParameters<NodeT>())>::value;
936 }
937 
939 template <
940  typename NodeT, size_t ConstructorArgumentIndex,
941  typename std::enable_if_t<ConstructorArgumentIndex == parameterConstructorArgumentSize<NodeT>(), void>* = nullptr>
943 {
944  return std::make_tuple();
945 }
946 
948 template <
949  typename NodeT, size_t ConstructorArgumentIndex,
950  typename std::enable_if_t<ConstructorArgumentIndex<parameterConstructorArgumentSize<NodeT>(), void>* = nullptr> auto createConstructorArguments()
951 {
952  using NodeParams = decltype(describeParameters<NodeT>());
953 
954  using ConstructorParameter = std::tuple_element_t<ConstructorArgumentIndex, NodeParams>;
955  using ArgType = std::remove_pointer_t<
956  typename std::tuple_element_t<PARAMETER_CONSTRUCTOR_ARGUMENT_TYPE, ConstructorParameter>>;
957  ArgType arg{};
958 
959  return std::tuple_cat(std::make_tuple(arg), createConstructorArguments<NodeT, ConstructorArgumentIndex + 1>());
960 }
961 
962 } // namespace detail
963 
965 template <typename NodeT>
967 {
968  return detail::createConstructorArguments<NodeT, 0>();
969 }
970 
971 namespace detail
972 {
973 
975 template <class T, class Tuple, size_t... Is>
976 auto makeUniqueFromTuple(const Tuple&& tuple, std::index_sequence<Is...>) -> std::unique_ptr<T>
977 {
978  return std::unique_ptr<T>(new T{std::get<Is>(std::move(tuple))...});
979 }
980 }
981 
983 template <typename NodeT, class ConstructorArguments>
984 auto makeUniqueFromTuple(const ConstructorArguments&& constructorArguments) -> std::unique_ptr<NodeT>
985 {
986  return detail::makeUniqueFromTuple<NodeT>(
987  std::move(constructorArguments),
988  std::make_index_sequence<std::tuple_size<std::decay_t<ConstructorArguments>>::value>{});
989 }
990 
999 template <typename NodeT>
1000 auto create(const ParameterProvider& provider) -> std::unique_ptr<NodeT>
1001 {
1002  auto constructorArguments = createConstructorArguments<NodeT>();
1003  populateParameters<NodeT>(constructorArguments, provider);
1004  return makeUniqueFromTuple<NodeT>(std::move(constructorArguments));
1005 }
1006 
1007 // Number of parameters (sum across all constructor arguments)
1008 namespace detail
1009 {
1010 
1012 template <
1013  typename NodeT, size_t ConstructorArgumentIndex,
1014  typename std::enable_if_t<ConstructorArgumentIndex == parameterConstructorArgumentSize<NodeT>(), void>* = nullptr>
1015 constexpr std::size_t parameterSize()
1016 {
1017  return 0;
1018 }
1019 
1021 template <
1022  typename NodeT, size_t ConstructorArgumentIndex,
1023  typename std::enable_if_t<ConstructorArgumentIndex<parameterConstructorArgumentSize<NodeT>(), void>* = nullptr> constexpr std::size_t parameterSize()
1024 {
1025  return constructorArgumentParameterSize<NodeT, ConstructorArgumentIndex>() + parameterSize<NodeT, ConstructorArgumentIndex + 1>();
1026 }
1027 
1028 } // namespace detail
1029 
1031 template <typename NodeT>
1032 constexpr std::size_t parameterSize()
1033 {
1034  return detail::parameterSize<NodeT, 0>();
1035 }
1036 
1037 } // namespace framework
1038 } // namespace dw
1039 
1040 #endif // DW_FRAMEWORK_PARAMETERDESCRIPTOR_HPP_
char8_t const * messageStr() const noexcept
Definition: Exception.hpp:84
constexpr auto describeUnnamedArrayParameter(dw::core::StringView const &&typeName, size_t arraySize, const MemberPointers &&... memberPointers)
Describe an unnamed array parameter.
constexpr auto describeParameterWithDefault(dw::core::StringView const &&typeName, dw::core::StringView const &&parameterName, T defaultValue, const MemberPointers &&... memberPointers)
Describe a parameter with a default value.
constexpr auto describeAbstractParameter(dw::core::StringView const &&typeName, dw::core::StringView const &&parameterName)
Describe an abstract parameter.
static constexpr size_t PARAMETER_CONSTRUCTOR_ARGUMENT_DESCRIPTOR
dwStatus status() const
Definition: Exception.hpp:79
constexpr auto describeUnnamedParameter(dw::core::StringView const &&typeName, const MemberPointers &&... memberPointers)
Describe an unnamed parameter.
static constexpr size_t PARAMETER_TYPE_NAME
static constexpr size_t PARAMETER_CONSTRUCTOR_ARGUMENT_TYPE
constexpr auto describeParameter(dw::core::StringView const &&typeName, dw::core::StringView const &&parameterName, const MemberPointers &&... memberPointers)
Describe a parameter.
auto createConstructorArguments()
Create a tuple of constructor argument needed by the constructor of the passed node.
constexpr std::size_t parameterSize()
Get the number of parameters for a given node.
static constexpr size_t PARAMETER_SEMANTIC_TYPE
static constexpr size_t PARAMETER_NAME
static constexpr size_t PARAMETER_TYPE
constexpr auto describeAbstractArrayParameter(dw::core::StringView const &&typeName, dw::core::StringView const &&parameterName, size_t arraySize)
Describe an abstract array parameter.
auto create(const ParameterProvider &provider) -> std::unique_ptr< NodeT >
Instantiate a node using parameters from the passed provider.
static constexpr size_t PARAMETER_IS_INDEX
constexpr auto describeIndexParameter(dw::core::StringView const &&typeName, dw::core::StringView const &&parameterName, const MemberPointers &&... memberPointers)
Describe an index parameter.
constexpr auto describeArrayParameterWithDefault(dw::core::StringView const &&typeName, dw::core::StringView const &&parameterName, std::array< T, ArraySize > defaultValue, const MemberPointers &&... memberPointers)
Describe an array parameter with a default value.
static constexpr size_t PARAMETER_ARRAY_SIZE
Definition: Exception.hpp:46
constexpr auto describeConstructorArgument(const Args &&... args)
Describe a specific constructor argument of a node.
auto makeUniqueFromTuple(const ConstructorArguments &&constructorArguments) -> std::unique_ptr< NodeT >
Instantiate a node using the passed constructor arguments.
constexpr auto describeParameters()
Get described parameters for the passed node.
The interface to access parameter values identified by name and/or (semantic) type.
void populateParameters(ConstructorArguments &constructorArguments, const ParameterProvider &provider)
Populate the constructor arguments using values from the parameter provider.
static constexpr size_t PARAMETER_MEMBER_PTRS
constexpr std::tuple describeConstructorArguments()
Describe the constructor arguments of a node.
bool getOptional(dw::core::StringView const &key, T *out) const
Convenience API throwing an exception instead of returning a failed status.
static constexpr size_t PARAMETER_DEFAULT_VALUE
constexpr auto describeArrayParameter(dw::core::StringView const &&typeName, dw::core::StringView const &&parameterName, size_t arraySize, const MemberPointers &&... memberPointers)
Describe an array parameter.