Zserio C++17 runtime library 1.3.0
Built for Zserio 2.20.0
Loading...
Searching...
No Matches
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
11#include "zserio/DeltaContext.h"
13
14namespace zserio
15{
16
22template <typename T>
24{};
25
33template <typename T>
34size_t enumToOrdinal(T value);
35
45template <typename T>
47
55template <typename T>
56constexpr 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
70template <typename T>
71T 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));
85}
86
94template <typename T>
95std::string_view enumToString(T value)
96{
98}
99
100namespace detail
101{
102
103template <typename T>
104std::enable_if_t<std::is_enum_v<T>> validate(T value, std::string_view fieldName)
105{
106 validate(enumToValue(value), fieldName);
107}
108
109template <typename T>
110std::enable_if_t<std::is_enum_v<T>, BitSize> bitSizeOf(T value, BitSize bitPosition = 0)
111{
112 return bitSizeOf(enumToValue(value), bitPosition);
113}
114
115template <typename T>
116std::enable_if_t<std::is_enum_v<T>> write(BitStreamWriter& writer, T value)
117{
118 write(writer, enumToValue(value));
119}
120
121template <typename T>
122std::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
129template <typename T, std::enable_if_t<std::is_enum_v<T>, int> = 0>
130inline void initContext(DeltaContext& deltaContext, T value)
131{
132 deltaContext.init(enumToValue(value));
133}
134
135template <typename T>
136std::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
141template <typename T>
142std::enable_if_t<std::is_enum_v<T>> write(DeltaContext& deltaContext, BitStreamWriter& writer, T value)
143{
144 deltaContext.write(writer, enumToValue(value));
145}
146
147template <typename T>
148std::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
165template <typename T, std::enable_if_t<std::is_enum_v<T>, int> = 0>
166CppRuntimeException& 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
CppRuntimeException & operator<<(CppRuntimeException &exception, const BasicBitBuffer< ALLOC > &bitBuffer)
Definition BitBuffer.h:554
T stringToEnum(std::string_view itemName)
Definition Enums.h:71
std::string_view enumToString(T value)
Definition Enums.h:95
size_t enumToOrdinal(T value)
constexpr EnumTraits< T >::ZserioType enumToValue(T value)
Definition Enums.h:56