1 #ifndef _SERDES_FORMAT_MODIFIERS_H_ 8 #define _SERDES_FORMAT_MODIFIERS_H_ 17 template <
typename ST>
25 align(
const ST &bits) noexcept : value{bits} {}
29 align(ST &&bits) noexcept : value{bits} {}
34 template <
typename ST>
42 pad(
const ST &bits) noexcept : value{bits} {}
46 pad(ST &&bits) noexcept : value{bits} {}
53 template <
typename T,
typename ST>
65 bitpack(T &&v, ST &&b) noexcept : value{v}, bits{b} {}
70 bitpack(T &v, ST &&b) noexcept : value{v}, bits{b} {}
75 bitpack(T &v,
const ST &b) noexcept : value{v}, bits{b} {}
80 bitpack(T &&v,
const ST &b) noexcept : value{v}, bits{b} {}
86 template <
typename T,
typename ST>
102 template <
size_t max_elements>
103 array(T (&v)[max_elements],
const ST &s) noexcept : value{&v[0]}, size{s}, max_size{max_elements} {}
109 template <
size_t max_elements>
110 array(T (&v)[max_elements],
const ST &&s) noexcept : value{&v[0]}, size{std::move(s)}, max_size{max_elements} {}
117 array(T *v, ST &s,
const size_t max_elements) noexcept : value{&v[0]}, size{s}, max_size{max_elements} {}
124 array(T *v,
const ST &&s,
const size_t max_elements) noexcept : value{&v[0]}, size{std::move(s)}, max_size{max_elements} {}
129 template <
typename T>
145 template <
size_t max_elements>
146 delimited_array(T (&v)[max_elements], T &d) noexcept : value{&v[0]}, delimiter{d}, max_size{max_elements} {}
152 template <
size_t max_elements>
153 delimited_array(T (&v)[max_elements],
const T &&d) noexcept : value{&v[0]}, delimiter{std::move(d)}, max_size{max_elements} {}
159 delimited_array(T *v, T &d,
size_t max_elements) noexcept : value{&v[0]}, delimiter{d}, max_size{max_elements} {}
165 delimited_array(T *v,
const T &&d,
size_t max_elements) noexcept : value{&v[0]}, delimiter{std::move(d)}, max_size{max_elements} {}
172 template <
typename T,
typename ST>
173 struct default_bitsize<bitpack<T, ST>>
175 static constexpr
size_t value = 0u;
177 template <
typename T,
typename T2>
178 struct default_bitsize<array<T, T2>>
180 static constexpr
size_t value =
sizeof(T) * 8u;
182 template <
typename T>
183 struct default_bitsize<delimited_array<T>>
185 static constexpr
size_t value =
sizeof(T) * 8u;
187 template <
typename ST>
188 struct default_bitsize<align<ST>>
190 static constexpr
size_t value = 0u;
192 template <
typename ST>
193 struct default_bitsize<pad<ST>>
195 static constexpr
size_t value = 0u;
197 template <
typename T>
198 struct is_format_modifier
200 static constexpr
bool value = std::is_base_of<packet_base, T>::value;
203 struct is_format_modifier<formatter> : std::true_type
206 template <
typename ST>
207 struct is_format_modifier<pad<ST>> : std::true_type
210 template <
typename ST>
211 struct is_format_modifier<align<ST>> : std::true_type
214 template <
typename T,
typename ST>
215 struct is_format_modifier<bitpack<T, ST>> : std::true_type
218 template <
typename T1,
typename T2>
219 struct is_format_modifier<array<T1, T2>> : std::true_type
222 template <
typename T>
223 struct is_format_modifier<delimited_array<T>> : std::true_type
229 #endif // _SERDES_FORMAT_MODIFIERS_H_ Defines common bitcpy details as well as a info::version number, and bit_length function.
specifies a number of bits to be used to pad (add to) the current bit offset
Definition: serdes_format_modifiers.h:35
const size_t max_size
maximum size of the array (used for bounds checking)
Definition: serdes_format_modifiers.h:139
bitpack(T &&v, ST &&b) noexcept
Construct a new bitpack object from a rvalue value, and rvalue bit length.
Definition: serdes_format_modifiers.h:65
delimited_array(T(&v)[max_elements], T &d) noexcept
Construct a new delimited array object using a referenced array and referenced delimiter.
Definition: serdes_format_modifiers.h:146
specifies a number of bits to be used to align the bit offset as a multiple of
Definition: serdes_format_modifiers.h:18
delimited_array(T(&v)[max_elements], const T &&d) noexcept
Construct a new delimited array object using a referenced array and rvalue delimiter.
Definition: serdes_format_modifiers.h:153
const ST & value
bit pad reference value
Definition: serdes_format_modifiers.h:38
CppSerdes library namespace.
Definition: bitcpy_common.h:69
array(T *v, ST &s, const size_t max_elements) noexcept
Construct a new array object from a pointer to the head of the array, a referenced dynamic size...
Definition: serdes_format_modifiers.h:117
array(T(&v)[max_elements], const ST &&s) noexcept
Construct a new array object from an existing array and a rvalue size.
Definition: serdes_format_modifiers.h:110
inheritable base class to allow format recording and application with no additional memory storage (e...
Definition: serdes_fwd_declarations.h:42
align(const ST &bits) noexcept
Construct a new align object, binding to a reference of the number of bits to align by...
Definition: serdes_format_modifiers.h:25
array(T *v, const ST &&s, const size_t max_elements) noexcept
Construct a new array object from a pointer to the head of the array, a rvalue dynamic size...
Definition: serdes_format_modifiers.h:124
array(T(&v)[max_elements], const ST &s) noexcept
Construct a new array object from an existing array and a referenced size.
Definition: serdes_format_modifiers.h:103
bitpack(T &v, const ST &b) noexcept
Construct a new bitpack object from a reference value, and reference bit length.
Definition: serdes_format_modifiers.h:75
a container for dynamically sized arrays with their ending marked by a reserved delimiter value ...
Definition: serdes_format_modifiers.h:130
delimited_array(T *v, const T &&d, size_t max_elements) noexcept
Construct a new delimited array object using a pointer to an array, a rvalue delimiter, and a max size.
Definition: serdes_format_modifiers.h:165
const size_t max_size
maximum size of the array (used for bounds checking)
Definition: serdes_format_modifiers.h:96
const T & delimiter
reference to a reserved delimiter value marking the end of the array
Definition: serdes_format_modifiers.h:136
T * value
pointer to the head of the array
Definition: serdes_format_modifiers.h:133
const ST & size
a reference to a value that contains the dynamic size of the array
Definition: serdes_format_modifiers.h:93
a container for fixed or dynamically sized arrays, with an upper bounds limit for safety ...
Definition: serdes_format_modifiers.h:87
pad(const ST &bits) noexcept
Construct a new pad object, binding to a reference of the number of bits to pad by.
Definition: serdes_format_modifiers.h:42
T * value
a pointer to the array head
Definition: serdes_format_modifiers.h:90
delimited_array(T *v, T &d, size_t max_elements) noexcept
Construct a new delimited array object using a pointer to an array, a referenced delimiter, and a max size.
Definition: serdes_format_modifiers.h:159
const ST & value
bit alignment reference value
Definition: serdes_format_modifiers.h:21
bitpack(T &&v, const ST &b) noexcept
Construct a new bitpack object from a rvalue value, and reference bit length.
Definition: serdes_format_modifiers.h:80
T & value
a reference to the bitpacked value
Definition: serdes_format_modifiers.h:57
const ST & bits
a reference to the number of bits to use when storing/loading the referenced value ...
Definition: serdes_format_modifiers.h:60
bitpack(T &v, ST &&b) noexcept
Construct a new bitpack object from a reference value, and rvalue bit length.
Definition: serdes_format_modifiers.h:70
align(ST &&bits) noexcept
Construct a new align object, binding to a rvalue of the number of bits to align by.
Definition: serdes_format_modifiers.h:29
pad(ST &&bits) noexcept
Construct a new pad object, binding to a rvalue of the number of bits to pad by.
Definition: serdes_format_modifiers.h:46
bitpack a value into an exact number of specified bits. If applied to an array it will be applied to ...
Definition: serdes_format_modifiers.h:54