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 
57 
58  protected:
60 
61  public:
62  virtual ~SerializeBufferBase();
63 
64  // Serialization for built-in types
65 
68 
69 #if FW_HAS_16_BIT == 1
70  SerializeStatus serialize(U16 val);
71  SerializeStatus serialize(I16 val);
72 #endif
73 #if FW_HAS_32_BIT == 1
74  SerializeStatus serialize(U32 val);
75  SerializeStatus serialize(I32 val);
76 #endif
77 #if FW_HAS_64_BIT == 1
79  SerializeStatus serialize(I64 val);
80 #endif
83  SerializeStatus serialize(bool val);
84 
86  const void* val);
87 
89  DEPRECATED(SerializeStatus serialize(const U8* buff, Serializable::SizeType length, bool noLength),
90  "Use serialize(const U8* buff, FwSizeType length, Serialization::t mode) instead");
92  SerializeStatus serialize(const U8* buff, FwSizeType length);
93 
103  SerializeStatus serialize(const U8* buff, FwSizeType length, Serialization::t mode);
104 
106 
108 
110 
111  // Deserialization for built-in types
112 
115 
116 #if FW_HAS_16_BIT == 1
117  SerializeStatus deserialize(U16& val);
118  SerializeStatus deserialize(I16& val);
119 #endif
120 
121 #if FW_HAS_32_BIT == 1
122  SerializeStatus deserialize(U32& val);
123  SerializeStatus deserialize(I32& val);
124 #endif
125 #if FW_HAS_64_BIT == 1
127  SerializeStatus deserialize(I64& val);
128 #endif
131  SerializeStatus deserialize(bool& val);
132 
133  SerializeStatus deserialize(void*& val);
134 
136  DEPRECATED(SerializeStatus deserialize(U8* buff, Serializable::SizeType& length, bool noLength),
137  "Use deserialize(U8* buff, FwSizeType& length, Serialization::t mode) instead");
138 
140  SerializeStatus deserialize(U8* buff, FwSizeType& length);
153 
155 
157 
159 
160  void resetSer();
161  void resetDeser();
162 
165 
167  FwSizeType numBytesToSkip);
169  FwSizeType numBytesToSkip);
170  virtual Serializable::SizeType getBuffCapacity() const = 0;
173  virtual U8* getBuffAddr() = 0;
174  virtual const U8* getBuffAddr() const = 0;
175  const U8* getBuffAddrLeft() const;
176  U8* getBuffAddrSer();
177  SerializeStatus setBuff(const U8* src, Serializable::SizeType length);
181  SerializeBufferBase& dest,
182  Serializable::SizeType size);
183  // Will increment deserialization pointer
185  SerializeBufferBase& dest,
186  Serializable::SizeType size);
187  // Will increment deserialization pointer
188 
189 #ifdef BUILD_UT
190  bool operator==(const SerializeBufferBase& other) const;
191  friend std::ostream& operator<<(std::ostream& os, const SerializeBufferBase& buff);
192 #endif
193 
194  protected:
198 
199  private:
200  // Copy constructor can be used only by the implementation
202 
203  void copyFrom(const SerializeBufferBase& src);
204 };
205 
206 // Helper classes for building buffers with external storage
207 
210  public:
214  void setExtBuffer(U8* buffPtr, Serializable::SizeType size);
217  void clear();
218  ExternalSerializeBuffer(const ExternalSerializeBuffer& src) = delete;
219 
220  // pure virtual functions
222  U8* getBuffAddr();
223  const U8* getBuffAddr() const;
224 
227 
228  protected:
229  // data members
232 };
233 
239  public:
241  : ExternalSerializeBuffer(buffPtr, size) {}
246  (void)SerializeBufferBase::operator=(src);
247  return *this;
248  }
249 };
250 
257  public:
259  : ExternalSerializeBuffer(buffPtr, size) {}
264  this->m_serLoc = src.m_serLoc;
265  this->m_deserLoc = src.m_deserLoc;
266  }
268  // Ward against self-assignment
269  if (this != &src) {
270  this->setExtBuffer(src.m_buff, src.m_buffSize);
271  this->m_serLoc = src.m_serLoc;
272  this->m_deserLoc = src.m_deserLoc;
273  }
274  return *this;
275  }
276 };
277 
278 } // namespace Fw
279 #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
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: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
DEPRECATED(SerializeStatus serialize(const U8 *buff, Serializable::SizeType length, bool noLength), "Use serialize(const U8* buff, FwSizeType length, Serialization::t mode) instead")
serialize data 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
#define U64(C)
Definition: sha.h:180