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 class Serializable {
26  public:
27  // Size type for backwards compatibility
29 
30  public:
31  virtual SerializeStatus serializeTo(SerializeBufferBase& buffer) const = 0;
32 
34 
35  // ----------------------------------------------------------------------
36  // Legacy methods for backward compatibility
37  // ----------------------------------------------------------------------
38 
39  SerializeStatus serialize(SerializeBufferBase& buffer) const { return this->serializeTo(buffer); }
40 
42 
43 #if FW_SERIALIZABLE_TO_STRING || FW_ENABLE_TEXT_LOGGING || BUILD_UT
44  virtual void toString(StringBase& text) const;
45 #endif
46 
47 #ifdef BUILD_UT
48  friend std::ostream& operator<<(std::ostream& os, const Serializable& val);
49 #endif
50 
51  protected:
52  Serializable();
53  virtual ~Serializable();
54 };
55 
57  public:
58  enum t {
61  };
62 };
63 
66 
67  protected:
69 
70  public:
71  virtual ~SerializeBufferBase();
72 
73  // Serialization for built-in types
74 
77 
78 #if FW_HAS_16_BIT == 1
81 #endif
82 #if FW_HAS_32_BIT == 1
85 #endif
86 #if FW_HAS_64_BIT == 1
89 #endif
92  SerializeStatus serializeFrom(bool val);
93 
95  const void* val);
96 
98  SerializeStatus serializeFrom(const U8* buff, FwSizeType length);
99 
109  SerializeStatus serializeFrom(const U8* buff, FwSizeType length, Serialization::t mode);
110 
112 
114  const Serializable& val);
115 
117 
118  // Deserialization for built-in types
119 
122 
123 #if FW_HAS_16_BIT == 1
124  SerializeStatus deserializeTo(U16& val);
125  SerializeStatus deserializeTo(I16& val);
126 #endif
127 
128 #if FW_HAS_32_BIT == 1
129  SerializeStatus deserializeTo(U32& val);
130  SerializeStatus deserializeTo(I32& val);
131 #endif
132 #if FW_HAS_64_BIT == 1
134  SerializeStatus deserializeTo(I64& val);
135 #endif
138  SerializeStatus deserializeTo(bool& val);
139 
140  SerializeStatus deserializeTo(void*& val);
141 
142  SerializeStatus deserializeTo(U8* buff, FwSizeType& length);
143 
152 
154 
156 
158 
159  // ----------------------------------------------------------------------
160  // Serialization methods
161  // ----------------------------------------------------------------------
162 
165 #if FW_HAS_16_BIT == 1
166  SerializeStatus serialize(U16 val);
167  SerializeStatus serialize(I16 val);
168 #endif
169 #if FW_HAS_32_BIT == 1
170  SerializeStatus serialize(U32 val);
171  SerializeStatus serialize(I32 val);
172 #endif
173 #if FW_HAS_64_BIT == 1
175  SerializeStatus serialize(I64 val);
176 #endif
179  SerializeStatus serialize(bool val);
180  SerializeStatus serialize(const void* val);
181  DEPRECATED(SerializeStatus serialize(const U8* buff, FwSizeType length, bool noLength),
182  "Use serialize(const U8* buff, FwSizeType length, Serialization::t mode) instead");
183  SerializeStatus serialize(const U8* buff, FwSizeType length);
184  SerializeStatus serialize(const U8* buff, FwSizeType length, Serialization::t mode);
187 
190 #if FW_HAS_16_BIT == 1
191  SerializeStatus deserialize(U16& val);
192  SerializeStatus deserialize(I16& val);
193 #endif
194 #if FW_HAS_32_BIT == 1
195  SerializeStatus deserialize(U32& val);
196  SerializeStatus deserialize(I32& val);
197 #endif
198 #if FW_HAS_64_BIT == 1
200  SerializeStatus deserialize(I64& val);
201 #endif
204  SerializeStatus deserialize(bool& val);
205  SerializeStatus deserialize(void*& val);
206  DEPRECATED(SerializeStatus deserialize(U8* buff, FwSizeType& length, bool noLength),
207  "Use deserialize(U8* buff, FwSizeType& length, Serialization::t mode) instead");
208  SerializeStatus deserialize(U8* buff, FwSizeType& length);
212 
213  void resetSer();
214  void resetDeser();
215 
218 
220  FwSizeType numBytesToSkip);
222  FwSizeType numBytesToSkip);
223  virtual Serializable::SizeType getBuffCapacity() const = 0;
226  virtual U8* getBuffAddr() = 0;
227  virtual const U8* getBuffAddr() const = 0;
228  const U8* getBuffAddrLeft() const;
229  U8* getBuffAddrSer();
230  SerializeStatus setBuff(const U8* src, Serializable::SizeType length);
234  SerializeBufferBase& dest,
235  Serializable::SizeType size);
236  // Will increment deserialization pointer
238  SerializeBufferBase& dest,
239  Serializable::SizeType size);
240  // Will increment deserialization pointer
241 
242 #ifdef BUILD_UT
243  bool operator==(const SerializeBufferBase& other) const;
244  friend std::ostream& operator<<(std::ostream& os, const SerializeBufferBase& buff);
245 #endif
246 
247  protected:
251 
252  private:
253  // Copy constructor can be used only by the implementation
255 
256  void copyFrom(const SerializeBufferBase& src);
257 };
258 
259 // Helper classes for building buffers with external storage
260 
263  public:
267  void setExtBuffer(U8* buffPtr, Serializable::SizeType size);
270  void clear();
271  ExternalSerializeBuffer(const ExternalSerializeBuffer& src) = delete;
272 
273  // pure virtual functions
275  U8* getBuffAddr();
276  const U8* getBuffAddr() const;
277 
280 
281  protected:
282  // data members
285 };
286 
292  public:
294  : ExternalSerializeBuffer(buffPtr, size) {}
299  (void)SerializeBufferBase::operator=(src);
300  return *this;
301  }
302 };
303 
310  public:
312  : ExternalSerializeBuffer(buffPtr, size) {}
317  this->m_serLoc = src.m_serLoc;
318  this->m_deserLoc = src.m_deserLoc;
319  }
321  // Ward against self-assignment
322  if (this != &src) {
323  this->setExtBuffer(src.m_buff, src.m_buffSize);
324  this->m_serLoc = src.m_serLoc;
325  this->m_deserLoc = src.m_deserLoc;
326  }
327  return *this;
328  }
329 };
330 
331 } // namespace Fw
332 #endif
Serialization/Deserialization operation was successful.
void clear()
clear external buffer
SerializeStatus deserialize(SerializeBufferBase &buffer)
SerializeBufferBase()
default constructor
Deserialization buffer was empty when trying to read more data.
SerializeStatus serialize(SerializeBufferBase &buffer) const
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.
SerializeStatus serialize(U8 val)
ExternalSerializeBuffer & operator=(const SerializeBufferBase &src)=delete
deleted copy assignment operator
int8_t I8
8-bit signed integer
Definition: BasicTypes.h:50
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
Serializable::SizeType getBuffLength() const
returns current buffer size
Serializable::SizeType getBuffLeft() const
returns how much deserialization buffer is left
Include length as first token in serialization.
Data was the wrong format (e.g. wrong packet type)
ExternalSerializeBufferWithMemberCopy(U8 *buffPtr, Serializable::SizeType size)
U8 * m_buff
pointer to external buffer
DEPRECATED(SerializeStatus serialize(const U8 *buff, FwSizeType length, bool noLength), "Use serialize(const U8* buff, FwSizeType length, Serialization::t mode) instead")
SerializeStatus serializeSize(const FwSizeType size)
serialize a size value
Data was left in the buffer, but not enough to deserialize.
External serialize buffer with no copy semantics.
FwSizeType SizeType
ExternalSerializeBufferWithMemberCopy(const ExternalSerializeBufferWithMemberCopy &src)
SerializeStatus deserializeSize(FwSizeType &size)
deserialize a size value
Serializable()
Default constructor.
void resetDeser()
reset deserialization to beginning
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 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)
Omit length from serialization.
virtual ~Serializable()
destructor
Serializable::SizeType m_deserLoc
current offset for deserialization
SerializeStatus deserialize(U8 &val)
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
forward declaration
SerializeStatus serializeFrom(U8 val)
serialize 8-bit unsigned int
Serializable::SizeType getBuffCapacity() const
returns capacity, not current size, of buffer
virtual U8 * getBuffAddr()=0
gets buffer address for data filling
virtual SerializeStatus deserializeFrom(SerializeBufferBase &buffer)=0
deserialize contents from buffer
ExternalSerializeBufferWithDataCopy(U8 *buffPtr, Serializable::SizeType size)
SerializeStatus serializeSkip(FwSizeType numBytesToSkip)
Skips the number of specified bytes for serialization.
U8 * getBuffAddr()
gets buffer address for data filling
SerializeStatus setBuffLen(Serializable::SizeType length)
sets buffer length manually after filling with data
SerializeStatus deserializeTo(U8 &val)
deserialize 8-bit unsigned int
virtual SerializeStatus serializeTo(SerializeBufferBase &buffer) const =0
serialize contents to buffer
#define U64(C)
Definition: sha.h:180