1 #ifndef ZSERIO_VIEW_H_INC
2 #define ZSERIO_VIEW_H_INC
30 template <
typename T,
typename... ARGS>
41 return view.zserioData().m_parsingInfo;
54 template <
size_t I,
typename T,
typename U>
55 view_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));
80 void validate(
const View<T>& view, std::string_view fieldName =
"")
82 ObjectTraits<T>::validate(view, fieldName);
96 return ObjectTraits<T>::bitSizeOf(view, bitPosition);
99 template <
typename T,
typename =
void>
100 struct has_initialize_offsets : std::false_type
103 template <
typename T>
104 struct has_initialize_offsets<T,
105 std::void_t<decltype(ObjectTraits<T>().initializeOffsets(std::declval<const View<T>&>(), 0))>>
109 template <
typename T,
typename V =
void>
110 inline constexpr
bool has_initialize_offsets_v = has_initialize_offsets<T, V>::value;
112 template <
typename T>
113 BitSize 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);
133 template <
typename T>
134 void write(BitStreamWriter& writer,
const View<T>& view)
136 ObjectTraits<T>::write(writer, view);
150 template <
typename T,
typename... ARGS>
151 View<T> read(BitStreamReader& reader, T& data, ARGS&&... args)
153 return ObjectTraits<T>::read(reader, data, std::forward<ARGS>(args)...);
158 template <
typename VALUE_TYPE>
159 class 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;
189 template <
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();
196 template <
typename VALUE_TYPE>
198 const View<detail::DynIntWrapper<VALUE_TYPE>>& lhs,
const View<detail::DynIntWrapper<VALUE_TYPE>>& rhs)
200 return !(lhs == rhs);
203 template <
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();
219 template <
typename VALUE_TYPE>
221 const View<detail::DynIntWrapper<VALUE_TYPE>>& lhs,
const View<detail::DynIntWrapper<VALUE_TYPE>>& rhs)
226 template <
typename VALUE_TYPE>
228 const View<detail::DynIntWrapper<VALUE_TYPE>>& lhs,
const View<detail::DynIntWrapper<VALUE_TYPE>>& rhs)
233 template <
typename VALUE_TYPE>
235 const View<detail::DynIntWrapper<VALUE_TYPE>>& lhs,
const View<detail::DynIntWrapper<VALUE_TYPE>>& rhs)
243 template <
typename VALUE_TYPE>
244 void validate(
const View<detail::DynIntWrapper<VALUE_TYPE>>& view, std::string_view fieldName)
246 return validate(view.value(), view.numBits(), fieldName);
249 template <
typename VALUE_TYPE>
252 return view.numBits();
255 template <
typename VALUE_TYPE>
256 void write(BitStreamWriter& writer,
const View<detail::DynIntWrapper<VALUE_TYPE>>& view)
258 write(writer, view.value(), view.numBits());
268 template <
typename VALUE_TYPE>
269 struct 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)
const ParsingInfo & parsingInfo(const View< T > &view)
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 >
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)