F´ Flight Software - C/C++ Documentation
A framework for building embedded system applications to NASA flight quality standards.
Serializable.hpp
Go to the documentation of this file.
1 #ifndef SERIALIZABLE_HPP
2 #define SERIALIZABLE_HPP
3 
4 #ifdef BUILD_UT
5 #include <iostream>
6 #endif
7 
9 #include "Fw/Deprecate.hpp"
10 
11 namespace Fw {
12 
13 class StringBase;
14 typedef enum {
23 class SerializeBufferBase;
24 
25 struct Serialization {
26  enum t {
29  };
30 };
31 
32 enum class Endianness {
33  BIG,
34  LITTLE
35 };
36 
37 class Serializable {
38  public:
39  // Size type for backwards compatibility
41 
42  public:
44  Endianness mode = Endianness::BIG) const = 0;
45 
47  SerializeBufferBase& buffer,
48  Endianness mode = Endianness::BIG) = 0;
49 
50  // ----------------------------------------------------------------------
51  // Legacy methods for backward compatibility
52  // ----------------------------------------------------------------------
53 
55  "Use serializeTo(SerializeBufferBase& buffer) instead") {
56  return this->serializeTo(buffer);
57  }
58 
60  "Use deserializeFrom(SerializeBufferBase& buffer) instead") {
61  return this->deserializeFrom(buffer);
62  }
63 
64 #if FW_SERIALIZABLE_TO_STRING || FW_ENABLE_TEXT_LOGGING || BUILD_UT
65  virtual void toString(StringBase& text) const;
66 #endif
67 
68 #ifdef BUILD_UT
69  friend std::ostream& operator<<(std::ostream& os, const Serializable& val);
70 #endif
71 
72  protected:
73  Serializable();
74  virtual ~Serializable();
75 };
76 
79 
80  protected:
82 
83  public:
84  virtual ~SerializeBufferBase();
85 
86  // Serialization for built-in types
87 
90 
91 #if FW_HAS_16_BIT == 1
94 #endif
95 #if FW_HAS_32_BIT == 1
98 #endif
99 #if FW_HAS_64_BIT == 1
102 #endif
106 
107  SerializeStatus serializeFrom(const void* val,
108  Endianness mode = Endianness::BIG);
109 
112  SerializeStatus serializeFrom(const U8* buff, FwSizeType length, Endianness endianMode = Endianness::BIG);
113 
123  SerializeStatus serializeFrom(const U8* buff,
124  FwSizeType length,
125  Serialization::t lengthMode,
126  Endianness endianMode = Endianness::BIG);
127 
129  Endianness mode = Endianness::BIG);
130 
132  const Serializable& val,
133  Endianness mode = Endianness::BIG);
134 
136  Endianness mode = Endianness::BIG);
137 
138  // Deserialization for built-in types
139 
142 
143 #if FW_HAS_16_BIT == 1
146 #endif
147 
148 #if FW_HAS_32_BIT == 1
151 #endif
152 #if FW_HAS_64_BIT == 1
155 #endif
159 
161  void*& val,
162  Endianness mode = Endianness::BIG);
163 
165  FwSizeType& length,
166  Endianness endianMode = Endianness::BIG);
167 
176  FwSizeType& length,
177  Serialization::t lengthMode,
178  Endianness endianMode = Endianness::BIG);
179 
181  Serializable& val,
182  Endianness mode = Endianness::BIG);
183 
185  Endianness mode = Endianness::BIG);
186 
188 
189  // ----------------------------------------------------------------------
190  // Serialization methods
191  // ----------------------------------------------------------------------
192 
193  DEPRECATED(SerializeStatus serialize(U8 val), "Use serializeFrom(U8 val) instead");
194  DEPRECATED(SerializeStatus serialize(I8 val), "Use serializeFrom(I8 val) instead");
195 #if FW_HAS_16_BIT == 1
196  DEPRECATED(SerializeStatus serialize(U16 val), "Use serializeFrom(U16 val) instead");
197  DEPRECATED(SerializeStatus serialize(I16 val), "Use serializeFrom(I16 val) instead");
198 #endif
199 #if FW_HAS_32_BIT == 1
200  DEPRECATED(SerializeStatus serialize(U32 val), "Use serializeFrom(U32 val) instead");
201  DEPRECATED(SerializeStatus serialize(I32 val), "Use serializeFrom(I32 val) instead");
202 #endif
203 #if FW_HAS_64_BIT == 1
204  DEPRECATED(SerializeStatus serialize(U64 val), "Use serializeFrom(U64 val) instead");
205  DEPRECATED(SerializeStatus serialize(I64 val), "Use serializeFrom(I64 val) instead");
206 #endif
207 
208  DEPRECATED(SerializeStatus serialize(F32 val), "Use serializeFrom(F32 val) instead");
209  DEPRECATED(SerializeStatus serialize(F64 val), "Use serializeFrom(F64 val) instead");
210  DEPRECATED(SerializeStatus serialize(bool val), "Use serializeFrom(bool val) instead");
211  DEPRECATED(SerializeStatus serialize(const void* val), "Use serializeFrom(const void* val) instead");
212  DEPRECATED(SerializeStatus serialize(const U8* buff, FwSizeType length, bool noLength),
213  "Use serialize(const U8* buff, FwSizeType length, Serialization::t mode) instead");
214  DEPRECATED(SerializeStatus serialize(const U8* buff, FwSizeType length),
215  "Use serializeFrom(const U8* buff, FwSizeType length) instead");
216  DEPRECATED(SerializeStatus serialize(const U8* buff, FwSizeType length, Serialization::t mode),
217  "Use serializeFrom(const U8* buff, FwSizeType length, Serialization::t mode) instead");
218  DEPRECATED(SerializeStatus serialize(const Serializable& val),
219  "Use serializeFrom(const Serializable& val) instead");
220  DEPRECATED(SerializeStatus serialize(const SerializeBufferBase& val),
221  "Use serializeFrom(const SerializeBufferBase& val) instead");
222 
223  DEPRECATED(SerializeStatus deserialize(U8& val), "Use deserializeTo(U8& val) instead");
224  DEPRECATED(SerializeStatus deserialize(I8& val), "Use deserializeTo(I8& val) instead");
225 #if FW_HAS_16_BIT == 1
226  DEPRECATED(SerializeStatus deserialize(U16& val), "Use deserializeTo(U16& val) instead");
227  DEPRECATED(SerializeStatus deserialize(I16& val), "Use deserializeTo(I16& val) instead");
228 #endif
229 #if FW_HAS_32_BIT == 1
230  DEPRECATED(SerializeStatus deserialize(U32& val), "Use deserializeTo(U32& val) instead");
231  DEPRECATED(SerializeStatus deserialize(I32& val), "Use deserializeTo(I32& val) instead");
232 #endif
233 #if FW_HAS_64_BIT == 1
234  DEPRECATED(SerializeStatus deserialize(U64& val), "Use deserializeTo(U64& val) instead");
235  DEPRECATED(SerializeStatus deserialize(I64& val), "Use deserializeTo(I64& val) instead");
236 #endif
237 
238  DEPRECATED(SerializeStatus deserialize(F32& val), "Use deserializeTo(F32& val) instead");
239  DEPRECATED(SerializeStatus deserialize(F64& val), "Use deserializeTo(F64& val) instead");
240  DEPRECATED(SerializeStatus deserialize(bool& val), "Use deserializeTo(bool& val) instead");
241  DEPRECATED(SerializeStatus deserialize(void*& val), "Use deserializeTo(void*& val) instead");
242  DEPRECATED(SerializeStatus deserialize(U8* buff, FwSizeType& length, bool noLength),
243  "Use deserialize(U8* buff, FwSizeType& length, Serialization::t mode) instead");
244  DEPRECATED(SerializeStatus deserialize(U8* buff, FwSizeType& length),
245  "Use deserializeTo(U8* buff, FwSizeType& length) instead");
246  DEPRECATED(SerializeStatus deserialize(U8* buff, FwSizeType& length, Serialization::t mode),
247  "Use deserializeTo(U8* buff, FwSizeType& length, Serialization::t mode) instead");
248  DEPRECATED(SerializeStatus deserialize(Serializable& val), "Use deserializeTo(Serializable& val) instead");
250  "Use deserializeTo(SerializeBufferBase& val) instead");
251 
252  void resetSer();
253  void resetDeser();
254 
257 
259  FwSizeType numBytesToSkip);
261  FwSizeType numBytesToSkip);
262  virtual Serializable::SizeType getBuffCapacity() const = 0;
265  virtual U8* getBuffAddr() = 0;
266  virtual const U8* getBuffAddr() const = 0;
267  const U8* getBuffAddrLeft() const;
268  U8* getBuffAddrSer();
269  SerializeStatus setBuff(const U8* src, Serializable::SizeType length);
273  SerializeBufferBase& dest,
274  Serializable::SizeType size);
275  // Will increment deserialization pointer
277  SerializeBufferBase& dest,
278  Serializable::SizeType size);
279  // Will increment deserialization pointer
280 
281 #ifdef BUILD_UT
282  bool operator==(const SerializeBufferBase& other) const;
283  friend std::ostream& operator<<(std::ostream& os, const SerializeBufferBase& buff);
284 #endif
285 
286  protected:
290 
291  private:
292  // Copy constructor can be used only by the implementation
294 
295  void copyFrom(const SerializeBufferBase& src);
296 };
297 
298 // Helper classes for building buffers with external storage
299 
302  public:
306  void setExtBuffer(U8* buffPtr, Serializable::SizeType size);
309  void clear();
310  ExternalSerializeBuffer(const ExternalSerializeBuffer& src) = delete;
311 
312  // pure virtual functions
314  U8* getBuffAddr();
315  const U8* getBuffAddr() const;
316 
319 
320  protected:
321  // data members
324 };
325 
331  public:
333  : ExternalSerializeBuffer(buffPtr, size) {}
338  (void)SerializeBufferBase::operator=(src);
339  return *this;
340  }
341 };
342 
349  public:
351  : ExternalSerializeBuffer(buffPtr, size) {}
356  this->m_serLoc = src.m_serLoc;
357  this->m_deserLoc = src.m_deserLoc;
358  }
360  // Ward against self-assignment
361  if (this != &src) {
362  this->setExtBuffer(src.m_buff, src.m_buffSize);
363  this->m_serLoc = src.m_serLoc;
364  this->m_deserLoc = src.m_deserLoc;
365  }
366  return *this;
367  }
368 };
369 
370 } // namespace Fw
371 #endif
Serialization/Deserialization operation was successful.
void clear()
clear external buffer
SerializeBufferBase()
default constructor
Deserialization buffer was empty when trying to read more data.
PlatformSizeType FwSizeType
void resetSer()
reset to beginning of buffer to reuse for serialization
SerializeStatus copyRaw(SerializeBufferBase &dest, Serializable::SizeType size)
directly copies buffer without looking for a size in the stream.
forward declaration
ExternalSerializeBuffer & operator=(const SerializeBufferBase &src)=delete
deleted copy assignment operator
int8_t I8
8-bit signed integer
Definition: BasicTypes.h:50
SerializeStatus deserializeTo(U8 &val, Endianness mode=Endianness::BIG)
deserialize 8-bit unsigned int
No room left in the buffer to serialize data.
Serializable::SizeType m_buffSize
size of external buffer
virtual ~SerializeBufferBase()
destructor
friend class SerializeBufferBaseTester
ExternalSerializeBufferWithDataCopy & operator=(SerializeBufferBase &src)
Deserialization data had incorrect values (unexpected data types)
Serializable::SizeType m_serLoc
current offset in buffer of serialized data
const U8 * getBuffAddrLeft() const
gets address of remaining non-deserialized data.
ExternalSerializeBuffer()
default constructor
SerializeStatus
forward declaration for string
float F32
32-bit floating point
Definition: BasicTypes.h:83
DEPRECATED(SerializeStatus serialize(SerializeBufferBase &buffer) const, "Use serializeTo(SerializeBufferBase& buffer) instead")
SerializeStatus deserializeSize(FwSizeType &size, Endianness mode=Endianness::BIG)
deserialize a size value
Serializable::SizeType getBuffLength() const
returns current buffer size
Serializable::SizeType getBuffLeft() const
returns how much deserialization buffer is left
Data was the wrong format (e.g. wrong packet type)
ExternalSerializeBufferWithMemberCopy(U8 *buffPtr, Serializable::SizeType size)
U8 * m_buff
pointer to external buffer
Omit length from serialization.
virtual SerializeStatus deserializeFrom(SerializeBufferBase &buffer, Endianness mode=Endianness::BIG)=0
deserialize contents from buffer
Data was left in the buffer, but not enough to deserialize.
External serialize buffer with no copy semantics.
FwSizeType SizeType
ExternalSerializeBufferWithMemberCopy(const ExternalSerializeBufferWithMemberCopy &src)
DEPRECATED(SerializeStatus serialize(U8 val), "Use serializeFrom(U8 val) instead")
Serializable()
Default constructor.
void resetDeser()
reset deserialization to beginning
virtual SerializeStatus serializeTo(SerializeBufferBase &buffer, Endianness mode=Endianness::BIG) const =0
serialize contents to buffer
SerializeStatus copyRawOffset(SerializeBufferBase &dest, Serializable::SizeType size)
directly copies buffer without looking for a size in the stream.
Deserialized type ID didn&#39;t match.
SerializeStatus serializeFrom(U8 val, Endianness mode=Endianness::BIG)
serialize 8-bit unsigned int
SerializeStatus moveDeserToOffset(FwSizeType offset)
Moves deserialization to the specified offset.
SerializeStatus moveSerToOffset(FwSizeType offset)
Moves serialization to the specified offset.
uint8_t U8
8-bit unsigned integer
Definition: BasicTypes.h:53
ExternalSerializeBufferWithMemberCopy & operator=(const ExternalSerializeBufferWithMemberCopy &src)
virtual Serializable::SizeType getBuffCapacity() const =0
returns capacity, not current size, of buffer
SerializeStatus deserializeSkip(FwSizeType numBytesToSkip)
Skips the number of specified bytes for deserialization.
void setExtBuffer(U8 *buffPtr, Serializable::SizeType size)
virtual ~Serializable()
destructor
Serializable::SizeType m_deserLoc
current offset for deserialization
double F64
64-bit floating point (double). Required for compiler-supplied double promotion.
Definition: BasicTypes.h:85
SerializeBufferBase & operator=(const SerializeBufferBase &src)
copy assignment operator
SerializeStatus setBuff(const U8 *src, Serializable::SizeType length)
sets buffer contents and size
DEPRECATED(SerializeStatus deserialize(SerializeBufferBase &buffer), "Use deserializeFrom(SerializeBufferBase& buffer) instead")
Include length as first token in serialization.
SerializeStatus serializeSize(const FwSizeType size, Endianness mode=Endianness::BIG)
serialize a size value
Little endian serialization.
Serializable::SizeType getBuffCapacity() const
returns capacity, not current size, of buffer
virtual U8 * getBuffAddr()=0
gets buffer address for data filling
Implementation of malloc based allocator.
Endianness
ExternalSerializeBufferWithDataCopy(U8 *buffPtr, Serializable::SizeType size)
SerializeStatus serializeSkip(FwSizeType numBytesToSkip)
Skips the number of specified bytes for serialization.
Big endian serialization.
U8 * getBuffAddr()
gets buffer address for data filling
SerializeStatus setBuffLen(Serializable::SizeType length)
sets buffer length manually after filling with data
#define U64(C)
Definition: sha.h:181