CppSerdes  1.0
A serialization/deserialization library designed with embedded systems in mind
10_virtual_fields.cpp

This example demonstrates how to define virtual fields, and pure virtual (mandatory) fields, that can be overridden in child classes.

#include "../include/serdes.h"
#include <stdio.h>
#include "../test/notify_when_dynamic_allocation_used.h"
struct packet_format : serdes::packet_base
{
uint8_t id = 0;
uint16_t checksum = 0;
serdes::formatter optional_trailing_data = {serdes::virtual_formatter};
void format(serdes::packet &p) override
{
p + id + payload + checksum + optional_trailing_data;
}
};
struct amperage_command : packet_format
{
uint64_t amperage = 0;
amperage_command()
{
packet_format::payload = {serdes::init_formatter(amperage)};
}
};
struct voltage_command : packet_format
{
struct payload_t : serdes::packet_base
{
uint32_t voltage = 0;
void format(serdes::packet &p) final
{
p + voltage;
}
} payload = {};
voltage_command()
{
packet_format::payload = {serdes::init_formatter(payload)};
}
};
int main()
{
uint8_t serial_data[] = {0xAB, 0x01, 0x02, 0x03, 0x04, 0xCD, 0xEF, 0x05, 0x06, 0x07, 0x08, 0x09};
voltage_command obj;
auto result = obj.load(serial_data);
printf("voltage_command (%s) = {\n", serdes::status2str(result.status));
printf(" id = 0x%02X\n", obj.id);
printf(" payload.voltage = 0x%08X\n", obj.payload.voltage);
printf(" checksum = 0x%04X\n}\n", obj.checksum);
}
serdes::status2str
const char * status2str(status_e err_status) noexcept
converts an error status enum to a c style string
Definition: serdes_errors.h:57
serdes::formatter
a lambda function wrapper that can describe any serialization/deserialization formatting process....
Definition: serdes_formatter.h:32
serdes::pure_virtual_formatter
constexpr void(* pure_virtual_formatter)(packet &)
used to initialize a formatter object to be required but uninitialized. the default behaviour if not ...
Definition: serdes_formatter.h:40
serdes::packet
a serialization/deserialization helper class, with load, store, and stream operators
Definition: serdes.h:54
init_formatter
#define init_formatter(...)
init_formatter() constructs a serdes::formatter object lambda without using dynamic memory allocation...
Definition: serdes_formatter.h:77
serdes::packet_base
inheritable base class to allow format recording and application with no additional memory storage (e...
Definition: serdes_fwd_declarations.h:45
serdes::virtual_formatter
void virtual_formatter(packet &)
used to initialize a formatter object to be optionally overridable. the default behaviour if not over...
Definition: serdes_formatter.h:44
serdes::packet_base::format
virtual void format(packet &)=0
override to declare the serdes process used in store() and load()