19 #if FW_SERIALIZABLE_TO_STRING || FW_ENABLE_TEXT_LOGGING || BUILD_UT 21 void Serializable::toString(
StringBase& text)
const {
28 std::ostream& operator<<(std::ostream& os,
const Serializable& val) {
41 : m_buffAddr(buffAddr), m_capacity(capacity), m_serLoc(0), m_deserLoc(0) {
43 FW_ASSERT((buffAddr ==
nullptr) == (capacity == 0), static_cast<FwAssertArgType>(capacity));
49 this->m_serLoc = src.m_serLoc;
50 this->m_deserLoc = src.m_deserLoc;
51 const U8* srcBuffAddr = src.m_buffAddr;
52 U8* thisBuffAddr = this->m_buffAddr;
56 FW_ASSERT(src.m_serLoc <= this->m_capacity, static_cast<FwAssertArgType>(src.m_serLoc),
57 static_cast<FwAssertArgType>(this->m_capacity));
58 (void)memcpy(thisBuffAddr, srcBuffAddr, static_cast<size_t>(this->m_serLoc));
71 if (this->m_serLoc + static_cast<Serializable::SizeType>(
sizeof(val)) - 1 >= this->m_capacity) {
74 U8* buffAddr = this->m_buffAddr;
76 buffAddr[this->m_serLoc] = val;
87 #if FW_HAS_16_BIT == 1 89 if (this->m_serLoc + static_cast<Serializable::SizeType>(
sizeof(val)) - 1 >= this->m_capacity) {
92 U8* buffAddr = this->m_buffAddr;
97 buffAddr[this->m_serLoc + 0] =
static_cast<U8>(val >> 8);
98 buffAddr[this->m_serLoc + 1] =
static_cast<U8>(val);
102 buffAddr[this->m_serLoc + 0] =
static_cast<U8>(val);
103 buffAddr[this->m_serLoc + 1] =
static_cast<U8>(val >> 8);
110 this->m_deserLoc = 0;
118 #if FW_HAS_32_BIT == 1 120 if (this->m_serLoc + static_cast<Serializable::SizeType>(
sizeof(val)) - 1 >= this->m_capacity) {
123 U8* buffAddr = this->m_buffAddr;
128 buffAddr[this->m_serLoc + 0] =
static_cast<U8>(val >> 24);
129 buffAddr[this->m_serLoc + 1] =
static_cast<U8>(val >> 16);
130 buffAddr[this->m_serLoc + 2] =
static_cast<U8>(val >> 8);
131 buffAddr[this->m_serLoc + 3] =
static_cast<U8>(val);
135 buffAddr[this->m_serLoc + 0] =
static_cast<U8>(val);
136 buffAddr[this->m_serLoc + 1] =
static_cast<U8>(val >> 8);
137 buffAddr[this->m_serLoc + 2] =
static_cast<U8>(val >> 16);
138 buffAddr[this->m_serLoc + 3] =
static_cast<U8>(val >> 24);
145 this->m_deserLoc = 0;
154 #if FW_HAS_64_BIT == 1 156 if (this->m_serLoc + static_cast<Serializable::SizeType>(
sizeof(val)) - 1 >= this->m_capacity) {
159 U8* buffAddr = this->m_buffAddr;
164 buffAddr[this->m_serLoc + 0] =
static_cast<U8>(val >> 56);
165 buffAddr[this->m_serLoc + 1] =
static_cast<U8>(val >> 48);
166 buffAddr[this->m_serLoc + 2] =
static_cast<U8>(val >> 40);
167 buffAddr[this->m_serLoc + 3] =
static_cast<U8>(val >> 32);
168 buffAddr[this->m_serLoc + 4] =
static_cast<U8>(val >> 24);
169 buffAddr[this->m_serLoc + 5] =
static_cast<U8>(val >> 16);
170 buffAddr[this->m_serLoc + 6] =
static_cast<U8>(val >> 8);
171 buffAddr[this->m_serLoc + 7] =
static_cast<U8>(val);
175 buffAddr[this->m_serLoc + 0] =
static_cast<U8>(val);
176 buffAddr[this->m_serLoc + 1] =
static_cast<U8>(val >> 8);
177 buffAddr[this->m_serLoc + 2] =
static_cast<U8>(val >> 16);
178 buffAddr[this->m_serLoc + 3] =
static_cast<U8>(val >> 24);
179 buffAddr[this->m_serLoc + 4] =
static_cast<U8>(val >> 32);
180 buffAddr[this->m_serLoc + 5] =
static_cast<U8>(val >> 40);
181 buffAddr[this->m_serLoc + 6] =
static_cast<U8>(val >> 48);
182 buffAddr[this->m_serLoc + 7] =
static_cast<U8>(val >> 56);
189 this->m_deserLoc = 0;
201 (void)memcpy(&u64Val, &val,
sizeof(val));
208 (void)memcpy(&u32Val, &val,
sizeof(val));
215 "boolean wire values must fit in one byte");
217 "boolean wire values must be distinct");
224 return this->
serializeFrom(reinterpret_cast<PlatformPointerCastType>(val), mode);
240 stat = this->
serializeFrom(static_cast<FwSizeStoreType>(length), endianMode);
248 if (length > this->m_capacity - this->m_serLoc) {
255 U8* buffAddr = this->m_buffAddr;
258 (void)memmove(&buffAddr[this->m_serLoc], buff, static_cast<size_t>(length));
260 this->m_deserLoc = 0;
275 if (size > available || static_cast<Serializable::SizeType>(
sizeof(
FwSizeStoreType)) > available - size) {
285 U8* thisBuffAddr = this->m_buffAddr;
290 (void)memcpy(&thisBuffAddr[this->m_serLoc], valBuffAddr, static_cast<size_t>(size));
291 this->m_serLoc += size;
292 this->m_deserLoc = 0;
303 status = this->
serializeFrom(static_cast<FwSizeStoreType>(size), mode);
313 if (size == this->m_deserLoc) {
315 }
else if (size - this->m_deserLoc < static_cast<Serializable::SizeType>(
sizeof(val))) {
319 U8* buffAddr = this->m_buffAddr;
321 val = buffAddr[this->m_deserLoc + 0];
329 if (size == this->m_deserLoc) {
331 }
else if (size - this->m_deserLoc < static_cast<Serializable::SizeType>(
sizeof(val))) {
335 U8* buffAddr = this->m_buffAddr;
337 val =
static_cast<I8>(buffAddr[this->m_deserLoc + 0]);
342 #if FW_HAS_16_BIT == 1 346 if (size == this->m_deserLoc) {
348 }
else if (size - this->m_deserLoc < static_cast<Serializable::SizeType>(
sizeof(val))) {
352 U8* buffAddr = this->m_buffAddr;
357 val =
static_cast<U16
>(((buffAddr[this->m_deserLoc + 1]) << 0) | ((buffAddr[this->m_deserLoc + 0]) << 8));
361 val =
static_cast<U16
>(((buffAddr[this->m_deserLoc + 0]) << 0) | ((buffAddr[this->m_deserLoc + 1]) << 8));
375 val =
static_cast<I16
>(unsignVal);
380 #if FW_HAS_32_BIT == 1 384 if (size == this->m_deserLoc) {
386 }
else if (size - this->m_deserLoc < static_cast<Serializable::SizeType>(
sizeof(val))) {
390 U8* buffAddr = this->m_buffAddr;
395 val = (
static_cast<U32
>(buffAddr[this->m_deserLoc + 3]) << 0) |
396 (
static_cast<U32
>(buffAddr[this->m_deserLoc + 2]) << 8) |
397 (
static_cast<U32
>(buffAddr[this->m_deserLoc + 1]) << 16) |
398 (
static_cast<U32
>(buffAddr[this->m_deserLoc + 0]) << 24);
402 val = (
static_cast<U32
>(buffAddr[this->m_deserLoc + 0]) << 0) |
403 (
static_cast<U32
>(buffAddr[this->m_deserLoc + 1]) << 8) |
404 (
static_cast<U32
>(buffAddr[this->m_deserLoc + 2]) << 16) |
405 (
static_cast<U32
>(buffAddr[this->m_deserLoc + 3]) << 24);
419 val =
static_cast<I32
>(unsignVal);
425 #if FW_HAS_64_BIT == 1 429 if (this->m_serLoc == this->m_deserLoc) {
431 }
else if (this->m_serLoc - this->m_deserLoc < static_cast<Serializable::SizeType>(
sizeof(val))) {
435 U8* buffAddr = this->m_buffAddr;
440 val = (
static_cast<U64
>(buffAddr[this->m_deserLoc + 7]) << 0) |
441 (
static_cast<U64
>(buffAddr[this->m_deserLoc + 6]) << 8) |
442 (
static_cast<U64
>(buffAddr[this->m_deserLoc + 5]) << 16) |
443 (
static_cast<U64
>(buffAddr[this->m_deserLoc + 4]) << 24) |
444 (
static_cast<U64
>(buffAddr[this->m_deserLoc + 3]) << 32) |
445 (
static_cast<U64
>(buffAddr[this->m_deserLoc + 2]) << 40) |
446 (
static_cast<U64
>(buffAddr[this->m_deserLoc + 1]) << 48) |
447 (
static_cast<U64
>(buffAddr[this->m_deserLoc + 0]) << 56);
451 val = (
static_cast<U64
>(buffAddr[this->m_deserLoc + 0]) << 0) |
452 (
static_cast<U64
>(buffAddr[this->m_deserLoc + 1]) << 8) |
453 (
static_cast<U64
>(buffAddr[this->m_deserLoc + 2]) << 16) |
454 (
static_cast<U64
>(buffAddr[this->m_deserLoc + 3]) << 24) |
455 (
static_cast<U64
>(buffAddr[this->m_deserLoc + 4]) << 32) |
456 (
static_cast<U64
>(buffAddr[this->m_deserLoc + 5]) << 40) |
457 (
static_cast<U64
>(buffAddr[this->m_deserLoc + 6]) << 48) |
458 (
static_cast<U64
>(buffAddr[this->m_deserLoc + 7]) << 56);
472 val =
static_cast<I64
>(unsignVal);
486 (void)memcpy(&val, &tempVal,
sizeof(val));
511 PlatformPointerCastType pointerCastVal = 0;
514 val =
reinterpret_cast<void*
>(pointerCastVal);
526 (void)memcpy(&val, &tempVal,
sizeof(val));
544 U8* buffAddr = this->m_buffAddr;
561 if (storedLength > 0) {
564 (void)memcpy(buff, &buffAddr[this->m_deserLoc], static_cast<size_t>(storedLength));
566 length =
static_cast<FwSizeType>(storedLength);
577 (void)memcpy(buff, &buffAddr[this->m_deserLoc], static_cast<size_t>(length));
607 U8* thisBuffAddr = this->m_buffAddr;
609 (void)memcpy(valBuffAddr, &thisBuffAddr[this->m_deserLoc], static_cast<size_t>(storedLength));
617 this->m_deserLoc += storedLength;
632 this->m_deserLoc = 0;
637 this->m_deserLoc = 0;
643 const FwSizeType newSerLoc = this->m_serLoc + numBytesToSkip;
645 if (newSerLoc <= this->m_capacity) {
657 if (size == this->m_deserLoc) {
659 }
else if (size - this->m_deserLoc < numBytesToSkip) {
681 return this->m_serLoc;
685 if (this->m_capacity < length) {
689 U8* buffAddr = this->m_buffAddr;
691 (void)memcpy(buffAddr, src, static_cast<size_t>(length));
692 this->m_serLoc = length;
693 this->m_deserLoc = 0;
699 if (this->m_capacity < length) {
702 this->m_serLoc = length;
703 this->m_deserLoc = 0;
709 FW_ASSERT(this->m_serLoc >= this->m_deserLoc, static_cast<FwAssertArgType>(this->m_serLoc),
710 static_cast<FwAssertArgType>(this->m_deserLoc));
711 return this->m_serLoc - this->m_deserLoc;
715 FW_ASSERT(this->m_capacity >= this->m_serLoc, static_cast<FwAssertArgType>(this->m_capacity),
716 static_cast<FwAssertArgType>(this->m_serLoc));
717 return this->m_capacity - this->m_serLoc;
732 U8* buffAddr = this->m_buffAddr;
737 this->m_deserLoc += size;
747 if (destCapacity < size + destSize) {
756 U8* buffAddr = this->m_buffAddr;
759 this->m_deserLoc += size;
767 const U8* buffAddr = this->m_buffAddr;
769 return &buffAddr[this->m_deserLoc];
774 U8* buffAddr = this->m_buffAddr;
776 return &buffAddr[this->m_serLoc];
781 if (this->m_serLoc != other.
getSize()) {
785 const U8* us = this->m_buffAddr;
792 if (us[byte] != them[byte]) {
800 std::ostream& operator<<(std::ostream& os,
const LinearBufferBase& buff) {
801 const U8* us = buff.getBuffAddr();
806 os <<
"[" << std::setw(2) << std::hex << std::setfill(
'0') << us[byte] <<
"]" << std::dec;
825 FW_ASSERT((buffPtr !=
nullptr) || (size == 0), static_cast<FwAssertArgType>(size));
843 return this->m_serLoc;
856 #if FW_HAS_16_BIT == 1 864 #if FW_HAS_32_BIT == 1 872 #if FW_HAS_64_BIT == 1 922 #if FW_HAS_16_BIT == 1 930 #if FW_HAS_32_BIT == 1 938 #if FW_HAS_64_BIT == 1 Serialization/Deserialization operation was successful.
void clear()
Clear external buffer.
void copyFrom(const LinearBufferBase &src)
Copy data from source buffer.
virtual Serializable::SizeType getCapacity() const =0
Get buffer capacity.
Deserialization buffer was empty when trying to read more data.
SerializeStatus setBuff(const U8 *src, Serializable::SizeType length) override
Set buffer contents from external source.
PlatformSizeType FwSizeType
SerializeStatus moveSerToOffset(FwSizeType offset) override
Move serialization pointer to specified offset.
virtual SerializeStatus serializeTo(SerialBufferBase &buffer, Endianness mode=Endianness::BIG) const =0
Serialize the contents of this object to a buffer.
const U8 * getBuffAddrLeft() const
Get address of remaining non-deserialized data.
Serializable::SizeType getSize() const override
Get current buffer size.
SerializeStatus deserializeTo(U8 &val, Endianness mode=Endianness::BIG) override
Deserialize an 8-bit unsigned integer value.
Fw::SerializeStatus serialize(Fw::SerialBufferBase &serializer, FwSizeType size)
Serialize an idle packet of exactly size bytes (header and idle data) into serializer ...
int8_t I8
8-bit signed integer
No room left in the buffer to serialize data.
void setBuffAddrInternal(U8 *addr)
virtual SerializeStatus deserializeFrom(SerialBufferBase &buffer, Endianness mode=Endianness::BIG)=0
Deserialize the contents of this object from a buffer.
LinearBufferBase & operator=(const LinearBufferBase &src)
Copy assignment operator.
Deserialization data had incorrect values (unexpected data types)
SerializeStatus serializeFrom(U8 val, Endianness mode=Endianness::BIG) override
Serialize an 8-bit unsigned integer value.
virtual SerializeStatus serializeFrom(U8 val, Endianness mode=Endianness::BIG)=0
Serialize an 8-bit unsigned integer value.
Serializable::SizeType getCapacity() const override
Get buffer capacity.
SerializeStatus deserializeSkip(FwSizeType numBytesToSkip) override
Skip specified number of bytes during deserialization.
ExternalSerializeBuffer()
Default constructor.
LinearBufferBase()=delete
SerializeStatus
forward declaration for string
float F32
32-bit floating point
virtual ~SerialBufferBase()
Virtual destructor.
Data was the wrong format (e.g. wrong packet type)
U8 * getBuffAddr()
Get buffer address for data filling (non-const version)
SerializeStatus moveDeserToOffset(FwSizeType offset) override
Move deserialization pointer to specified offset.
Omit length from serialization.
Data was left in the buffer, but not enough to deserialize.
Serializable::SizeType getDeserializeSizeLeft() const override
Get remaining deserialization buffer size.
Serializable()
Default constructor.
void resetDeser() override
Reset deserialization pointer to beginning of buffer.
void resetSer() override
Reset serialization pointer to beginning of buffer.
FwSizeType FwSizeStoreType
void setCapacityInternal(Serializable::SizeType capacity)
#define FW_SERIALIZE_FORCE_INLINE_LBB
SerializeStatus copyRawOffset(SerialBufferBase &dest, Serializable::SizeType size) override
Append raw bytes to destination from this buffer and advance source offset.
virtual SerializeStatus setBuff(const U8 *src, Serializable::SizeType length)=0
Set buffer contents from external source.
uint8_t U8
8-bit unsigned integer
SerializeStatus setBuffLen(Serializable::SizeType length) override
Set buffer length manually.
static U32 min(const U32 a, const U32 b)
void setExtBuffer(U8 *buffPtr, Serializable::SizeType size)
Set the external buffer.
virtual ~Serializable()
Virtual destructor.
double F64
64-bit floating point (double). Required for compiler-supplied double promotion.
SerializeStatus deserializeSize(FwSizeType &size, Endianness mode=Endianness::BIG) override
Deserialize a size value.
SerializeStatus copyRaw(SerialBufferBase &dest, Serializable::SizeType size) override
Copy raw bytes from this buffer to destination and advance source offset.
Include length as first token in serialization.
Little endian serialization.
SerializeStatus serializeSize(const FwSizeType size, Endianness mode=Endianness::BIG) override
Serialize a size value.
Implementation of malloc based allocator.
virtual Serializable::SizeType getSize() const =0
Get current buffer size.
Serializable::SizeType getSerializeSizeLeft() const override
Get remaining serialization buffer size.
SerializeStatus serializeSkip(FwSizeType numBytesToSkip) override
Skip specified number of bytes during serialization.
U8 * getBuffAddrSer()
Get address of end of serialization (DANGEROUS!)
virtual ~LinearBufferBase()
Destructor.
Big endian serialization.