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 serialize(SerializeBufferBase& buffer) const = 0;
32  virtual SerializeStatus deserialize(SerializeBufferBase& buffer) = 0;
33 #if FW_SERIALIZABLE_TO_STRING || FW_ENABLE_TEXT_LOGGING || BUILD_UT
34  virtual void toString(StringBase& text) const;
35 #endif
36 
37 #ifdef BUILD_UT
38  friend std::ostream& operator<<(std::ostream& os, const Serializable& val);
39 #endif
40 
41  protected:
42  Serializable();
43  virtual ~Serializable();
44 };
45 
47  public:
48  enum t {
51  };
52 };
53 
55  protected:
57 
58  public:
59  virtual ~SerializeBufferBase();
60 
61  // Serialization for built-in types
62 
65 
66 #if FW_HAS_16_BIT == 1
67  SerializeStatus serialize(U16 val);
68  SerializeStatus serialize(I16 val);
69 #endif
70 #if FW_HAS_32_BIT == 1
71  SerializeStatus serialize(U32 val);
72  SerializeStatus serialize(I32 val);
73 #endif
74 #if FW_HAS_64_BIT == 1
76  SerializeStatus serialize(I64 val);
77 #endif
80  SerializeStatus serialize(bool val);
81 
83  const void* val);
84 
86  SerializeStatus serialize(const U8* buff, FwSizeType length, bool noLength);
88  SerializeStatus serialize(const U8* buff, FwSizeType length);
89 
99  SerializeStatus serialize(const U8* buff, FwSizeType length, Serialization::t mode);
100 
102 
104 
106 
107  // Deserialization for built-in types
108 
111 
112 #if FW_HAS_16_BIT == 1
113  SerializeStatus deserialize(U16& val);
114  SerializeStatus deserialize(I16& val);
115 #endif
116 
117 #if FW_HAS_32_BIT == 1
118  SerializeStatus deserialize(U32& val);
119  SerializeStatus deserialize(I32& val);
120 #endif
121 #if FW_HAS_64_BIT == 1
123  SerializeStatus deserialize(I64& val);
124 #endif
127  SerializeStatus deserialize(bool& val);
128 
129  SerializeStatus deserialize(void*& val);
130 
132  SerializeStatus deserialize(U8* buff, FwSizeType& length, bool noLength);
133 
135  SerializeStatus deserialize(U8* buff, FwSizeType& length);
148 
150 
152 
154 
155  void resetSer();
156  void resetDeser();
157 
160 
162  FwSizeType numBytesToSkip);
164  FwSizeType numBytesToSkip);
165  virtual Serializable::SizeType getBuffCapacity() const = 0;
168  virtual U8* getBuffAddr() = 0;
169  virtual const U8* getBuffAddr() const = 0;
170  const U8* getBuffAddrLeft() const;
171  U8* getBuffAddrSer();
172  SerializeStatus setBuff(const U8* src, Serializable::SizeType length);
176  SerializeBufferBase& dest,
177  Serializable::SizeType size);
178  // Will increment deserialization pointer
180  SerializeBufferBase& dest,
181  Serializable::SizeType size);
182  // Will increment deserialization pointer
183 
184 #ifdef BUILD_UT
185  bool operator==(const SerializeBufferBase& other) const;
186  friend std::ostream& operator<<(std::ostream& os, const SerializeBufferBase& buff);
187 #endif
188 
189  PROTECTED:
193 
194  PRIVATE:
195  // Copy constructor can be used only by the implementation
197 
198  void copyFrom(const SerializeBufferBase& src);
199 };
200 
201 // Helper classes for building buffers with external storage
202 
205  public:
209  void setExtBuffer(U8* buffPtr, Serializable::SizeType size);
212  void clear();
213  ExternalSerializeBuffer(const ExternalSerializeBuffer& src) = delete;
214 
215  // pure virtual functions
217  U8* getBuffAddr();
218  const U8* getBuffAddr() const;
219 
222 
223  PROTECTED:
224  // data members
227 };
228 
234  public:
236  : ExternalSerializeBuffer(buffPtr, size) {}
241  (void)SerializeBufferBase::operator=(src);
242  return *this;
243  }
244 };
245 
252  public:
254  : ExternalSerializeBuffer(buffPtr, size) {}
259  this->m_serLoc = src.m_serLoc;
260  this->m_deserLoc = src.m_deserLoc;
261  }
263  // Ward against self-assignment
264  if (this != &src) {
265  this->setExtBuffer(src.m_buff, src.m_buffSize);
266  this->m_serLoc = src.m_serLoc;
267  this->m_deserLoc = src.m_deserLoc;
268  }
269  return *this;
270  }
271 };
272 
273 } // namespace Fw
274 #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.
SerializeStatus serialize(U8 val)
serialize 8-bit unsigned int
ExternalSerializeBuffer & operator=(const SerializeBufferBase &src)=delete
deleted copy assignment operator
int8_t I8
8-bit signed integer
Definition: BasicTypes.h:53
No room left in the buffer to serialize data.
Serializable::SizeType m_buffSize
size of external buffer
virtual ~SerializeBufferBase()
destructor
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:86
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)
virtual SerializeStatus serialize(SerializeBufferBase &buffer) const =0
serialize contents
ExternalSerializeBufferWithMemberCopy(U8 *buffPtr, Serializable::SizeType size)
U8 * m_buff
pointer to external buffer
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.
virtual SerializeStatus deserialize(SerializeBufferBase &buffer)=0
deserialize to contents
SerializeStatus moveSerToOffset(FwSizeType offset)
Moves serialization to the specified offset.
uint8_t U8
8-bit unsigned integer
Definition: BasicTypes.h:56
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)
deserialize 8-bit unsigned int
double F64
64-bit floating point (double). Required for compiler-supplied double promotion.
Definition: BasicTypes.h:88
SerializeBufferBase & operator=(const SerializeBufferBase &src)
copy assignment operator
SerializeStatus setBuff(const U8 *src, Serializable::SizeType length)
sets buffer contents and size
forward declaration
Serializable::SizeType getBuffCapacity() const
returns capacity, not current size, of buffer
virtual U8 * getBuffAddr()=0
gets buffer address for data filling
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
#define U64(C)
Definition: sha.h:180