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

EnumDescriptor.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 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_ENUMDESCRIPTOR_HPP_
32 #define DW_FRAMEWORK_ENUMDESCRIPTOR_HPP_
33 
34 #include <dw/core/base/Status.h>
35 #include <dw/core/container/StringView.hpp>
36 
37 #include <dwcgf/Exception.hpp>
38 
39 #include <array>
40 #include <utility>
41 #include <type_traits>
42 
43 #define _DW_ENUMERATOR_NAME_STRING_VIEW(NAME_STR) NAME_STR##_sv
44 
53 // Cannot enclose name of enumerator from an enum class in parentheses
54 // coverity[autosar_cpp14_m16_0_6_violation]
55 #define DW_DESCRIBE_ENUMERATOR(NAME) describeEnumerator(_DW_ENUMERATOR_NAME_STRING_VIEW(#NAME), EnumT::NAME)
56 
63 #define DW_DESCRIBE_C_ENUMERATOR(NAME) describeEnumerator(_DW_ENUMERATOR_NAME_STRING_VIEW(#NAME), (NAME))
64 
65 namespace dw
66 {
67 namespace framework
68 {
69 
70 // API to declare the mapping of a concrete enum.
71 
72 template <typename EnumT>
74 {
83  static constexpr auto get()
84  {
85  static_assert(sizeof(EnumT) == 0, "Needs specialization for specific enum type");
86  constexpr const size_t numberOfEnumerators = 0;
87  std::array<std::pair<dw::core::StringView, EnumT>, numberOfEnumerators> ret;
88  return ret;
89  }
90 };
91 
92 // API needed to declare the enumerators of an enum.
93 
104 template <typename EnumT, typename... Args>
105 constexpr auto describeEnumeratorCollection(Args const&&... args)
106 {
107  return std::array<std::pair<dw::core::StringView, EnumT>, sizeof...(Args)>{std::forward<const Args>(args)...};
108 }
109 
122 template <typename EnumT>
123 constexpr auto describeEnumerator(dw::core::StringView const&& name, EnumT value)
124 {
125  return std::make_pair(std::move(name), value);
126 }
127 
135 template <typename EnumT>
136 auto mapEnumNameToValue(dw::core::StringView const& name) -> EnumT
137 {
138  const auto pairs = EnumDescription<EnumT>::get();
139  for (const auto& pair : pairs)
140  {
141  if (pair.first == name)
142  {
143  return pair.second;
144  }
145  }
146  FixedString<4096> validNames{};
147  for (const auto& pair : pairs)
148  {
149  validNames << " " << pair.first;
150  }
151  throw Exception(DW_INVALID_ARGUMENT, "Invalid enumerator name '", name, "' for enum type ", typeid(EnumT).name(), ", valid names:", validNames);
152 }
153 
161 template <typename EnumT>
162 dw::core::StringView mapEnumValueToName(EnumT value)
163 {
164  const auto pairs = EnumDescription<EnumT>::get();
165  for (const auto& pair : pairs)
166  {
167  if (pair.second == value)
168  {
169  return pair.first;
170  }
171  }
172  throw Exception(DW_INVALID_ARGUMENT, "The enumerator value is invalid: ", typeid(EnumT).name(), " ", value);
173 }
174 
175 } // namespace framework
176 } // namespace dw
177 
178 #endif // DW_FRAMEWORK_ENUMDESCRIPTOR_HPP_
static constexpr auto get()
Describe the enumerators.
constexpr auto describeEnumerator(dw::core::StringView const &&name, EnumT value)
Describe an enumerator.
constexpr auto describeEnumeratorCollection(Args const &&... args)
Describe the enumerators.
Definition: Exception.hpp:46
auto mapEnumNameToValue(dw::core::StringView const &name) -> EnumT
Get the enumerator value based on the name.
dw::core::StringView mapEnumValueToName(EnumT value)
Get the enumerator name based on the value.