Zserio C++ runtime library  1.3.0
Built for Zserio 2.18.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 <type_traits>
6 
8 #include "zserio/StringView.h"
9 #include "zserio/Types.h"
10 
11 // This should be implemented in runtime library header.
12 namespace zserio
13 {
14 
15 // forward declarations
16 class BitStreamReader;
17 class BitStreamWriter;
18 
22 template <typename T>
23 struct EnumTraits
24 {};
25 
33 template <typename T>
34 size_t enumToOrdinal(T value);
35 
45 template <typename T>
46 T valueToEnum(typename std::underlying_type<T>::type rawValue);
47 
55 template <typename T>
56 constexpr typename std::underlying_type<T>::type enumToValue(T value)
57 {
58  return static_cast<typename std::underlying_type<T>::type>(value);
59 }
60 
68 template <typename T>
69 uint32_t enumHashCode(T value);
70 
80 template <typename T>
82 {
83  const auto foundIt = std::find_if(EnumTraits<T>::names.begin(), EnumTraits<T>::names.end(),
84  [itemName](const char* enumItemName) { return itemName.compare(enumItemName) == 0; });
85  if (foundIt == EnumTraits<T>::names.end())
86  {
87  throw CppRuntimeException("Enum item '")
88  << itemName << "' doesn't exist in enum '" << EnumTraits<T>::enumName << "'!";
89  }
90 
91  const size_t ordinal = static_cast<size_t>(std::distance(EnumTraits<T>::names.begin(), foundIt));
92  return EnumTraits<T>::values[ordinal];
93 }
94 
102 template <typename T>
103 const char* enumToString(T value)
104 {
105  return EnumTraits<T>::names[enumToOrdinal(value)];
106 }
107 
114 template <typename PACKING_CONTEXT, typename T>
115 void initPackingContext(PACKING_CONTEXT& context, T value);
116 
126 template <typename T>
127 size_t bitSizeOf(T value);
128 
139 template <typename PACKING_CONTEXT, typename T>
140 size_t bitSizeOf(PACKING_CONTEXT& context, T value);
141 
153 template <typename T>
154 size_t initializeOffsets(size_t bitPosition, T value);
155 
168 template <typename PACKING_CONTEXT, typename T>
169 size_t initializeOffsets(PACKING_CONTEXT& context, size_t bitPosition, T value);
170 
178 template <typename T>
180 
189 template <typename T, typename PACKING_CONTEXT>
190 T read(PACKING_CONTEXT& context, BitStreamReader& in);
191 
198 template <typename T>
199 void write(BitStreamWriter& out, T value);
200 
208 template <typename PACKING_CONTEXT, typename T>
209 void write(PACKING_CONTEXT& context, BitStreamWriter& out, T value);
210 
219 template <typename T, typename std::enable_if<std::is_enum<T>::value, int>::type = 0>
221 {
222  exception << enumToString(value);
223  return exception;
224 }
225 
226 } // namespace zserio
227 
228 #endif // ZSERIO_ENUMS_H_INC
int compare(BasicStringView other) const noexcept
Definition: StringView.h:356
T read(BitStreamReader &in)
constexpr std::underlying_type< T >::type enumToValue(T value)
Definition: Enums.h:56
void write(BitStreamWriter &out, T value)
T valueToEnum(typename std::underlying_type< T >::type rawValue)
T stringToEnum(StringView itemName)
Definition: Enums.h:81
CppRuntimeException & operator<<(CppRuntimeException &exception, const BasicBitBuffer< ALLOC > &bitBuffer)
Definition: BitBuffer.h:454
size_t enumToOrdinal(T value)
size_t initializeOffsets(size_t bitPosition, T value)
const char * enumToString(T value)
Definition: Enums.h:103
void initPackingContext(PACKING_CONTEXT &context, T value)
uint32_t enumHashCode(T value)
size_t bitSizeOf(T value)