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));
213 if (this->m_serLoc + static_cast<Serializable::SizeType>(
sizeof(
U8)) - 1 >= this->m_capacity) {
217 U8* buffAddr = this->m_buffAddr;
226 this->m_deserLoc = 0;
231 if (this->m_serLoc + static_cast<Serializable::SizeType>(
sizeof(
void*)) - 1 >= this->m_capacity) {
235 return this->
serializeFrom(reinterpret_cast<PlatformPointerCastType>(val), mode);
251 stat = this->
serializeFrom(static_cast<FwSizeStoreType>(length), endianMode);
258 if (this->m_serLoc + length > this->m_capacity) {
265 U8* buffAddr = this->m_buffAddr;
268 (void)memmove(&buffAddr[this->m_serLoc], buff, static_cast<size_t>(length));
270 this->m_deserLoc = 0;
283 if (this->m_serLoc + size + static_cast<Serializable::SizeType>(
sizeof(
FwSizeStoreType)) > this->m_capacity) {
293 U8* thisBuffAddr = this->m_buffAddr;
298 (void)memcpy(&thisBuffAddr[this->m_serLoc], valBuffAddr, static_cast<size_t>(size));
299 this->m_serLoc += size;
300 this->m_deserLoc = 0;
311 status = this->
serializeFrom(static_cast<FwSizeStoreType>(size), mode);
321 if (size == this->m_deserLoc) {
323 }
else if (size - this->m_deserLoc < static_cast<Serializable::SizeType>(
sizeof(val))) {
327 U8* buffAddr = this->m_buffAddr;
329 val = buffAddr[this->m_deserLoc + 0];
337 if (size == this->m_deserLoc) {
339 }
else if (size - this->m_deserLoc < static_cast<Serializable::SizeType>(
sizeof(val))) {
343 U8* buffAddr = this->m_buffAddr;
345 val =
static_cast<I8>(buffAddr[this->m_deserLoc + 0]);
350 #if FW_HAS_16_BIT == 1 354 if (size == this->m_deserLoc) {
356 }
else if (size - this->m_deserLoc < static_cast<Serializable::SizeType>(
sizeof(val))) {
360 U8* buffAddr = this->m_buffAddr;
365 val =
static_cast<U16
>(((buffAddr[this->m_deserLoc + 1]) << 0) | ((buffAddr[this->m_deserLoc + 0]) << 8));
369 val =
static_cast<U16
>(((buffAddr[this->m_deserLoc + 0]) << 0) | ((buffAddr[this->m_deserLoc + 1]) << 8));
383 val =
static_cast<I16
>(unsignVal);
388 #if FW_HAS_32_BIT == 1 392 if (size == this->m_deserLoc) {
394 }
else if (size - this->m_deserLoc < static_cast<Serializable::SizeType>(
sizeof(val))) {
398 U8* buffAddr = this->m_buffAddr;
403 val = (
static_cast<U32
>(buffAddr[this->m_deserLoc + 3]) << 0) |
404 (
static_cast<U32
>(buffAddr[this->m_deserLoc + 2]) << 8) |
405 (
static_cast<U32
>(buffAddr[this->m_deserLoc + 1]) << 16) |
406 (
static_cast<U32
>(buffAddr[this->m_deserLoc + 0]) << 24);
410 val = (
static_cast<U32
>(buffAddr[this->m_deserLoc + 0]) << 0) |
411 (
static_cast<U32
>(buffAddr[this->m_deserLoc + 1]) << 8) |
412 (
static_cast<U32
>(buffAddr[this->m_deserLoc + 2]) << 16) |
413 (
static_cast<U32
>(buffAddr[this->m_deserLoc + 3]) << 24);
427 val =
static_cast<I32
>(unsignVal);
433 #if FW_HAS_64_BIT == 1 437 if (this->m_serLoc == this->m_deserLoc) {
439 }
else if (this->m_serLoc - this->m_deserLoc < static_cast<Serializable::SizeType>(
sizeof(val))) {
443 U8* buffAddr = this->m_buffAddr;
448 val = (
static_cast<U64
>(buffAddr[this->m_deserLoc + 7]) << 0) |
449 (
static_cast<U64
>(buffAddr[this->m_deserLoc + 6]) << 8) |
450 (
static_cast<U64
>(buffAddr[this->m_deserLoc + 5]) << 16) |
451 (
static_cast<U64
>(buffAddr[this->m_deserLoc + 4]) << 24) |
452 (
static_cast<U64
>(buffAddr[this->m_deserLoc + 3]) << 32) |
453 (
static_cast<U64
>(buffAddr[this->m_deserLoc + 2]) << 40) |
454 (
static_cast<U64
>(buffAddr[this->m_deserLoc + 1]) << 48) |
455 (
static_cast<U64
>(buffAddr[this->m_deserLoc + 0]) << 56);
459 val = (
static_cast<U64
>(buffAddr[this->m_deserLoc + 0]) << 0) |
460 (
static_cast<U64
>(buffAddr[this->m_deserLoc + 1]) << 8) |
461 (
static_cast<U64
>(buffAddr[this->m_deserLoc + 2]) << 16) |
462 (
static_cast<U64
>(buffAddr[this->m_deserLoc + 3]) << 24) |
463 (
static_cast<U64
>(buffAddr[this->m_deserLoc + 4]) << 32) |
464 (
static_cast<U64
>(buffAddr[this->m_deserLoc + 5]) << 40) |
465 (
static_cast<U64
>(buffAddr[this->m_deserLoc + 6]) << 48) |
466 (
static_cast<U64
>(buffAddr[this->m_deserLoc + 7]) << 56);
480 val =
static_cast<I64
>(unsignVal);
494 (void)memcpy(&val, &tempVal,
sizeof(val));
502 if (size == this->m_deserLoc) {
504 }
else if (size - this->m_deserLoc < static_cast<Serializable::SizeType>(
sizeof(
U8))) {
508 U8* buffAddr = this->m_buffAddr;
510 const U8 byteVal = buffAddr[this->m_deserLoc + 0];
525 PlatformPointerCastType pointerCastVal = 0;
528 val =
reinterpret_cast<void*
>(pointerCastVal);
540 (void)memcpy(&val, &tempVal,
sizeof(val));
558 U8* buffAddr = this->m_buffAddr;
575 if (storedLength > 0) {
578 (void)memcpy(buff, &buffAddr[this->m_deserLoc], static_cast<size_t>(storedLength));
580 length =
static_cast<FwSizeType>(storedLength);
591 (void)memcpy(buff, &buffAddr[this->m_deserLoc], static_cast<size_t>(length));
621 U8* thisBuffAddr = this->m_buffAddr;
623 (void)memcpy(valBuffAddr, &thisBuffAddr[this->m_deserLoc], static_cast<size_t>(storedLength));
631 this->m_deserLoc += storedLength;
646 this->m_deserLoc = 0;
651 this->m_deserLoc = 0;
657 const FwSizeType newSerLoc = this->m_serLoc + numBytesToSkip;
659 if (newSerLoc <= this->m_capacity) {
671 if (size == this->m_deserLoc) {
673 }
else if (size - this->m_deserLoc < numBytesToSkip) {
695 return this->m_serLoc;
699 if (this->m_capacity < length) {
703 U8* buffAddr = this->m_buffAddr;
705 (void)memcpy(buffAddr, src, static_cast<size_t>(length));
706 this->m_serLoc = length;
707 this->m_deserLoc = 0;
713 if (this->m_capacity < length) {
716 this->m_serLoc = length;
717 this->m_deserLoc = 0;
723 FW_ASSERT(this->m_serLoc >= this->m_deserLoc, static_cast<FwAssertArgType>(this->m_serLoc),
724 static_cast<FwAssertArgType>(this->m_deserLoc));
725 return this->m_serLoc - this->m_deserLoc;
729 FW_ASSERT(this->m_capacity >= this->m_serLoc, static_cast<FwAssertArgType>(this->m_capacity),
730 static_cast<FwAssertArgType>(this->m_serLoc));
731 return this->m_capacity - this->m_serLoc;
746 U8* buffAddr = this->m_buffAddr;
751 this->m_deserLoc += size;
761 if (destCapacity < size + destSize) {
770 U8* buffAddr = this->m_buffAddr;
773 this->m_deserLoc += size;
781 const U8* buffAddr = this->m_buffAddr;
783 return &buffAddr[this->m_deserLoc];
788 U8* buffAddr = this->m_buffAddr;
790 return &buffAddr[this->m_serLoc];
795 if (this->m_serLoc != other.
getSize()) {
799 const U8* us = this->m_buffAddr;
806 if (us[byte] != them[byte]) {
814 std::ostream& operator<<(std::ostream& os,
const LinearBufferBase& buff) {
815 const U8* us = buff.getBuffAddr();
820 os <<
"[" << std::setw(2) << std::hex << std::setfill(
'0') << us[byte] <<
"]" << std::dec;
839 FW_ASSERT((buffPtr !=
nullptr) || (size == 0), static_cast<FwAssertArgType>(size));
857 return this->m_serLoc;
870 #if FW_HAS_16_BIT == 1 878 #if FW_HAS_32_BIT == 1 886 #if FW_HAS_64_BIT == 1 936 #if FW_HAS_16_BIT == 1 944 #if FW_HAS_32_BIT == 1 952 #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.
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
U16 FwSizeStoreType
The type used to serialize a size value.
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.
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.