Zserio C++ runtime library  1.0.0
Built for Zserio 2.13.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 <cstddef>
5 #include <type_traits>
6 #include <algorithm>
7 
8 #include "zserio/Types.h"
10 #include "zserio/StringView.h"
11 
12 // This should be implemented in runtime library header.
13 namespace zserio
14 {
15 
16 // forward declarations
17 class BitStreamReader;
18 class BitStreamWriter;
19 
23 template <typename T>
24 struct EnumTraits
25 {
26 };
27 
35 template <typename T>
36 size_t enumToOrdinal(T value);
37 
47 template <typename T>
48 T valueToEnum(typename std::underlying_type<T>::type rawValue);
49 
57 template <typename T>
58 constexpr typename std::underlying_type<T>::type enumToValue(T value)
59 {
60  return static_cast<typename std::underlying_type<T>::type>(value);
61 }
62 
70 template <typename T>
71 uint32_t enumHashCode(T value);
72 
82 template <typename T>
84 {
85  const auto foundIt = std::find_if(EnumTraits<T>::names.begin(), EnumTraits<T>::names.end(),
86  [itemName](const char* enumItemName){ return itemName.compare(enumItemName) == 0; });
87  if (foundIt == EnumTraits<T>::names.end())
88  {
89  throw CppRuntimeException("Enum item '") << itemName << "' doesn't exist in enum '" <<
91  }
92 
93  const size_t ordinal = static_cast<size_t>(std::distance(EnumTraits<T>::names.begin(), foundIt));
94  return EnumTraits<T>::values[ordinal];
95 }
96 
104 template <typename T>
105 const char* enumToString(T value)
106 {
107  return EnumTraits<T>::names[enumToOrdinal(value)];
108 }
109 
116 template <typename PACKING_CONTEXT, typename T>
117 void initPackingContext(PACKING_CONTEXT& context, T value);
118 
128 template <typename T>
129 size_t bitSizeOf(T value);
130 
141 template <typename PACKING_CONTEXT, typename T>
142 size_t bitSizeOf(PACKING_CONTEXT& context, T value);
143 
155 template <typename T>
156 size_t initializeOffsets(size_t bitPosition, T value);
157 
170 template <typename PACKING_CONTEXT, typename T>
171 size_t initializeOffsets(PACKING_CONTEXT& context, size_t bitPosition, T value);
172 
180 template <typename T>
181 T read(BitStreamReader& in);
182 
191 template <typename T, typename PACKING_CONTEXT>
192 T read(PACKING_CONTEXT& context, BitStreamReader& in);
193 
200 template <typename T>
201 void write(BitStreamWriter& out, T value);
202 
210 template <typename PACKING_CONTEXT, typename T>
211 void write(PACKING_CONTEXT& context, BitStreamWriter& out, T value);
212 
221 template <typename T, typename std::enable_if<std::is_enum<T>::value, int>::type = 0>
223 {
224  exception << enumToString(value);
225  return exception;
226 }
227 
228 } // namespace zserio
229 
230 #endif // ZSERIO_ENUMS_H_INC
T stringToEnum(StringView itemName)
Definition: Enums.h:83
int compare(BasicStringView other) const noexcept
Definition: StringView.h:353
const char * enumToString(T value)
Definition: Enums.h:105
size_t enumToOrdinal(T value)
T read(BitStreamReader &in)
void write(BitStreamWriter &out, T value)
constexpr std::underlying_type< T >::type enumToValue(T value)
Definition: Enums.h:58
uint32_t enumHashCode(T value)
size_t initializeOffsets(size_t bitPosition, T value)
T valueToEnum(typename std::underlying_type< T >::type rawValue)
void initPackingContext(PACKING_CONTEXT &context, T value)
size_t bitSizeOf(T value)
CppRuntimeException & operator<<(CppRuntimeException &exception, const BasicBitBuffer< ALLOC > &bitBuffer)
Definition: BitBuffer.h:432