MIP SDK  0.0.1
MicroStrain Communications Library for embedded systems
serialization.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <stdint.h>
4 #include <stdbool.h>
5 
6 #include "../mip_types.h"
7 #include "../mip_field.h"
8 
17 
18 #ifdef __cplusplus
19 #include <type_traits>
20 
21 namespace mip {
22 namespace C {
23 extern "C" {
24 #endif // __cplusplus
25 
26 
33 
34 
43 typedef struct mip_serializer
44 {
45  uint8_t* _buffer;
46  size_t _buffer_size;
47  size_t _offset;
49 
50 void mip_serializer_init_insertion(mip_serializer* serializer, uint8_t* buffer, size_t buffer_size);
51 void mip_serializer_init_extraction(mip_serializer* serializer, const uint8_t* buffer, size_t buffer_size);
53 
54 size_t mip_serializer_capacity(const mip_serializer* serializer);
55 size_t mip_serializer_length(const mip_serializer* serializer);
57 
58 bool mip_serializer_is_ok(const mip_serializer* serializer);
60 
61 
62 void insert_bool(mip_serializer* serializer, bool value);
63 void insert_char(mip_serializer* serializer, char value);
64 
65 void insert_u8 (mip_serializer* serializer, uint8_t value);
66 void insert_u16(mip_serializer* serializer, uint16_t value);
67 void insert_u32(mip_serializer* serializer, uint32_t value);
68 void insert_u64(mip_serializer* serializer, uint64_t value);
69 
70 void insert_s8 (mip_serializer* serializer, int8_t value);
71 void insert_s16(mip_serializer* serializer, int16_t value);
72 void insert_s32(mip_serializer* serializer, int32_t value);
73 void insert_s64(mip_serializer* serializer, int64_t value);
74 
75 void insert_float (mip_serializer* serializer, float value);
76 void insert_double(mip_serializer* serializer, double value);
77 
78 
79 void extract_bool(mip_serializer* serializer, bool* value);
80 void extract_char(mip_serializer* serializer, char* value);
81 
82 void extract_u8 (mip_serializer* serializer, uint8_t* value);
83 void extract_u16(mip_serializer* serializer, uint16_t* value);
84 void extract_u32(mip_serializer* serializer, uint32_t* value);
85 void extract_u64(mip_serializer* serializer, uint64_t* value);
86 
87 void extract_s8 (mip_serializer* serializer, int8_t* value);
88 void extract_s16(mip_serializer* serializer, int16_t* value);
89 void extract_s32(mip_serializer* serializer, int32_t* value);
90 void extract_s64(mip_serializer* serializer, int64_t* value);
91 
92 void extract_float (mip_serializer* serializer, float* value);
93 void extract_double(mip_serializer* serializer, double* value);
94 
95 void extract_count(mip_serializer* serializer, uint8_t* count_out, uint8_t max_count);
96 
99 
100 #ifdef __cplusplus
101 } // extern "C"
102 } // namespace C
103 
140 
145 {
146 public:
147  Serializer(uint8_t* buffer, size_t size, size_t offset=0) { C::mip_serializer_init_insertion(this, buffer, size); this->_offset = offset; }
148  Serializer(const uint8_t* buffer, size_t size, size_t offset=0) { C::mip_serializer_init_extraction(this, const_cast<uint8_t*>(buffer), size); this->_offset = offset; }
149 
150  size_t capacity() const { return C::mip_serializer_capacity(this); }
151  size_t length() const { return C::mip_serializer_length(this); }
153 
154  bool isOk() const { return C::mip_serializer_is_ok(this); }
155  bool isComplete() const { return C::mip_serializer_is_complete(this); }
156 
157  operator const void*() const { return isOk() ? this : nullptr; }
158  bool operator!() const { return !isOk(); }
159 };
160 
161 
162 
163 inline void insert(Serializer& serializer, bool value) { return C::insert_bool (&serializer, value); }
164 inline void insert(Serializer& serializer, char value) { return C::insert_char (&serializer, value); }
165 inline void insert(Serializer& serializer, uint8_t value) { return C::insert_u8 (&serializer, value); }
166 inline void insert(Serializer& serializer, uint16_t value) { return C::insert_u16 (&serializer, value); }
167 inline void insert(Serializer& serializer, uint32_t value) { return C::insert_u32 (&serializer, value); }
168 inline void insert(Serializer& serializer, uint64_t value) { return C::insert_u64 (&serializer, value); }
169 inline void insert(Serializer& serializer, int8_t value) { return C::insert_s8 (&serializer, value); }
170 inline void insert(Serializer& serializer, int16_t value) { return C::insert_s16 (&serializer, value); }
171 inline void insert(Serializer& serializer, int32_t value) { return C::insert_s32 (&serializer, value); }
172 inline void insert(Serializer& serializer, int64_t value) { return C::insert_s64 (&serializer, value); }
173 inline void insert(Serializer& serializer, float value) { return C::insert_float (&serializer, value); }
174 inline void insert(Serializer& serializer, double value) { return C::insert_double(&serializer, value); }
175 
184 template<typename Enum>
185 typename std::enable_if< std::is_enum<Enum>::value, void>::type
186 /*void*/ insert(Serializer& serializer, Enum value) { return insert(serializer, static_cast< typename std::underlying_type<Enum>::type >(value) ); }
187 
200 template<typename T>
201 bool insert(const T& value, uint8_t* buffer, size_t bufferSize)
202 {
203  Serializer serializer(buffer, bufferSize);
204  insert(serializer, value);
205  return !!serializer;
206 }
207 
208 inline void extract(Serializer& serializer, bool& value) { return C::extract_bool (&serializer, &value); }
209 inline void extract(Serializer& serializer, char& value) { return C::extract_char (&serializer, &value); }
210 inline void extract(Serializer& serializer, uint8_t& value) { return C::extract_u8 (&serializer, &value); }
211 inline void extract(Serializer& serializer, uint16_t& value) { return C::extract_u16 (&serializer, &value); }
212 inline void extract(Serializer& serializer, uint32_t& value) { return C::extract_u32 (&serializer, &value); }
213 inline void extract(Serializer& serializer, uint64_t& value) { return C::extract_u64 (&serializer, &value); }
214 inline void extract(Serializer& serializer, int8_t& value) { return C::extract_s8 (&serializer, &value); }
215 inline void extract(Serializer& serializer, int16_t& value) { return C::extract_s16 (&serializer, &value); }
216 inline void extract(Serializer& serializer, int32_t& value) { return C::extract_s32 (&serializer, &value); }
217 inline void extract(Serializer& serializer, int64_t& value) { return C::extract_s64 (&serializer, &value); }
218 inline void extract(Serializer& serializer, float& value) { return C::extract_float (&serializer, &value); }
219 inline void extract(Serializer& serializer, double& value) { return C::extract_double(&serializer, &value); }
220 
229 template<typename Enum>
230 typename std::enable_if< std::is_enum<Enum>::value, void>::type
231 /*void*/ extract(Serializer& serializer, Enum& value) {
232  typename std::underlying_type<Enum>::type tmp;
233  extract(serializer, tmp);
234  value = static_cast<Enum>(tmp);
235 }
236 
257 template<typename T>
258 bool extract(T& value_out, const uint8_t* buffer, size_t bufferSize, size_t offset=0, bool exact_size=false)
259 {
260  Serializer serializer(buffer, bufferSize, offset);
261  extract(serializer, value_out);
262  return exact_size ? serializer.isComplete() : serializer.isOk();
263 }
264 
268 
269 } // namespace mip
270 #endif // __cplusplus
271 
272 ////////////////////////////////////////////////////////////////////////////////
Serialization class.
Definition: serialization.h:145
bool isComplete() const
Definition: serialization.h:155
Serializer(const uint8_t *buffer, size_t size, size_t offset=0)
Definition: serialization.h:148
bool isOk() const
Definition: serialization.h:154
size_t length() const
Definition: serialization.h:151
RemainingCount remaining() const
Definition: serialization.h:152
Serializer(uint8_t *buffer, size_t size, size_t offset=0)
Definition: serialization.h:147
bool operator!() const
Definition: serialization.h:158
size_t capacity() const
Definition: serialization.h:150
void mip_serializer_init_extraction(mip_serializer *serializer, const uint8_t *buffer, size_t buffer_size)
void mip_serializer_init_from_field(mip_serializer *serializer, const mip_field *field)
void extract_bool(mip_serializer *serializer, bool *value)
void extract_s32(mip_serializer *serializer, int32_t *value)
void mip_serializer_init_insertion(mip_serializer *serializer, uint8_t *buffer, size_t buffer_size)
void insert_s64(mip_serializer *serializer, int64_t value)
void insert_u32(mip_serializer *serializer, uint32_t value)
void extract_char(mip_serializer *serializer, char *value)
void extract_count(mip_serializer *serializer, uint8_t *count_out, uint8_t max_count)
size_t mip_serializer_capacity(const mip_serializer *serializer)
size_t mip_serializer_length(const mip_serializer *serializer)
void extract_s16(mip_serializer *serializer, int16_t *value)
void extract_s8(mip_serializer *serializer, int8_t *value)
void insert_s32(mip_serializer *serializer, int32_t value)
void insert_u8(mip_serializer *serializer, uint8_t value)
void insert_u16(mip_serializer *serializer, uint16_t value)
void insert_bool(mip_serializer *serializer, bool value)
void extract_u8(mip_serializer *serializer, uint8_t *value)
void insert_char(mip_serializer *serializer, char value)
void extract_u64(mip_serializer *serializer, uint64_t *value)
void extract_s64(mip_serializer *serializer, int64_t *value)
void extract_u16(mip_serializer *serializer, uint16_t *value)
void insert_double(mip_serializer *serializer, double value)
struct mip::C::mip_serializer mip_serializer
Structure used for serialization.
bool mip_serializer_is_complete(const mip_serializer *serializer)
void extract_double(mip_serializer *serializer, double *value)
void insert_s16(mip_serializer *serializer, int16_t value)
void insert_u64(mip_serializer *serializer, uint64_t value)
void extract_float(mip_serializer *serializer, float *value)
bool mip_serializer_is_ok(const mip_serializer *serializer)
void insert_s8(mip_serializer *serializer, int8_t value)
void extract_u32(mip_serializer *serializer, uint32_t *value)
void insert_float(mip_serializer *serializer, float value)
remaining_count mip_serializer_remaining(const mip_serializer *serializer)
int_least16_t remaining_count
Definition: mip_types.h:16
A collection of C++ classes and functions covering the full mip api.
Definition: commands_3dm.c:11
void extract(Serializer &serializer, Bitfield< Derived > &bitfield)
Definition: descriptors.h:98
void insert(Serializer &serializer, const Bitfield< Derived > &bitfield)
Definition: descriptors.h:97
C::remaining_count RemainingCount
Definition: mip_types.h:42
A structure representing a MIP field.
Definition: mip_field.h:53
Structure used for serialization.
Definition: serialization.h:44