summaryrefslogtreecommitdiff
path: root/src/message.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/message.zig')
-rw-r--r--src/message.zig57
1 files changed, 57 insertions, 0 deletions
diff --git a/src/message.zig b/src/message.zig
index 403bfcd..6d95e4b 100644
--- a/src/message.zig
+++ b/src/message.zig
@@ -28,6 +28,59 @@ pub const Error = error{
UnknownSaprusType,
};
+// ZERO COPY STUFF
+// &payload could be a void value that is treated as a pointer to a [*]u8
+pub const ZeroCopyMessage = packed struct {
+ pub const Relay = packed struct {
+ dest: @Vector(4, u8),
+ /// @as([*]u8, @ptrCast(&payload))
+ payload: void,
+ };
+ pub const Connection = packed struct {
+ src_port: u16, // random number > 1024
+ dest_port: u16, // random number > 1024
+ seq_num: u32 = 0,
+ msg_id: u32 = 0,
+ reserved: u8 = 0,
+ options: ConnectionOptions = .{},
+ payload: void,
+ };
+
+ const Self = @This();
+
+ type: PacketType,
+ length: u16,
+ bytes: void = {},
+
+ fn getRelay(self: *align(1) Self) *align(1) const Relay {
+ return std.mem.bytesAsValue(Relay, &self.bytes);
+ }
+ fn getConnection(self: *align(1) Self) *align(1) const Connection {
+ return std.mem.bytesAsValue(Connection, &self.bytes);
+ }
+};
+
+test "testing variable length zero copy struct" {
+ const gpa = std.testing.allocator;
+ const bytes = try gpa.alloc(u8, @sizeOf(ZeroCopyMessage) + 64);
+ defer gpa.free(bytes);
+ // const zcm = std.mem.bytesAsValue(ZeroCopyMessage, bytes).*;
+ const zcm: *align(1) ZeroCopyMessage = @ptrCast(bytes.ptr);
+ // @compileLog(@typeInfo(@TypeOf(ZeroCopyMessage{ .type = .relay, .length = 0 })));
+ // @compileLog(@typeInfo(@TypeOf(zcm)));
+ // _ = zcm;
+ zcm.type = .relay;
+ zcm.length = 3;
+ std.debug.print("{any}\n", .{zcm});
+ std.debug.print("{any}\n", .{zcm.getRelay()});
+ std.debug.print("{any}\n", .{zcm.getConnection()});
+ std.debug.print("{x}\n", .{std.mem.asBytes(zcm.getConnection())});
+ std.debug.print("{x}\n", .{std.mem.asBytes(zcm.getRelay())});
+ std.debug.print("{x}\n", .{bytes});
+
+ try std.testing.expect(true);
+}
+
/// All Saprus messages
pub const Message = union(PacketType) {
pub const Relay = struct {
@@ -209,3 +262,7 @@ test "Round trip Connection toBytes and fromBytes" {
try std.testing.expectEqualDeep(msg, from_bytes);
}
+
+test {
+ std.testing.refAllDeclsRecursive(@This());
+}