Zserio C++17 runtime library  0.5.0
Built for Zserio 2.17.0
Enums.h
Go to the documentation of this file.
1 #ifndef ZSERIO_ENUMS_H_INC
2 #define ZSERIO_ENUMS_H_INC
3 
4 #include <algorithm>
5 #include <cstddef>
6 #include <string_view>
7 #include <type_traits>
8 
10 #include "zserio/BitStreamWriter.h"
11 #include "zserio/DeltaContext.h"
12 #include "zserio/ItemsAccessor.h"
13 
14 namespace zserio
15 {
16 
22 template <typename T>
23 struct EnumTraits
24 {};
25 
33 template <typename T>
34 size_t enumToOrdinal(T value);
35 
45 template <typename T>
47 
55 template <typename T>
56 constexpr typename EnumTraits<T>::ZserioType enumToValue(T value)
57 {
58  return static_cast<typename EnumTraits<T>::ZserioType>(static_cast<std::underlying_type_t<T>>(value));
59 }
60 
70 template <typename T>
71 T stringToEnum(std::string_view itemName)
72 {
73  const auto foundIt = std::find_if(EnumTraits<T>::names.begin(), EnumTraits<T>::names.end(),
74  [itemName](std::string_view enumItemName) {
75  return itemName.compare(enumItemName) == 0;
76  });
77  if (foundIt == EnumTraits<T>::names.end())
78  {
79  throw CppRuntimeException("Enum item '")
80  << itemName << "' doesn't exist in enum '" << EnumTraits<T>::enumName << "'!";
81  }
82 
83  const size_t ordinal = static_cast<size_t>(std::distance(EnumTraits<T>::names.begin(), foundIt));
84  return EnumTraits<T>::values[ordinal];
85 }
86 
94 template <typename T>
95 std::string_view enumToString(T value)
96 {
97  return EnumTraits<T>::names[enumToOrdinal(value)];
98 }
99 
100 namespace detail
101 {
102 
103 template <typename T>
104 std::enable_if_t<std::is_enum_v<T>> validate(T value, std::string_view fieldName)
105 {
106  validate(enumToValue(value), fieldName);
107 }
108 
109 template <typename T>
110 std::enable_if_t<std::is_enum_v<T>, BitSize> bitSizeOf(T value, BitSize bitPosition = 0)
111 {
112  return bitSizeOf(enumToValue(value), bitPosition);
113 }
114 
115 template <typename T>
116 std::enable_if_t<std::is_enum_v<T>> write(BitStreamWriter& writer, T value)
117 {
118  write(writer, enumToValue(value));
119 }
120 
121 template <typename T>
122 std::enable_if_t<std::is_enum_v<T>> read(zserio::BitStreamReader& reader, T& value)
123 {
124  typename EnumTraits<T>::ZserioType rawValue;
125  read(reader, rawValue);
126  value = valueToEnum<T>(rawValue);
127 }
128 
129 template <typename T, std::enable_if_t<std::is_enum_v<T>, int> = 0>
130 inline void initContext(DeltaContext& deltaContext, T value)
131 {
132  deltaContext.init(enumToValue(value));
133 }
134 
135 template <typename T>
136 std::enable_if_t<std::is_enum_v<T>, BitSize> bitSizeOf(DeltaContext& deltaContext, T value, BitSize = 0)
137 {
138  return deltaContext.bitSizeOf(enumToValue(value));
139 }
140 
141 template <typename T>
142 std::enable_if_t<std::is_enum_v<T>> write(DeltaContext& deltaContext, BitStreamWriter& writer, T value)
143 {
144  deltaContext.write(writer, enumToValue(value));
145 }
146 
147 template <typename T>
148 std::enable_if_t<std::is_enum_v<T>> read(DeltaContext& deltaContext, BitStreamReader& reader, T& value)
149 {
150  typename EnumTraits<T>::ZserioType rawValue;
151  deltaContext.read(reader, rawValue);
152  value = valueToEnum<T>(rawValue);
153 }
154 
155 } // namespace detail
156 
165 template <typename T, std::enable_if_t<std::is_enum_v<T>, int> = 0>
166 CppRuntimeException& operator<<(CppRuntimeException& exception, T value)
167 {
168  exception << enumToString(value);
169  return exception;
170 }
171 
172 } // namespace zserio
173 
174 #endif // ZSERIO_ENUMS_H_INC
T valueToEnum(typename EnumTraits< T >::ZserioType rawValue)
unsigned int BitSize
Definition: BitSize.h:8
constexpr EnumTraits< T >::ZserioType enumToValue(T value)
Definition: Enums.h:56
T stringToEnum(std::string_view itemName)
Definition: Enums.h:71
std::string_view enumToString(T value)
Definition: Enums.h:95
CppRuntimeException & operator<<(CppRuntimeException &exception, const BasicBitBuffer< ALLOC > &bitBuffer)
Definition: BitBuffer.h:553
size_t enumToOrdinal(T value)