F´ Flight Software - C/C++ Documentation  devel
A framework for building embedded system applications to NASA flight quality standards.
Serializable.cpp
Go to the documentation of this file.
2 #include <cstring> // memcpy
3 #include <Fw/Types/Assert.hpp>
5 #include <cstdio>
6 #include <FpConfig.hpp>
7 #ifdef BUILD_UT
8 #include <iomanip>
9 #include <Fw/Types/String.hpp>
10 #endif
11 
12 // Some macros/functions to optimize for architectures
13 
14 namespace Fw {
15 
17  }
18 
20  }
21 
22 #if FW_SERIALIZABLE_TO_STRING || FW_ENABLE_TEXT_LOGGING || BUILD_UT
23 
24  void Serializable::toString(StringBase& text) const {
25  text = "NOSPEC"; // set to not specified.
26  }
27 
28 #endif
29 
30 #ifdef BUILD_UT
31  std::ostream& operator<<(std::ostream& os, const Serializable& val) {
32  Fw::String out;
33  val.toString(out);
34 
35  os << out;
36 
37  return os;
38  }
39 #endif
40 
42  m_serLoc(0), m_deserLoc(0) {
43  }
44 
46  }
47 
48  void SerializeBufferBase::copyFrom(const SerializeBufferBase& src) {
49  this->m_serLoc = src.m_serLoc;
50  this->m_deserLoc = src.m_deserLoc;
51  FW_ASSERT(src.getBuffAddr());
52  FW_ASSERT(this->getBuffAddr());
53  // destination has to be same or bigger
54  FW_ASSERT(src.getBuffLength() <= this->getBuffCapacity(),src.getBuffLength(),this->getBuffLength());
55  (void) memcpy(this->getBuffAddr(),src.getBuffAddr(),this->m_serLoc);
56  }
57 
58  // Copy constructor doesn't make sense in this virtual class as there is nothing to copy. Derived classes should
59  // call the empty constructor and then call their own copy function
61  this->copyFrom(src);
62  return *this;
63  }
64 
65  // serialization routines
66 
68  if (this->m_serLoc + static_cast<NATIVE_UINT_TYPE>(sizeof(val)) - 1 >= this->getBuffCapacity()) {
70  }
71  FW_ASSERT(this->getBuffAddr());
72  this->getBuffAddr()[this->m_serLoc] = val;
73  this->m_serLoc += sizeof(val);
74  this->m_deserLoc = 0;
75 
76  return FW_SERIALIZE_OK;
77  }
78 
80  if (this->m_serLoc + static_cast<NATIVE_UINT_TYPE>(sizeof(val)) - 1 >= this->getBuffCapacity()) {
82  }
83  FW_ASSERT(this->getBuffAddr());
84  this->getBuffAddr()[this->m_serLoc + 0] = static_cast<U8>(val);
85  this->m_serLoc += sizeof(val);
86  this->m_deserLoc = 0;
87  return FW_SERIALIZE_OK;
88  }
89 
90 #if FW_HAS_16_BIT==1
92  if (this->m_serLoc + static_cast<NATIVE_UINT_TYPE>(sizeof(val)) - 1 >= this->getBuffCapacity()) {
94  }
95  FW_ASSERT(this->getBuffAddr());
96  // MSB first
97  this->getBuffAddr()[this->m_serLoc + 0] = static_cast<U8>(val >> 8);
98  this->getBuffAddr()[this->m_serLoc + 1] = static_cast<U8>(val);
99  this->m_serLoc += sizeof(val);
100  this->m_deserLoc = 0;
101  return FW_SERIALIZE_OK;
102  }
103 
105  if (this->m_serLoc + static_cast<NATIVE_UINT_TYPE>(sizeof(val)) - 1 >= this->getBuffCapacity()) {
107  }
108  FW_ASSERT(this->getBuffAddr());
109  // MSB first
110  this->getBuffAddr()[this->m_serLoc + 0] = static_cast<U8>(val >> 8);
111  this->getBuffAddr()[this->m_serLoc + 1] = static_cast<U8>(val);
112  this->m_serLoc += sizeof(val);
113  this->m_deserLoc = 0;
114  return FW_SERIALIZE_OK;
115  }
116 #endif
117 #if FW_HAS_32_BIT==1
119  if (this->m_serLoc + static_cast<NATIVE_UINT_TYPE>(sizeof(val)) - 1 >= this->getBuffCapacity()) {
121  }
122  FW_ASSERT(this->getBuffAddr());
123  // MSB first
124  this->getBuffAddr()[this->m_serLoc + 0] = static_cast<U8>(val >> 24);
125  this->getBuffAddr()[this->m_serLoc + 1] = static_cast<U8>(val >> 16);
126  this->getBuffAddr()[this->m_serLoc + 2] = static_cast<U8>(val >> 8);
127  this->getBuffAddr()[this->m_serLoc + 3] = static_cast<U8>(val);
128  this->m_serLoc += sizeof(val);
129  this->m_deserLoc = 0;
130  return FW_SERIALIZE_OK;
131  }
132 
134  if (this->m_serLoc + static_cast<NATIVE_UINT_TYPE>(sizeof(val)) - 1 >= this->getBuffCapacity()) {
136  }
137  FW_ASSERT(this->getBuffAddr());
138  // MSB first
139  this->getBuffAddr()[this->m_serLoc + 0] = static_cast<U8>(val >> 24);
140  this->getBuffAddr()[this->m_serLoc + 1] = static_cast<U8>(val >> 16);
141  this->getBuffAddr()[this->m_serLoc + 2] = static_cast<U8>(val >> 8);
142  this->getBuffAddr()[this->m_serLoc + 3] = static_cast<U8>(val);
143  this->m_serLoc += sizeof(val);
144  this->m_deserLoc = 0;
145  return FW_SERIALIZE_OK;
146  }
147 #endif
148 
149 #if FW_HAS_64_BIT==1
151  if (this->m_serLoc + static_cast<NATIVE_UINT_TYPE>(sizeof(val)) - 1 >= this->getBuffCapacity()) {
153  }
154  FW_ASSERT(this->getBuffAddr());
155  // MSB first
156  this->getBuffAddr()[this->m_serLoc + 0] = static_cast<U8>(val >> 56);
157  this->getBuffAddr()[this->m_serLoc + 1] = static_cast<U8>(val >> 48);
158  this->getBuffAddr()[this->m_serLoc + 2] = static_cast<U8>(val >> 40);
159  this->getBuffAddr()[this->m_serLoc + 3] = static_cast<U8>(val >> 32);
160  this->getBuffAddr()[this->m_serLoc + 4] = static_cast<U8>(val >> 24);
161  this->getBuffAddr()[this->m_serLoc + 5] = static_cast<U8>(val >> 16);
162  this->getBuffAddr()[this->m_serLoc + 6] = static_cast<U8>(val >> 8);
163  this->getBuffAddr()[this->m_serLoc + 7] = static_cast<U8>(val);
164  this->m_serLoc += sizeof(val);
165  this->m_deserLoc = 0;
166  return FW_SERIALIZE_OK;
167  }
168 
170  if (this->m_serLoc + static_cast<NATIVE_UINT_TYPE>(sizeof(val)) - 1 >= this->getBuffCapacity()) {
172  }
173  FW_ASSERT(this->getBuffAddr());
174  // MSB first
175  this->getBuffAddr()[this->m_serLoc + 0] = static_cast<U8>(val >> 56);
176  this->getBuffAddr()[this->m_serLoc + 1] = static_cast<U8>(val >> 48);
177  this->getBuffAddr()[this->m_serLoc + 2] = static_cast<U8>(val >> 40);
178  this->getBuffAddr()[this->m_serLoc + 3] = static_cast<U8>(val >> 32);
179  this->getBuffAddr()[this->m_serLoc + 4] = static_cast<U8>(val >> 24);
180  this->getBuffAddr()[this->m_serLoc + 5] = static_cast<U8>(val >> 16);
181  this->getBuffAddr()[this->m_serLoc + 6] = static_cast<U8>(val >> 8);
182  this->getBuffAddr()[this->m_serLoc + 7] = static_cast<U8>(val);
183  this->m_serLoc += sizeof(val);
184  this->m_deserLoc = 0;
185  return FW_SERIALIZE_OK;
186  }
187 #endif
188 
189 #if FW_HAS_F64 && FW_HAS_64_BIT
190 
192  // floating point values need to be byte-swapped as well, so copy to U64 and use that routine
193  U64 u64Val;
194  (void) memcpy(&u64Val, &val, sizeof(val));
195  return this->serialize(u64Val);
196 
197  }
198 
199 #endif
200 
202 
203  // floating point values need to be byte-swapped as well, so copy to U32 and use that routine
204  U32 u32Val;
205  (void) memcpy(&u32Val, &val, sizeof(val));
206  return this->serialize(u32Val);
207 
208  }
209 
211  if (this->m_serLoc + static_cast<NATIVE_UINT_TYPE>(sizeof(U8)) - 1 >= this->getBuffCapacity()) {
213  }
214 
215  FW_ASSERT(this->getBuffAddr());
216  if (val) {
217  this->getBuffAddr()[this->m_serLoc + 0] = FW_SERIALIZE_TRUE_VALUE;
218  } else {
219  this->getBuffAddr()[this->m_serLoc + 0] = FW_SERIALIZE_FALSE_VALUE;
220  }
221 
222  this->m_serLoc += sizeof(U8);
223  this->m_deserLoc = 0;
224  return FW_SERIALIZE_OK;
225  }
226 
228  if (this->m_serLoc + static_cast<NATIVE_UINT_TYPE>(sizeof(void*)) - 1
229  >= this->getBuffCapacity()) {
231  }
232 
233  return this->serialize(reinterpret_cast<POINTER_CAST>(val));
234 
235  }
236 
238  // First serialize length
239  SerializeStatus stat;
240  if (not noLength) {
241  stat = this->serialize(static_cast<FwBuffSizeType>(length));
242  if (stat != FW_SERIALIZE_OK) {
243  return stat;
244  }
245  }
246 
247  // make sure we have enough space
248  if (this->m_serLoc + length > this->getBuffCapacity()) {
250  }
251 
252  // copy buffer to our buffer
253  (void) memcpy(&this->getBuffAddr()[this->m_serLoc], buff, length);
254  this->m_serLoc += length;
255  this->m_deserLoc = 0;
256 
257  return FW_SERIALIZE_OK;
258  }
259 
261  return val.serialize(*this);
262  }
263 
265  const SerializeBufferBase& val) {
266  NATIVE_UINT_TYPE size = val.getBuffLength();
267  if (this->m_serLoc + size + static_cast<NATIVE_UINT_TYPE>(sizeof(FwBuffSizeType))
268  > this->getBuffCapacity()) {
270  }
271 
272  // First, serialize size
273  SerializeStatus stat = this->serialize(static_cast<FwBuffSizeType>(size));
274  if (stat != FW_SERIALIZE_OK) {
275  return stat;
276  }
277 
278  FW_ASSERT(this->getBuffAddr());
279  FW_ASSERT(val.getBuffAddr());
280  // serialize buffer
281  (void) memcpy(&this->getBuffAddr()[this->m_serLoc], val.getBuffAddr(), size);
282  this->m_serLoc += size;
283  this->m_deserLoc = 0;
284 
285  return FW_SERIALIZE_OK;
286  }
287 
288  // deserialization routines
289 
291  // check for room
292  if (this->getBuffLength() == this->m_deserLoc) {
294  } else if (this->getBuffLength() - this->m_deserLoc < static_cast<NATIVE_UINT_TYPE>(sizeof(val))) {
296  }
297  // read from current location
298  FW_ASSERT(this->getBuffAddr());
299  val = this->getBuffAddr()[this->m_deserLoc + 0];
300  this->m_deserLoc += sizeof(val);
301  return FW_SERIALIZE_OK;
302  }
303 
305  // check for room
306  if (this->getBuffLength() == this->m_deserLoc) {
308  } else if (this->getBuffLength() - this->m_deserLoc < static_cast<NATIVE_UINT_TYPE>(sizeof(val))) {
310  }
311  // read from current location
312  FW_ASSERT(this->getBuffAddr());
313  val = static_cast<I8>(this->getBuffAddr()[this->m_deserLoc + 0]);
314  this->m_deserLoc += sizeof(val);
315  return FW_SERIALIZE_OK;
316  }
317 
318 #if FW_HAS_16_BIT==1
320  // check for room
321  if (this->getBuffLength() == this->m_deserLoc) {
323  } else if (this->getBuffLength() - this->m_deserLoc < static_cast<NATIVE_UINT_TYPE>(sizeof(val))) {
325  }
326  // read from current location
327  FW_ASSERT(this->getBuffAddr());
328  // MSB first
329  val = static_cast<U16>(
330  ((this->getBuffAddr()[this->m_deserLoc + 1]) << 0) |
331  ((this->getBuffAddr()[this->m_deserLoc + 0]) << 8)
332  );
333  this->m_deserLoc += sizeof(val);
334  return FW_SERIALIZE_OK;
335  }
336 
338  // check for room
339  if (this->getBuffLength() == this->m_deserLoc) {
341  } else if (this->getBuffLength() - this->m_deserLoc < static_cast<NATIVE_UINT_TYPE>(sizeof(val))) {
343  }
344  // read from current location
345  FW_ASSERT(this->getBuffAddr());
346  // MSB first
347  val = static_cast<I16>(
348  ((this->getBuffAddr()[this->m_deserLoc + 1]) << 0) |
349  ((this->getBuffAddr()[this->m_deserLoc + 0]) << 8)
350  );
351  this->m_deserLoc += sizeof(val);
352  return FW_SERIALIZE_OK;
353  }
354 #endif
355 #if FW_HAS_32_BIT==1
357  // check for room
358  if (this->getBuffLength() == this->m_deserLoc) {
360  } else if (this->getBuffLength() - this->m_deserLoc < static_cast<NATIVE_UINT_TYPE>(sizeof(val))) {
362  }
363  // read from current location
364  FW_ASSERT(this->getBuffAddr());
365  // MSB first
366  val = (static_cast<U32>(this->getBuffAddr()[this->m_deserLoc + 3]) << 0)
367  | (static_cast<U32>(this->getBuffAddr()[this->m_deserLoc + 2]) << 8)
368  | (static_cast<U32>(this->getBuffAddr()[this->m_deserLoc + 1]) << 16)
369  | (static_cast<U32>(this->getBuffAddr()[this->m_deserLoc + 0]) << 24);
370  this->m_deserLoc += sizeof(val);
371  return FW_SERIALIZE_OK;
372  }
373 
375  // check for room
376  if (this->getBuffLength() == this->m_deserLoc) {
378  } else if (this->getBuffLength() - this->m_deserLoc < static_cast<NATIVE_UINT_TYPE>(sizeof(val))) {
380  }
381  // read from current location
382  FW_ASSERT(this->getBuffAddr());
383  // MSB first
384  val = (static_cast<I32>(this->getBuffAddr()[this->m_deserLoc + 3]) << 0)
385  | (static_cast<I32>(this->getBuffAddr()[this->m_deserLoc + 2]) << 8)
386  | (static_cast<I32>(this->getBuffAddr()[this->m_deserLoc + 1]) << 16)
387  | (static_cast<I32>(this->getBuffAddr()[this->m_deserLoc + 0]) << 24);
388  this->m_deserLoc += sizeof(val);
389  return FW_SERIALIZE_OK;
390  }
391 #endif
392 
393 #if FW_HAS_64_BIT==1
394 
396  // check for room
397  if (this->getBuffLength() == this->m_deserLoc) {
399  } else if (this->getBuffLength() - this->m_deserLoc < static_cast<NATIVE_UINT_TYPE>(sizeof(val))) {
401  }
402  // read from current location
403  FW_ASSERT(this->getBuffAddr());
404  // MSB first
405  val = (static_cast<U64>(this->getBuffAddr()[this->m_deserLoc + 7]) << 0)
406  | (static_cast<U64>(this->getBuffAddr()[this->m_deserLoc + 6]) << 8)
407  | (static_cast<U64>(this->getBuffAddr()[this->m_deserLoc + 5]) << 16)
408  | (static_cast<U64>(this->getBuffAddr()[this->m_deserLoc + 4]) << 24)
409  | (static_cast<U64>(this->getBuffAddr()[this->m_deserLoc + 3]) << 32)
410  | (static_cast<U64>(this->getBuffAddr()[this->m_deserLoc + 2]) << 40)
411  | (static_cast<U64>(this->getBuffAddr()[this->m_deserLoc + 1]) << 48)
412  | (static_cast<U64>(this->getBuffAddr()[this->m_deserLoc + 0]) << 56);
413 
414  this->m_deserLoc += sizeof(val);
415  return FW_SERIALIZE_OK;
416  }
417 
419  // check for room
420  if (this->getBuffLength() == this->m_deserLoc) {
422  } else if (this->getBuffLength() - this->m_deserLoc < static_cast<NATIVE_UINT_TYPE>(sizeof(val))) {
424  }
425  // read from current location
426  FW_ASSERT(this->getBuffAddr());
427  // MSB first
428  val = (static_cast<I64>(this->getBuffAddr()[this->m_deserLoc + 7]) << 0)
429  | (static_cast<I64>(this->getBuffAddr()[this->m_deserLoc + 6]) << 8)
430  | (static_cast<I64>(this->getBuffAddr()[this->m_deserLoc + 5]) << 16)
431  | (static_cast<I64>(this->getBuffAddr()[this->m_deserLoc + 4]) << 24)
432  | (static_cast<I64>(this->getBuffAddr()[this->m_deserLoc + 3]) << 32)
433  | (static_cast<I64>(this->getBuffAddr()[this->m_deserLoc + 2]) << 40)
434  | (static_cast<I64>(this->getBuffAddr()[this->m_deserLoc + 1]) << 48)
435  | (static_cast<I64>(this->getBuffAddr()[this->m_deserLoc + 0]) << 56);
436  this->m_deserLoc += sizeof(val);
437  return FW_SERIALIZE_OK;
438  }
439 #endif
440 
441 #if FW_HAS_F64
442 
444 
445  // deserialize as 64-bit int to handle endianness
446  U64 tempVal;
447  SerializeStatus stat = this->deserialize(tempVal);
448  if (stat != FW_SERIALIZE_OK) {
449  return stat;
450  }
451  // copy to argument
452  (void) memcpy(&val, &tempVal, sizeof(val));
453 
454  return FW_SERIALIZE_OK;
455  }
456 
457 #endif
458 
460  // check for room
461  if (this->getBuffLength() == this->m_deserLoc) {
463  } else if (this->getBuffLength() - this->m_deserLoc < static_cast<NATIVE_UINT_TYPE>(sizeof(U8))) {
465  }
466  // read from current location
467  FW_ASSERT(this->getBuffAddr());
468  if (FW_SERIALIZE_TRUE_VALUE == this->getBuffAddr()[this->m_deserLoc + 0]) {
469  val = true;
470  } else if (FW_SERIALIZE_FALSE_VALUE == this->getBuffAddr()[this->m_deserLoc + 0]) {
471  val = false;
472  } else {
474  }
475 
476  this->m_deserLoc += sizeof(U8);
477  return FW_SERIALIZE_OK;
478  }
479 
481  // Deserialize as pointer cast, then convert to void*
482  PlatformPointerCastType pointerCastVal = 0;
483  const SerializeStatus stat = this->deserialize(pointerCastVal);
484  if (stat == FW_SERIALIZE_OK) {
485  val = reinterpret_cast<void*>(pointerCastVal);
486  }
487  return stat;
488  }
489 
491  // deserialize as 64-bit int to handle endianness
492  U32 tempVal;
493  SerializeStatus stat = this->deserialize(tempVal);
494  if (stat != FW_SERIALIZE_OK) {
495  return stat;
496  }
497  (void) memcpy(&val, &tempVal, sizeof(val));
498 
499  return FW_SERIALIZE_OK;
500  }
501 
503 
504  FW_ASSERT(this->getBuffAddr());
505 
506  if (not noLength) {
507  FwBuffSizeType storedLength;
508 
509  SerializeStatus stat = this->deserialize(storedLength);
510 
511  if (stat != FW_SERIALIZE_OK) {
512  return stat;
513  }
514 
515  // make sure it fits
516  if ((storedLength > this->getBuffLeft()) or (storedLength > length)) {
518  }
519 
520  (void) memcpy(buff, &this->getBuffAddr()[this->m_deserLoc], storedLength);
521 
522  length = static_cast<NATIVE_UINT_TYPE>(storedLength);
523 
524  } else {
525  // make sure enough is left
526  if (length > this->getBuffLeft()) {
528  }
529 
530  (void) memcpy(buff, &this->getBuffAddr()[this->m_deserLoc], length);
531  }
532 
533  this->m_deserLoc += length;
534  return FW_SERIALIZE_OK;
535  }
536 
538  return val.deserialize(*this);
539  }
540 
542 
543  FW_ASSERT(val.getBuffAddr());
545 
546  FwBuffSizeType storedLength;
547 
548  stat = this->deserialize(storedLength);
549 
550  if (stat != FW_SERIALIZE_OK) {
551  return stat;
552  }
553 
554  // make sure destination has enough room
555 
556  if ((storedLength > val.getBuffCapacity()) or (storedLength > this->getBuffLeft()) ) {
558  }
559 
560  FW_ASSERT(this->getBuffAddr());
561  (void) memcpy(val.getBuffAddr(), &this->getBuffAddr()[this->m_deserLoc],
562  storedLength);
563 
564  stat = val.setBuffLen(storedLength);
565 
566  if (stat != FW_SERIALIZE_OK) {
567  return stat;
568  }
569 
570  this->m_deserLoc += storedLength;
571 
572  return FW_SERIALIZE_OK;
573  }
574 
576  this->m_deserLoc = 0;
577  this->m_serLoc = 0;
578  }
579 
581  this->m_deserLoc = 0;
582  }
583 
585  {
587  // compute new deser loc
588  const FwSizeType newSerLoc = this->m_serLoc + numBytesToSkip;
589  // check for room
590  if (newSerLoc <= this->getBuffCapacity()) {
591  // update deser loc
592  this->m_serLoc = newSerLoc;
593  }
594  else {
595  status = FW_SERIALIZE_NO_ROOM_LEFT;
596  }
597  return status;
598  }
599 
601  {
602  // check for room
603  if (this->getBuffLength() == this->m_deserLoc) {
605  } else if (this->getBuffLength() - this->m_deserLoc < numBytesToSkip) {
607  }
608  // update location in buffer to skip the value
609  this->m_deserLoc += numBytesToSkip;
610  return FW_SERIALIZE_OK;
611  }
612 
614  // Reset serialization
615  this->resetSer();
616  // Advance to offset
617  return this->serializeSkip(offset);
618  }
620  // Reset deserialization
621  this->resetDeser();
622  // Advance to offset
623  return this->deserializeSkip(offset);
624  }
625 
627  return this->m_serLoc;
628  }
629 
631  if (this->getBuffCapacity() < length) {
633  } else {
634  FW_ASSERT(src);
635  FW_ASSERT(this->getBuffAddr());
636  memcpy(this->getBuffAddr(), src, length);
637  this->m_serLoc = length;
638  this->m_deserLoc = 0;
639  return FW_SERIALIZE_OK;
640  }
641  }
642 
644  if (this->getBuffCapacity() < length) {
646  } else {
647  this->m_serLoc = length;
648  this->m_deserLoc = 0;
649  return FW_SERIALIZE_OK;
650  }
651  }
652 
654  return this->m_serLoc - this->m_deserLoc;
655  }
656 
658  // make sure there is sufficient size in destination
659  if (dest.getBuffCapacity() < size) {
661  }
662  // otherwise, set destination buffer to data from deserialization pointer plus size
663  SerializeStatus stat = dest.setBuff(&this->getBuffAddr()[this->m_deserLoc],size);
664  if (stat == FW_SERIALIZE_OK) {
665  this->m_deserLoc += size;
666  }
667  return stat;
668 
669  }
670 
672  // make sure there is sufficient size in destination
673  if (dest.getBuffCapacity() < size + dest.getBuffLength()) {
675  }
676  // make sure there is sufficient buffer in source
677  if (this->getBuffLeft() < size) {
679  }
680 
681  // otherwise, serialize bytes to destination without writing length
682  SerializeStatus stat = dest.serialize(&this->getBuffAddr()[this->m_deserLoc], size, true);
683  if (stat == FW_SERIALIZE_OK) {
684  this->m_deserLoc += size;
685  }
686  return stat;
687 
688  }
689 
690  // return address of buffer not yet deserialized. This is used
691  // to copy the remainder of a buffer.
693  return &this->getBuffAddr()[this->m_deserLoc];
694  }
695 
698  return &this->getBuffAddr()[this->m_serLoc];
699  }
700 
701 #ifdef BUILD_UT
702  bool SerializeBufferBase::operator==(const SerializeBufferBase& other) const {
703  if (this->getBuffLength() != other.getBuffLength()) {
704  return false;
705  }
706 
707  const U8* us = this->getBuffAddr();
708  const U8* them = other.getBuffAddr();
709 
710  FW_ASSERT(us);
711  FW_ASSERT(them);
712 
713  for (NATIVE_UINT_TYPE byte = 0; byte < this->getBuffLength(); byte++) {
714  if (us[byte] != them[byte]) {
715  return false;
716  }
717  }
718 
719  return true;
720  }
721 
722  std::ostream& operator<<(std::ostream& os, const SerializeBufferBase& buff) {
723 
724  const U8* us = buff.getBuffAddr();
725 
726  FW_ASSERT(us);
727 
728  for (NATIVE_UINT_TYPE byte = 0; byte < buff.getBuffLength(); byte++) {
729  os << "[" << std::setw(2) << std::hex << std::setfill('0') << us[byte] << "]" << std::dec;
730  }
731 
732  return os;
733  }
734 #endif
735 
737  this->setExtBuffer(buffPtr,size);
738  }
739 
741  this->clear();
742  }
743 
745  FW_ASSERT(buffPtr != nullptr);
746  this->m_buff = buffPtr;
747  this->m_buffSize = size;
748  }
749 
751  this->m_buff = nullptr;
752  this->m_buffSize = 0;
753  }
754 
756  return this->m_buffSize;
757  }
758 
760  return this->m_buff;
761  }
762 
764  return this->m_buff;
765  }
766 
767 }
768 
#define FW_ASSERT(...)
Definition: Assert.hpp:14
PlatformPointerCastType POINTER_CAST
Definition: BasicTypes.h:53
int8_t I8
8-bit signed integer
Definition: BasicTypes.h:25
float F32
32-bit floating point
Definition: BasicTypes.h:45
uint8_t U8
8-bit unsigned integer
Definition: BasicTypes.h:26
PlatformUIntType NATIVE_UINT_TYPE
Definition: BasicTypes.h:52
uint8_t PlatformPointerCastType
#define FW_SERIALIZE_TRUE_VALUE
Value encoded during serialization for boolean true.
Definition: FpConfig.h:79
#define FW_SERIALIZE_FALSE_VALUE
Value encoded during serialization for boolean false.
Definition: FpConfig.h:83
PlatformSizeType FwSizeType
Definition: FpConfig.h:18
U16 FwBuffSizeType
Definition: FpConfig.h:30
C++-compatible configuration header for fprime configuration.
Declares ISF string base class.
NATIVE_UINT_TYPE getBuffCapacity() const
returns capacity, not current size, of buffer
U8 * getBuffAddr()
gets buffer address for data filling
void setExtBuffer(U8 *buffPtr, NATIVE_UINT_TYPE size)
Set the external buffer.
void clear()
clear external buffer
ExternalSerializeBuffer()
default constructor
forward declaration
Serializable()
Default constructor.
virtual ~Serializable()
destructor
virtual SerializeStatus deserialize(SerializeBufferBase &buffer)=0
deserialize to contents
virtual SerializeStatus serialize(SerializeBufferBase &buffer) const =0
serialize contents
NATIVE_UINT_TYPE getBuffLeft() const
returns how much deserialization buffer is left
virtual U8 * getBuffAddr()=0
gets buffer address for data filling
void resetDeser()
reset deserialization to beginning
SerializeStatus moveDeserToOffset(FwSizeType offset)
Moves deserialization to the specified offset.
SerializeStatus setBuffLen(NATIVE_UINT_TYPE length)
sets buffer length manually after filling with data
const U8 * getBuffAddrLeft() const
gets address of remaining non-deserialized data.
void resetSer()
reset to beginning of buffer to reuse for serialization
SerializeStatus serializeSkip(FwSizeType numBytesToSkip)
Skips the number of specified bytes for serialization.
SerializeStatus moveSerToOffset(FwSizeType offset)
Moves serialization to the specified offset.
SerializeBufferBase()
default constructor
SerializeStatus setBuff(const U8 *src, NATIVE_UINT_TYPE length)
sets buffer contents and size
SerializeBufferBase & operator=(const SerializeBufferBase &src)
equal operator
virtual NATIVE_UINT_TYPE getBuffCapacity() const =0
returns capacity, not current size, of buffer
SerializeStatus deserialize(U8 &val)
deserialize 8-bit unsigned int
virtual ~SerializeBufferBase()
destructor
SerializeStatus deserializeSkip(FwSizeType numBytesToSkip)
Skips the number of specified bytes for deserialization.
U8 * getBuffAddrSer()
gets address of end of serialization. DANGEROUS! Need to know max buffer size and adjust when done
SerializeStatus serialize(U8 val)
serialize 8-bit unsigned int
SerializeStatus copyRawOffset(SerializeBufferBase &dest, NATIVE_UINT_TYPE size)
directly copies buffer without looking for a size in the stream.
SerializeStatus copyRaw(SerializeBufferBase &dest, NATIVE_UINT_TYPE size)
directly copies buffer without looking for a size in the stream.
NATIVE_UINT_TYPE getBuffLength() const
returns current buffer size
SerializeStatus
forward declaration for string
@ FW_DESERIALIZE_FORMAT_ERROR
Deserialization data had incorrect values (unexpected data types)
@ FW_DESERIALIZE_BUFFER_EMPTY
Deserialization buffer was empty when trying to read more data.
@ FW_SERIALIZE_OK
Serialization/Deserialization operation was successful.
@ FW_DESERIALIZE_SIZE_MISMATCH
Data was left in the buffer, but not enough to deserialize.
@ FW_SERIALIZE_NO_ROOM_LEFT
No room left in the buffer to serialize data.
#define U64(C)
Definition: sha.h:176