1#ifndef ZSERIO_VIEW_H_INC
2#define ZSERIO_VIEW_H_INC
30template <
typename T,
typename... ARGS>
41 return view.zserioData().m_parsingInfo;
54template <
size_t I,
typename T,
typename U>
55view_type_t<std::tuple_element_t<I, typename ObjectTraits<T>::Parameters>> makeParameter(U arg)
57 using ParamType = std::tuple_element_t<I, typename ObjectTraits<T>::Parameters>;
58 if constexpr (is_dyn_int_wrapper_v<ParamType>)
60 return View<ParamType>(ParamType(
static_cast<typename ParamType::ValueType
>(arg)), 64);
62 else if constexpr (is_numeric_wrapper_v<ParamType>)
64 return ParamType(
static_cast<typename ParamType::ValueType
>(arg));
80void validate(
const View<T>& view, std::string_view fieldName =
"")
82 ObjectTraits<T>::validate(view, fieldName);
96 return ObjectTraits<T>::bitSizeOf(view, bitPosition);
99template <
typename T,
typename =
void>
100struct has_initialize_offsets : std::false_type
104struct has_initialize_offsets<T,
105 std::void_t<decltype(ObjectTraits<T>().initializeOffsets(std::declval<const View<T>&>(), 0))>>
109template <
typename T,
typename V =
void>
110inline constexpr bool has_initialize_offsets_v = has_initialize_offsets<T, V>::value;
113BitSize initializeOffsets(
const View<T>& view,
BitSize bitPosition)
115 if constexpr (has_initialize_offsets_v<T>)
117 return ObjectTraits<T>::initializeOffsets(view, bitPosition);
121 return ObjectTraits<T>::bitSizeOf(view, bitPosition);
134void write(BitStreamWriter& writer,
const View<T>& view)
136 ObjectTraits<T>::write(writer, view);
150template <
typename T,
typename... ARGS>
151View<T> read(BitStreamReader& reader, T& data, ARGS&&... args)
153 return ObjectTraits<T>::read(reader, data, std::forward<ARGS>(args)...);
158template <
typename VALUE_TYPE>
159class View<detail::DynIntWrapper<VALUE_TYPE>>
162 using ValueType = VALUE_TYPE;
164 View(detail::DynIntWrapper<VALUE_TYPE> value, uint8_t numBits) :
174 detail::DynIntWrapper<VALUE_TYPE> value()
const
179 operator VALUE_TYPE()
const
185 detail::DynIntWrapper<VALUE_TYPE> m_value;
189template <
typename VALUE_TYPE>
191 const View<detail::DynIntWrapper<VALUE_TYPE>>&
lhs,
const View<detail::DynIntWrapper<VALUE_TYPE>>&
rhs)
193 return lhs.numBits() ==
rhs.numBits() &&
lhs.value() ==
rhs.value();
196template <
typename VALUE_TYPE>
198 const View<detail::DynIntWrapper<VALUE_TYPE>>&
lhs,
const View<detail::DynIntWrapper<VALUE_TYPE>>&
rhs)
203template <
typename VALUE_TYPE>
205 const View<detail::DynIntWrapper<VALUE_TYPE>>&
lhs,
const View<detail::DynIntWrapper<VALUE_TYPE>>&
rhs)
207 if (
lhs.numBits() !=
rhs.numBits())
209 return lhs.numBits() <
rhs.numBits();
211 if (
lhs.value() !=
rhs.value())
213 return lhs.value() <
rhs.value();
219template <
typename VALUE_TYPE>
221 const View<detail::DynIntWrapper<VALUE_TYPE>>&
lhs,
const View<detail::DynIntWrapper<VALUE_TYPE>>&
rhs)
226template <
typename VALUE_TYPE>
228 const View<detail::DynIntWrapper<VALUE_TYPE>>&
lhs,
const View<detail::DynIntWrapper<VALUE_TYPE>>&
rhs)
233template <
typename VALUE_TYPE>
235 const View<detail::DynIntWrapper<VALUE_TYPE>>&
lhs,
const View<detail::DynIntWrapper<VALUE_TYPE>>&
rhs)
243template <
typename VALUE_TYPE>
244void validate(
const View<detail::DynIntWrapper<VALUE_TYPE>>& view, std::string_view fieldName)
246 return validate(view.value(), view.numBits(), fieldName);
249template <
typename VALUE_TYPE>
250BitSize bitSizeOf(
const View<detail::DynIntWrapper<VALUE_TYPE>>& view,
BitSize = 0)
252 return view.numBits();
255template <
typename VALUE_TYPE>
256void write(BitStreamWriter& writer,
const View<detail::DynIntWrapper<VALUE_TYPE>>& view)
258 write(writer, view.value(), view.numBits());
268template <
typename VALUE_TYPE>
269struct hash<
zserio::
View<zserio::detail::DynIntWrapper<VALUE_TYPE>>>
271 size_t operator()(
const zserio::View<zserio::detail::DynIntWrapper<VALUE_TYPE>>& view)
const
273 uint32_t result = zserio::HASH_SEED;
uint8_t numBits(uint64_t numValues)
bool operator>(const BasicBitBufferView< ALLOC > &lhs, const BasicBitBufferView< ALLOC > &rhs)
bool operator==(const BasicBitBufferView< ALLOC > &lhs, const BasicBitBufferView< ALLOC > &rhs)
bool operator<(const BasicBitBufferView< ALLOC > &lhs, const BasicBitBufferView< ALLOC > &rhs)
uint32_t calcHashCode(uint32_t seedValue, const ArrayView< T, ARRAY_TRAITS > &array)
View(T, ARGS &&...) -> View< T >
const ParsingInfo & parsingInfo(const View< T > &view)
bool operator<=(const BasicBitBufferView< ALLOC > &lhs, const BasicBitBufferView< ALLOC > &rhs)
bool operator>=(const BasicBitBufferView< ALLOC > &lhs, const BasicBitBufferView< ALLOC > &rhs)
bool operator!=(const BasicBitBufferView< ALLOC > &lhs, const BasicBitBufferView< ALLOC > &rhs)