Corium 1.1.0
High-Performance Zero-Heap C++20 MPSC Application Runtime
Loading...
Searching...
No Matches
Serializer.hpp
Go to the documentation of this file.
1
7#pragma once
8
9#include <cstring>
10#include <type_traits>
11#include <utility>
12#include <variant>
13
17
18namespace corium::wire {
19
23public:
30 template <
31 typename Event,
32 typename EventVariant,
33 size_t MaxPayload = 64
34 >
35 [[nodiscard]] static WirePacket<MaxPayload> serialize(const Event& event) noexcept {
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.");
38
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.");
41
43 std::memcpy(packet.payload.data(), &event, sizeof(Event));
44 packet.finalize(static_cast<uint8_t>(typeIdx), static_cast<uint16_t>(sizeof(Event)));
45 packet.header.reserved = computeTypeSignature<Event>();
46 return packet;
47 }
48
57 template <
58 typename EventVariant,
59 size_t MaxPayload = 64,
60 typename Sink
61 >
62 static bool deserializeAndPush(
63 const WirePacket<MaxPayload>& packet,
64 Sink& sink,
66 ) noexcept {
67 if (!packet.isValid()) {
68 return false;
69 }
70
71 constexpr size_t numTypes = std::variant_size_v<EventVariant>;
72 if (packet.header.typeIndex >= numTypes) {
73 return false;
74 }
75
76 return deserializeIndex<EventVariant, MaxPayload, Sink>(
77 packet,
78 sink,
79 priority,
80 std::make_index_sequence<numTypes>{}
81 );
82 }
83
84private:
85 template <typename EventVariant, size_t MaxPayload, typename Sink, size_t... Is>
86 static bool deserializeIndex(
87 const WirePacket<MaxPayload>& packet,
88 Sink& sink,
89 EventPriority priority,
90 std::index_sequence<Is...>
91 ) noexcept {
92 bool handled = false;
93 (void)((packet.header.typeIndex == Is ? (handled = deserializeExact<Is, EventVariant, MaxPayload, Sink>(packet, sink, priority), true) : false) || ...);
94 return handled;
95 }
96
97 template <size_t Index, typename EventVariant, size_t MaxPayload, typename Sink>
98 static bool deserializeExact(
99 const WirePacket<MaxPayload>& packet,
100 Sink& sink,
101 EventPriority priority
102 ) noexcept {
103 using TargetEvent = std::variant_alternative_t<Index, EventVariant>;
104 if (packet.header.payloadLength != sizeof(TargetEvent)) {
105 return false;
106 }
107
108 if (packet.header.reserved != 0 && packet.header.reserved != computeTypeSignature<TargetEvent>()) {
109 return false; // ABI size/alignment signature mismatch
110 }
111
112 TargetEvent evt{};
113 std::memcpy(&evt, packet.payload.data(), sizeof(TargetEvent));
114 sink.post(EventVariant{std::move(evt)}, priority);
115 return true;
116 }
117};
118
119} // namespace corium::wire
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
uint8_t reserved
Definition WirePacket.hpp:54
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