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 
8 #include <FpConfig.hpp>
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
79 #if FW_HAS_F64
80  SerializeStatus serialize(F64 val);
81 #endif
82  SerializeStatus serialize(bool val);
83 
85  const void* val);
86 
88  SerializeStatus serialize(const U8* buff, FwSizeType length, bool noLength);
90  SerializeStatus serialize(const U8* buff, FwSizeType length);
91 
101  SerializeStatus serialize(const U8* buff, FwSizeType length, Serialization::t mode);
102 
104 
106 
108 
109  // Deserialization for built-in types
110 
113 
114 #if FW_HAS_16_BIT == 1
115  SerializeStatus deserialize(U16& val);
116  SerializeStatus deserialize(I16& val);
117 #endif
118 
119 #if FW_HAS_32_BIT == 1
120  SerializeStatus deserialize(U32& val);
121  SerializeStatus deserialize(I32& val);
122 #endif
123 #if FW_HAS_64_BIT == 1
125  SerializeStatus deserialize(I64& val);
126 #endif
128 #if FW_HAS_F64
129  SerializeStatus deserialize(F64& val);
130 #endif
131  SerializeStatus deserialize(bool& val);
132 
133  SerializeStatus deserialize(void*& val);
134 
136  SerializeStatus deserialize(U8* buff, FwSizeType& length, bool noLength);
137 
139  SerializeStatus deserialize(U8* buff, FwSizeType& length);
152 
154 
156 
158 
159  void resetSer();
160  void resetDeser();
161 
164 
166  FwSizeType numBytesToSkip);
168  FwSizeType numBytesToSkip);
169  virtual Serializable::SizeType getBuffCapacity() const = 0;
172  virtual U8* getBuffAddr() = 0;
173  virtual const U8* getBuffAddr() const = 0;
174  const U8* getBuffAddrLeft() const;
175  U8* getBuffAddrSer();
176  SerializeStatus setBuff(const U8* src, Serializable::SizeType length);
180  SerializeBufferBase& dest,
181  Serializable::SizeType size);
182  // Will increment deserialization pointer
184  SerializeBufferBase& dest,
185  Serializable::SizeType size);
186  // Will increment deserialization pointer
187 
188 #ifdef BUILD_UT
189  bool operator==(const SerializeBufferBase& other) const;
190  friend std::ostream& operator<<(std::ostream& os, const SerializeBufferBase& buff);
191 #endif
192 
193  PROTECTED:
195 
196  PRIVATE:
197  // Copy constructor can be used only by the implementation
199 
200  void copyFrom(const SerializeBufferBase& src);
201  Serializable::SizeType m_serLoc;
202  Serializable::SizeType m_deserLoc;
203 };
204 
205 // Helper classes for building buffers with external storage
206 
209  public:
213  void setExtBuffer(U8* buffPtr, Serializable::SizeType size);
216  void clear();
217  ExternalSerializeBuffer(const ExternalSerializeBuffer& src) = delete;
218 
219  // pure virtual functions
221  U8* getBuffAddr();
222  const U8* getBuffAddr() const;
223 
226 
227  PROTECTED:
228  // data members
231 };
232 
238  public:
240  : ExternalSerializeBuffer(buffPtr, size) {}
245  (void)SerializeBufferBase::operator=(src);
246  return *this;
247  }
248 };
249 
256  public:
258  : ExternalSerializeBuffer(buffPtr, size) {}
264  // Ward against self-assignment
265  if (this != &src) {
266  this->setExtBuffer(src.m_buff, src.m_buffSize);
267  }
268  return *this;
269  }
270 };
271 
272 } // namespace Fw
273 #endif
Serialization/Deserialization operation was successful.
void clear()
clear external buffer
SerializeBufferBase()
default constructor
Deserialization buffer was empty when trying to read more data.
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:29
PlatformSizeType FwSizeType
Definition: FpConfig.h:35
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)
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:62
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.
C++-compatible configuration header for fprime configuration.
uint8_t U8
8-bit unsigned integer
Definition: BasicTypes.h:32
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
SerializeStatus deserialize(U8 &val)
deserialize 8-bit unsigned int
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