CppSerdes  1.0
A serialization/deserialization library designed with embedded systems in mind
serdes_format_modifiers.h
Go to the documentation of this file.
1 #ifndef _SERDES_FORMAT_MODIFIERS_H_
8 #define _SERDES_FORMAT_MODIFIERS_H_
9 
10 #include "bitcpy_common.h"
11 
13 namespace serdes
14 {
17  template <typename ST>
18  struct align
19  {
21  const ST &value;
22 
25  constexpr align(const ST &bits) noexcept : value{bits} {}
26 
29  constexpr align(ST &&bits) noexcept : value{bits} {}
30  };
31 
34  template <typename ST>
35  struct pad
36  {
38  const ST &value;
39 
42  constexpr pad(const ST &bits) noexcept : value{bits} {}
43 
46  constexpr pad(ST &&bits) noexcept : value{bits} {}
47  };
48 
53  template <typename T, typename ST>
54  struct bitpack
55  {
57  T &value;
58 
60  const ST &bits;
61 
65  constexpr bitpack(T &&v, const ST &&b) noexcept : value{v}, bits{std::move(b)} {}
66 
70  constexpr bitpack(T &v, const ST &&b) noexcept : value{v}, bits{std::move(b)} {}
71 
75  constexpr bitpack(T &v, const ST &b) noexcept : value{v}, bits{b} {}
76 
80  constexpr bitpack(T &&v, const ST &b) noexcept : value{v}, bits{b} {}
81  };
82 
86  template <typename T, typename ST>
87  struct array
88  {
92  using elem_type = typename detail::has_data_and_size<T>::elem_type;
93 
96 
98  const ST rvalue_size;
99 
103  const ST &size;
104 
106  const size_t max_size;
107 
112  template <size_t max_elements>
113  constexpr array(T (&v)[max_elements], const ST &s) noexcept : value{&v[0]}, rvalue_size{}, size{s}, max_size{max_elements} {}
114 
119  template <size_t max_elements>
120  constexpr array(T (&v)[max_elements], const ST &&s) noexcept : value{&v[0]}, rvalue_size{s}, size{rvalue_size}, max_size(max_elements) {}
121 
127  constexpr array(T *v, ST &s, const ST max_elements) noexcept : value{&v[0]}, rvalue_size{}, size{s}, max_size{max_elements} {}
128 
134  constexpr array(T *v, const ST &&s, const ST max_elements) noexcept : value{&v[0]}, rvalue_size{s}, size{rvalue_size}, max_size{max_elements} {}
135 
141  array(T &v, const ST &s) noexcept : value{v.data()}, rvalue_size{}, size{s}, max_size(v.size()) {}
142 
148  array(T &v, const ST &&s) noexcept : value{v.data()}, rvalue_size{s}, size{rvalue_size}, max_size(v.size()) {}
149 
154  array(T &v) noexcept : value{v.data()}, rvalue_size{max_size}, size{rvalue_size}, max_size(v.size()) {}
155  };
156 
159  template <typename T>
161  {
165  using elem_type = typename detail::has_data_and_size<T>::elem_type;
166 
169 
172 
174  const size_t max_size;
175 
180  template <size_t max_elements>
181  constexpr delimited_array(T (&v)[max_elements], const T &d) noexcept : value{&v[0]}, delimiter{d}, max_size{max_elements} {}
182 
187  template <size_t max_elements>
188  constexpr delimited_array(T (&v)[max_elements], const T &&d) noexcept : value{&v[0]}, delimiter{std::move(d)}, max_size{max_elements} {}
189 
194  constexpr delimited_array(T *v, const T &d, size_t max_elements) noexcept : value{&v[0]}, delimiter{d}, max_size{max_elements} {}
195 
200  constexpr delimited_array(T *v, const T &&d, size_t max_elements) noexcept : value{&v[0]}, delimiter{std::move(d)}, max_size{max_elements} {}
201 
207  delimited_array(T &v, const elem_type &d) noexcept : value{v.data()}, delimiter{d}, max_size(v.size()) {}
208 
214  delimited_array(T &v, const elem_type &&d) noexcept : value{v.data()}, delimiter{std::move(d)}, max_size(v.size()) {}
215  };
216 
217  struct packet_base;
218  struct formatter;
219  template <typename FieldType, typename FuncType>
220  struct validator;
221  namespace detail
222  {
223  template <typename T, typename ST>
224  struct default_bitsize<bitpack<T, ST>>
225  {
226  static constexpr size_t value = 0u;
227  };
228  template <typename T, typename T2>
229  struct default_bitsize<array<T, T2>>
230  {
231  static constexpr size_t value = sizeof(T) * 8u;
232  };
233  template <typename T>
234  struct default_bitsize<delimited_array<T>>
235  {
236  static constexpr size_t value = sizeof(T) * 8u;
237  };
238  template <typename ST>
239  struct default_bitsize<align<ST>>
240  {
241  static constexpr size_t value = 0u;
242  };
243  template <typename ST>
244  struct default_bitsize<pad<ST>>
245  {
246  static constexpr size_t value = 0u;
247  };
248  template <typename T>
249  struct is_formatter : std::false_type
250  {
251  };
252  template <>
253  struct is_formatter<formatter> : std::true_type
254  {
255  };
256  template <typename T>
257  struct is_validator : std::false_type
258  {
259  };
260  template <typename FieldType, typename FuncType>
261  struct is_validator<validator<FieldType, FuncType>> : std::true_type
262  {
263  };
264  template <typename T>
265  struct is_format_modifier
266  {
267  static constexpr bool value = has_format_method<T>::value;
268  };
269  template <>
270  struct is_format_modifier<formatter> : std::true_type
271  {
272  };
273  template <typename ST>
274  struct is_format_modifier<pad<ST>> : std::true_type
275  {
276  };
277  template <typename ST>
278  struct is_format_modifier<align<ST>> : std::true_type
279  {
280  };
281  template <typename T, typename ST>
282  struct is_format_modifier<bitpack<T, ST>> : std::true_type
283  {
284  };
285  template <typename T1, typename T2>
286  struct is_format_modifier<array<T1, T2>> : std::true_type
287  {
288  };
289  template <typename T>
290  struct is_format_modifier<delimited_array<T>> : std::true_type
291  {
292  };
293  }
294 }
295 
296 #endif // _SERDES_FORMAT_MODIFIERS_H_
serdes::align::align
constexpr 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
serdes::array::array
constexpr 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:120
serdes::array::array
constexpr array(T *v, ST &s, const ST 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:127
serdes::delimited_array::delimited_array
constexpr delimited_array(T(&v)[max_elements], const T &d) noexcept
Construct a new delimited array object using a referenced array and referenced delimiter.
Definition: serdes_format_modifiers.h:181
serdes::delimited_array::delimiter
const elem_type & delimiter
reference to a reserved delimiter value marking the end of the array
Definition: serdes_format_modifiers.h:171
serdes::bitpack::bits
const ST & bits
a reference to the number of bits to use when storing/loading the referenced value
Definition: serdes_format_modifiers.h:60
serdes::array::array
array(T &v, const ST &s) noexcept
Construct a new "dynamically" sized array object from a data container with 'T* data()' and 'size_t s...
Definition: serdes_format_modifiers.h:141
serdes::array::array
array(T &v) noexcept
Construct a new "fixed" sized array object from a data container with 'T* data()' and 'size_t size()'...
Definition: serdes_format_modifiers.h:154
serdes::bitpack
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
bitcpy_common.h
Defines common bitcpy details as well as a info::version number, and bit_length function.
serdes::bitpack::bitpack
constexpr bitpack(T &v, const ST &&b) noexcept
Construct a new bitpack object from a reference value, and rvalue bit length.
Definition: serdes_format_modifiers.h:70
serdes::array::elem_type
typename detail::has_data_and_size< T >::elem_type elem_type
Definition: serdes_format_modifiers.h:92
serdes::delimited_array::delimited_array
constexpr 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:188
serdes::delimited_array::delimited_array
constexpr 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,...
Definition: serdes_format_modifiers.h:200
serdes::array::size
const ST & size
a reference to a value that contains the dynamic size of the array for fixed sized arrays (where the ...
Definition: serdes_format_modifiers.h:103
serdes::delimited_array::value
elem_type * value
pointer to the head of the array
Definition: serdes_format_modifiers.h:168
serdes::bitpack::value
T & value
a reference to the bitpacked value
Definition: serdes_format_modifiers.h:57
serdes::array::array
constexpr array(T *v, const ST &&s, const ST 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:134
serdes::array
a container for fixed or dynamically sized arrays, with an upper bounds limit for safety
Definition: serdes_format_modifiers.h:87
serdes::array::array
constexpr 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:113
serdes::delimited_array
a container for dynamically sized arrays with their ending marked by a reserved delimiter value
Definition: serdes_format_modifiers.h:160
serdes::align
specifies a number of bits to be used to align the bit offset as a multiple of
Definition: serdes_format_modifiers.h:18
serdes::delimited_array::elem_type
typename detail::has_data_and_size< T >::elem_type elem_type
Definition: serdes_format_modifiers.h:165
serdes::bitpack::bitpack
constexpr 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
serdes::array::value
elem_type * value
a pointer to the array head
Definition: serdes_format_modifiers.h:95
serdes::delimited_array::max_size
const size_t max_size
maximum size of the array (used for bounds checking)
Definition: serdes_format_modifiers.h:174
serdes::validator
a field and its attached functional validation callable object, note that validation will occur after...
Definition: serdes_format_modifiers.h:220
serdes::pad::value
const ST & value
bit pad reference value
Definition: serdes_format_modifiers.h:38
serdes::align::align
constexpr 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
serdes::bitpack::bitpack
constexpr 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
serdes::pad::pad
constexpr 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
serdes::array::max_size
const size_t max_size
maximum size of the array (used for bounds checking)
Definition: serdes_format_modifiers.h:106
serdes::delimited_array::delimited_array
delimited_array(T &v, const elem_type &&d) noexcept
Construct a new delimited array object from a data container with 'T* data()' and 'size_t size()' met...
Definition: serdes_format_modifiers.h:214
serdes::bitpack::bitpack
constexpr bitpack(T &&v, const ST &&b) noexcept
Construct a new bitpack object from a rvalue value, and rvalue bit length.
Definition: serdes_format_modifiers.h:65
serdes::array::array
array(T &v, const ST &&s) noexcept
Construct a new "fixed" sized array object from a data container with 'T* data()' and 'size_t size()'...
Definition: serdes_format_modifiers.h:148
serdes::delimited_array::delimited_array
constexpr 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 referenced delimiter,...
Definition: serdes_format_modifiers.h:194
serdes
CppSerdes library namespace.
Definition: bitcpy_common.h:68
serdes::align::value
const ST & value
bit alignment reference value
Definition: serdes_format_modifiers.h:21
serdes::delimited_array::delimited_array
delimited_array(T &v, const elem_type &d) noexcept
Construct a new delimited array object from a data container with 'T* data()' and 'size_t size()' met...
Definition: serdes_format_modifiers.h:207
serdes::pad
specifies a number of bits to be used to pad (add to) the current bit offset
Definition: serdes_format_modifiers.h:35
serdes::pad::pad
constexpr 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
serdes::array::rvalue_size
const ST rvalue_size
holds onto an rvalue size if provide (so that const ST &size can have a local reference)
Definition: serdes_format_modifiers.h:98