1#ifndef ZSERIO_ARRAY_TRAIT_H_INC
2#define ZSERIO_ARRAY_TRAIT_H_INC
25template <
typename T,
typename =
void>
34template <
typename ARRAY_TRAITS,
typename =
void>
35struct array_owner_type
37 using type = DummyArrayOwner;
40template <
typename ARRAY_TRAITS>
41struct array_owner_type<ARRAY_TRAITS,
std::void_t<typename ARRAY_TRAITS::OwnerType>>
43 using type =
typename ARRAY_TRAITS::OwnerType;
46template <
typename T,
typename V =
void>
47using array_owner_type_t =
typename array_owner_type<T, V>::type;
50struct is_dummy_array_owner : std::is_same<DummyArrayOwner, T>
54inline constexpr bool is_dummy_array_owner_v = is_dummy_array_owner<T>::value;
56template <
typename T,
typename =
void>
57struct is_packable : std::false_type
61struct is_packable<T,
std::enable_if_t<is_numeric_wrapper_v<T> || is_bitmask_v<T> || std::is_enum_v<T>>>
66struct is_packable<T,
std::enable_if_t<is_complete_v<typename ObjectTraits<std::decay_t<T>>::PackingContext>>>
70template <
typename T,
typename V =
void>
71inline constexpr bool is_packable_v = is_packable<T, V>::value;
74struct is_delta_context : std::is_same<DeltaContext, T>
78inline constexpr bool is_delta_context_v = is_delta_context<T>::value;
81struct NumericArrayTraits
83 static const T& at(
const detail::DummyArrayOwner&,
const T& element,
size_t)
88 static T& at(
const detail::DummyArrayOwner&, T& element,
size_t)
93 static void read(BitStreamReader& reader,
const detail::DummyArrayOwner&, T& element,
size_t)
95 detail::read(reader, element);
100 return detail::bitSizeOf(T{});
105struct IntegralArrayTraits : NumericArrayTraits<T>
107 using NumericArrayTraits<T>::read;
110 DeltaContext& context, BitStreamReader& reader,
const detail::DummyArrayOwner&, T& element,
size_t)
112 detail::read(context, reader, element);
119template <
typename OBJECT,
typename>
122 template <
typename OBJECT_ = OBJECT,
123 std::enable_if_t<std::is_constructible_v<View<OBJECT_>,
const OBJECT&>,
int> = 0>
124 static View<OBJECT> at(
const detail::DummyArrayOwner&,
const OBJECT& element,
size_t)
130 std::enable_if_t<std::is_constructible_v<View<OBJECT_>,
OBJECT&>,
int> = 0>
141 template <
typename OBJECT_ = OBJECT>
142 static std::enable_if_t<!detail::is_delta_context_v<detail::packing_context_type_t<OBJECT_>>>
read(
151struct ArrayTraits<detail::BoolWrapper> : detail::IntegralArrayTraits<detail::BoolWrapper>
154template <BitSize BIT_SIZE,
bool IS_SIGNED>
155struct ArrayTraits<detail::FixedIntWrapper<BIT_SIZE, IS_SIGNED>>
156 : detail::IntegralArrayTraits<detail::FixedIntWrapper<BIT_SIZE, IS_SIGNED>>
159template <
typename VALUE_TYPE,
typename detail::VarIntType VAR_TYPE>
160struct ArrayTraits<detail::VarIntWrapper<VALUE_TYPE, VAR_TYPE>>
161 : detail::IntegralArrayTraits<detail::VarIntWrapper<VALUE_TYPE, VAR_TYPE>>
164template <
typename VALUE_TYPE, detail::FloatType FLOAT_TYPE>
165struct ArrayTraits<detail::FloatWrapper<VALUE_TYPE, FLOAT_TYPE>>
166 : detail::NumericArrayTraits<detail::FloatWrapper<VALUE_TYPE, FLOAT_TYPE>>
169template <
typename ALLOC>
184template <
typename ALLOC>
200template <
typename ALLOC>
203 static constexpr std::string_view
at(
const detail::DummyArrayOwner&, std::string_view
element,
size_t)
218 static T
at(
const detail::DummyArrayOwner&, T
element,
size_t)
238 static T
at(
const detail::DummyArrayOwner&, T
element,
size_t)
std::basic_string< char, std::char_traits< char >, ALLOC > BasicString
std::vector< uint8_t, ALLOC > BasicBytes
static constexpr BasicBitBufferView< ALLOC > at(const detail::DummyArrayOwner &, const BasicBitBuffer< ALLOC > &element, size_t)
static void read(BitStreamReader &reader, const detail::DummyArrayOwner &, BasicBitBuffer< ALLOC > &element, size_t)
static constexpr BytesView at(const detail::DummyArrayOwner &, const BasicBytes< ALLOC > &element, size_t)
static void read(BitStreamReader &reader, const detail::DummyArrayOwner &, BasicBytes< ALLOC > &element, size_t)
static constexpr std::string_view at(const detail::DummyArrayOwner &, std::string_view element, size_t)
static void read(BitStreamReader &reader, const detail::DummyArrayOwner &, BasicString< ALLOC > &element, size_t)
static void read(BitStreamReader &reader, const detail::DummyArrayOwner &, T &element, size_t)
static void read(detail::DeltaContext &context, BitStreamReader &reader, const detail::DummyArrayOwner &, T &element, size_t)
static T at(const detail::DummyArrayOwner &, T element, size_t)
static void read(BitStreamReader &reader, const detail::DummyArrayOwner &, T &element, size_t)
static void read(detail::DeltaContext &context, BitStreamReader &reader, const detail::DummyArrayOwner &, T &element, size_t)
static T at(const detail::DummyArrayOwner &, T element, size_t)
static void read(BitStreamReader &reader, const detail::DummyArrayOwner &, OBJECT &element, size_t)
static View< OBJECT > at(const detail::DummyArrayOwner &, const OBJECT &element, size_t)
static View< OBJECT > at(const detail::DummyArrayOwner &, OBJECT &element, size_t)
static std::enable_if_t<!detail::is_delta_context_v< detail::packing_context_type_t< OBJECT_ > > > read(typename detail::ObjectTraits< OBJECT_ >::PackingContext &packingContext, BitStreamReader &reader, const detail::DummyArrayOwner &, OBJECT &element, size_t)