32 typename EventVariant,
33 size_t MaxPayload = 64
36 static_assert(std::is_trivially_copyable_v<Event>,
"Wire events must be trivially copyable for zero-copy binary transport.");
37 static_assert(
sizeof(
Event) <= MaxPayload,
"Event size exceeds WirePacket MaxPayload capacity.");
39 constexpr size_t typeIdx = corium::variant_index_v<Event, EventVariant>;
40 static_assert(typeIdx !=
static_cast<size_t>(-1),
"Event type is not part of the specified EventVariant list.");
43 std::memcpy(packet.
payload.data(), &event,
sizeof(
Event));
44 packet.
finalize(
static_cast<uint8_t
>(typeIdx),
static_cast<uint16_t
>(
sizeof(
Event)));
58 typename EventVariant,
59 size_t MaxPayload = 64,
67 if (!packet.isValid()) {
71 constexpr size_t numTypes = std::variant_size_v<EventVariant>;
72 if (packet.header.typeIndex >= numTypes) {
76 return deserializeIndex<EventVariant, MaxPayload, Sink>(
80 std::make_index_sequence<numTypes>{}
85 template <
typename EventVariant,
size_t MaxPayload,
typename Sink,
size_t... Is>
86 static bool deserializeIndex(
90 std::index_sequence<Is...>
93 (void)((packet.header.typeIndex == Is ? (handled = deserializeExact<Is, EventVariant, MaxPayload, Sink>(packet, sink, priority),
true) : false) || ...);
97 template <
size_t Index,
typename EventVariant,
size_t MaxPayload,
typename Sink>
98 static bool deserializeExact(
99 const WirePacket<MaxPayload>& packet,
103 using TargetEvent = std::variant_alternative_t<Index, EventVariant>;
104 if (packet.header.payloadLength !=
sizeof(TargetEvent)) {
108 if (packet.header.reserved != 0 && packet.header.reserved != computeTypeSignature<TargetEvent>()) {
113 std::memcpy(&evt, packet.payload.data(),
sizeof(TargetEvent));
114 sink.post(EventVariant{std::move(evt)}, priority);
Bounded and multi-tier priority MPSC queueing policies.
Compile-time type index resolution for std::variant alternative types.
Binary packet framing with CRC-16 checksum and schema versioning.
Zero-heap type-safe serializer and deserializer for Corium event variants over binary wire streams.
Definition Serializer.hpp:22
static bool deserializeAndPush(const WirePacket< MaxPayload > &packet, Sink &sink, EventPriority priority=EventPriority::Normal) noexcept
Deserialize a validated binary WirePacket directly into an event sink.
Definition Serializer.hpp:62
static WirePacket< MaxPayload > serialize(const Event &event) noexcept
Serialize a trivially-copyable concrete event into a fixed-size binary WirePacket.
Definition Serializer.hpp:35
Definition EventJournal.hpp:22
EventPriority
Event priority levels for multi-priority queue policies.
Definition QueuePolicies.hpp:32
DefaultEvents Event
Alias for DefaultEvents.
Definition Events.hpp:65
Statically-sized zero-heap binary wire packet.
Definition WirePacket.hpp:64
WireHeader header
Definition WirePacket.hpp:65
std::array< uint8_t, MaxPayloadSize > payload
Definition WirePacket.hpp:66
void finalize(uint8_t typeIdx, uint16_t length, uint8_t flags=0, uint8_t version=CORIUM_WIRE_VERSION) noexcept
Finalize packet header, set payload length and calculate CRC16 checksum.
Definition WirePacket.hpp:71