Zserio C++17 runtime library 1.3.0
Built for Zserio 2.20.0
Loading...
Searching...
No Matches
View.h
Go to the documentation of this file.
1#ifndef ZSERIO_VIEW_H_INC
2#define ZSERIO_VIEW_H_INC
3
4#include <string_view>
5#include <tuple>
6
7#include "zserio/BitSize.h"
10#include "zserio/ParsingInfo.h"
11#include "zserio/Traits.h"
12
13namespace zserio
14{
15
26template <typename T>
27class View;
28
29// template argument deduction guide for View constructor
30template <typename T, typename... ARGS>
31View(T, ARGS&&...) -> View<T>;
32
33/*
34 * Gets parsing information from a view
35 *
36 * \param view Zserio View to extract the parsing info from.
37 */
38template <typename T>
40{
41 return view.zserioData().m_parsingInfo;
42}
43
44namespace detail
45{
46
50template <typename T>
51struct ObjectTraits;
52
53// TODO[Mi-L@]: Do we need to have U&& here? It should take either simple type, or view (or string_view, etc.).
54template <size_t I, typename T, typename U>
55view_type_t<std::tuple_element_t<I, typename ObjectTraits<T>::Parameters>> makeParameter(U arg)
56{
57 using ParamType = std::tuple_element_t<I, typename ObjectTraits<T>::Parameters>;
58 if constexpr (is_dyn_int_wrapper_v<ParamType>)
59 {
60 return View<ParamType>(ParamType(static_cast<typename ParamType::ValueType>(arg)), 64);
61 }
62 else if constexpr (is_numeric_wrapper_v<ParamType>)
63 {
64 return ParamType(static_cast<typename ParamType::ValueType>(arg));
65 }
66 else
67 {
68 return arg;
69 }
70}
71
79template <typename T>
80void validate(const View<T>& view, std::string_view fieldName = "")
81{
82 ObjectTraits<T>::validate(view, fieldName);
83}
84
93template <typename T>
94BitSize bitSizeOf(const View<T>& view, BitSize bitPosition = 0)
95{
96 return ObjectTraits<T>::bitSizeOf(view, bitPosition);
97}
98
99template <typename T, typename = void>
100struct has_initialize_offsets : std::false_type
101{};
102
103template <typename T>
104struct has_initialize_offsets<T,
105 std::void_t<decltype(ObjectTraits<T>().initializeOffsets(std::declval<const View<T>&>(), 0))>>
106 : std::true_type
107{};
108
109template <typename T, typename V = void>
110inline constexpr bool has_initialize_offsets_v = has_initialize_offsets<T, V>::value;
111
112template <typename T>
113BitSize initializeOffsets(const View<T>& view, BitSize bitPosition)
114{
115 if constexpr (has_initialize_offsets_v<T>)
116 {
117 return ObjectTraits<T>::initializeOffsets(view, bitPosition);
118 }
119 else
120 {
121 return ObjectTraits<T>::bitSizeOf(view, bitPosition);
122 }
123}
124
133template <typename T>
134void write(BitStreamWriter& writer, const View<T>& view)
135{
136 ObjectTraits<T>::write(writer, view);
137}
138
150template <typename T, typename... ARGS>
151View<T> read(BitStreamReader& reader, T& data, ARGS&&... args)
152{
153 return ObjectTraits<T>::read(reader, data, std::forward<ARGS>(args)...);
154}
155
156} // namespace detail
157
158template <typename VALUE_TYPE>
159class View<detail::DynIntWrapper<VALUE_TYPE>>
160{
161public:
162 using ValueType = VALUE_TYPE;
163
164 View(detail::DynIntWrapper<VALUE_TYPE> value, uint8_t numBits) :
165 m_value(value),
166 m_numBits(numBits)
167 {}
168
169 uint8_t numBits() const
170 {
171 return m_numBits;
172 }
173
174 detail::DynIntWrapper<VALUE_TYPE> value() const
175 {
176 return m_value;
177 }
178
179 operator VALUE_TYPE() const
180 {
181 return m_value;
182 }
183
184private:
185 detail::DynIntWrapper<VALUE_TYPE> m_value;
186 uint8_t m_numBits;
187};
188
189template <typename VALUE_TYPE>
191 const View<detail::DynIntWrapper<VALUE_TYPE>>& lhs, const View<detail::DynIntWrapper<VALUE_TYPE>>& rhs)
192{
193 return lhs.numBits() == rhs.numBits() && lhs.value() == rhs.value();
194}
195
196template <typename VALUE_TYPE>
198 const View<detail::DynIntWrapper<VALUE_TYPE>>& lhs, const View<detail::DynIntWrapper<VALUE_TYPE>>& rhs)
199{
200 return !(lhs == rhs);
201}
202
203template <typename VALUE_TYPE>
205 const View<detail::DynIntWrapper<VALUE_TYPE>>& lhs, const View<detail::DynIntWrapper<VALUE_TYPE>>& rhs)
206{
207 if (lhs.numBits() != rhs.numBits())
208 {
209 return lhs.numBits() < rhs.numBits();
210 }
211 if (lhs.value() != rhs.value())
212 {
213 return lhs.value() < rhs.value();
214 }
215
216 return false;
217}
218
219template <typename VALUE_TYPE>
221 const View<detail::DynIntWrapper<VALUE_TYPE>>& lhs, const View<detail::DynIntWrapper<VALUE_TYPE>>& rhs)
222{
223 return rhs < lhs;
224}
225
226template <typename VALUE_TYPE>
228 const View<detail::DynIntWrapper<VALUE_TYPE>>& lhs, const View<detail::DynIntWrapper<VALUE_TYPE>>& rhs)
229{
230 return !(rhs < lhs);
231}
232
233template <typename VALUE_TYPE>
235 const View<detail::DynIntWrapper<VALUE_TYPE>>& lhs, const View<detail::DynIntWrapper<VALUE_TYPE>>& rhs)
236{
237 return !(lhs < rhs);
238}
239
240namespace detail
241{
242
243template <typename VALUE_TYPE>
244void validate(const View<detail::DynIntWrapper<VALUE_TYPE>>& view, std::string_view fieldName)
245{
246 return validate(view.value(), view.numBits(), fieldName);
247}
248
249template <typename VALUE_TYPE>
250BitSize bitSizeOf(const View<detail::DynIntWrapper<VALUE_TYPE>>& view, BitSize = 0)
251{
252 return view.numBits();
253}
254
255template <typename VALUE_TYPE>
256void write(BitStreamWriter& writer, const View<detail::DynIntWrapper<VALUE_TYPE>>& view)
257{
258 write(writer, view.value(), view.numBits());
259}
260
261} // namespace detail
262
263} // namespace zserio
264
265namespace std
266{
267
268template <typename VALUE_TYPE>
269struct hash<zserio::View<zserio::detail::DynIntWrapper<VALUE_TYPE>>>
270{
271 size_t operator()(const zserio::View<zserio::detail::DynIntWrapper<VALUE_TYPE>>& view) const
272 {
273 uint32_t result = zserio::HASH_SEED;
274 result = zserio::calcHashCode(result, view.numBits());
275 result = zserio::calcHashCode(result, view.value());
276 return result;
277 }
278};
279
280} // namespace std
281
282#endif // ifndef ZSERIO_VIEW_H_INC
uint8_t numBits(uint64_t numValues)
bool operator>(const BasicBitBufferView< ALLOC > &lhs, const BasicBitBufferView< ALLOC > &rhs)
Definition BitBuffer.h:526
bool operator==(const BasicBitBufferView< ALLOC > &lhs, const BasicBitBufferView< ALLOC > &rhs)
Definition BitBuffer.h:508
unsigned int BitSize
Definition BitSize.h:8
bool operator<(const BasicBitBufferView< ALLOC > &lhs, const BasicBitBufferView< ALLOC > &rhs)
Definition BitBuffer.h:520
uint32_t calcHashCode(uint32_t seedValue, const ArrayView< T, ARRAY_TRAITS > &array)
Definition ArrayView.h:882
View(T, ARGS &&...) -> View< T >
const ParsingInfo & parsingInfo(const View< T > &view)
Definition View.h:39
bool operator<=(const BasicBitBufferView< ALLOC > &lhs, const BasicBitBufferView< ALLOC > &rhs)
Definition BitBuffer.h:532
bool operator>=(const BasicBitBufferView< ALLOC > &lhs, const BasicBitBufferView< ALLOC > &rhs)
Definition BitBuffer.h:538
bool operator!=(const BasicBitBufferView< ALLOC > &lhs, const BasicBitBufferView< ALLOC > &rhs)
Definition BitBuffer.h:514