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  align(const ST &bits) noexcept : value{bits} {}
26 
29  align(ST &&bits) noexcept : value{bits} {}
30  };
31 
34  template <typename ST>
35  struct pad
36  {
38  const ST &value;
39 
42  pad(const ST &bits) noexcept : value{bits} {}
43 
46  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  bitpack(T &&v, ST &&b) noexcept : value{v}, bits{b} {}
66 
70  bitpack(T &v, ST &&b) noexcept : value{v}, bits{b} {}
71 
75  bitpack(T &v, const ST &b) noexcept : value{v}, bits{b} {}
76 
80  bitpack(T &&v, const ST &b) noexcept : value{v}, bits{b} {}
81  };
82 
86  template <typename T, typename ST>
87  struct array
88  {
90  T *value;
91 
93  const ST &size;
94 
96  const size_t max_size;
97 
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} {}
104 
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} {}
111 
117  array(T *v, ST &s, const size_t max_elements) noexcept : value{&v[0]}, size{s}, max_size{max_elements} {}
118 
124  array(T *v, const ST &&s, const size_t max_elements) noexcept : value{&v[0]}, size{std::move(s)}, max_size{max_elements} {}
125  };
126 
129  template <typename T>
131  {
133  T *value;
134 
136  const T &delimiter;
137 
139  const size_t max_size;
140 
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} {}
147 
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} {}
154 
159  delimited_array(T *v, T &d, size_t max_elements) noexcept : value{&v[0]}, delimiter{d}, max_size{max_elements} {}
160 
165  delimited_array(T *v, const T &&d, size_t max_elements) noexcept : value{&v[0]}, delimiter{std::move(d)}, max_size{max_elements} {}
166  };
167 
168  struct packet_base;
169  struct formatter;
170  namespace detail
171  {
172  template <typename T, typename ST>
173  struct default_bitsize<bitpack<T, ST>>
174  {
175  static constexpr size_t value = 0u;
176  };
177  template <typename T, typename T2>
178  struct default_bitsize<array<T, T2>>
179  {
180  static constexpr size_t value = sizeof(T) * 8u;
181  };
182  template <typename T>
183  struct default_bitsize<delimited_array<T>>
184  {
185  static constexpr size_t value = sizeof(T) * 8u;
186  };
187  template <typename ST>
188  struct default_bitsize<align<ST>>
189  {
190  static constexpr size_t value = 0u;
191  };
192  template <typename ST>
193  struct default_bitsize<pad<ST>>
194  {
195  static constexpr size_t value = 0u;
196  };
197  template <typename T>
198  struct is_format_modifier
199  {
200  static constexpr bool value = std::is_base_of<packet_base, T>::value;
201  };
202  template <>
203  struct is_format_modifier<formatter> : std::true_type
204  {
205  };
206  template <typename ST>
207  struct is_format_modifier<pad<ST>> : std::true_type
208  {
209  };
210  template <typename ST>
211  struct is_format_modifier<align<ST>> : std::true_type
212  {
213  };
214  template <typename T, typename ST>
215  struct is_format_modifier<bitpack<T, ST>> : std::true_type
216  {
217  };
218  template <typename T1, typename T2>
219  struct is_format_modifier<array<T1, T2>> : std::true_type
220  {
221  };
222  template <typename T>
223  struct is_format_modifier<delimited_array<T>> : std::true_type
224  {
225  };
226  }
227 }
228 
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
a lambda function wrapper that can describe any serialization/deserialization formatting process...
Definition: serdes_formatter.h:32
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