This commit is contained in:
2025-04-28 07:03:34 -04:00
parent eacfaffb6b
commit 339ac5cfe5

View File

@@ -33,7 +33,6 @@ pub const Error = error{
pub const ZeroCopyMessage = packed struct { pub const ZeroCopyMessage = packed struct {
pub const Relay = packed struct { pub const Relay = packed struct {
dest: @Vector(4, u8), dest: @Vector(4, u8),
/// @as([*]u8, @ptrCast(&payload))
payload: void, payload: void,
}; };
pub const Connection = packed struct { pub const Connection = packed struct {
@@ -52,30 +51,44 @@ pub const ZeroCopyMessage = packed struct {
length: u16, length: u16,
bytes: void = {}, bytes: void = {},
fn getRelay(self: *align(1) Self) *align(1) const Relay { fn getRelay(self: *align(1) Self) *align(1) Relay {
return std.mem.bytesAsValue(Relay, &self.bytes); return std.mem.bytesAsValue(Relay, &self.bytes);
} }
fn getConnection(self: *align(1) Self) *align(1) const Connection { fn getConnection(self: *align(1) Self) *align(1) Connection {
return std.mem.bytesAsValue(Connection, &self.bytes); return std.mem.bytesAsValue(Connection, &self.bytes);
} }
pub fn getSaprusTypePayload(self: *align(1) Self) Error!(union(PacketType) {
relay: *align(1) Relay,
file_transfer: void,
connection: *align(1) Connection,
}) {
return switch (self.type) {
.relay => .{ .relay = self.getRelay() },
.connection => .{ .connection = self.getConnection() },
.file_transfer => Error.NotImplementedSaprusType,
else => Error.UnknownSaprusType,
};
}
}; };
test "testing variable length zero copy struct" { test "testing variable length zero copy struct" {
const gpa = std.testing.allocator; const gpa = std.testing.allocator;
const bytes = try gpa.alloc(u8, @sizeOf(ZeroCopyMessage) + 64); const bytes = try gpa.alloc(u8, @sizeOf(ZeroCopyMessage) + 64);
defer gpa.free(bytes); defer gpa.free(bytes);
// const zcm = std.mem.bytesAsValue(ZeroCopyMessage, bytes).*;
const zcm: *align(1) ZeroCopyMessage = @ptrCast(bytes.ptr); 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.type = .relay;
zcm.length = 3; zcm.length = 3;
std.debug.print("{any}\n", .{zcm}); std.debug.print("{any}\n", .{zcm});
std.debug.print("{any}\n", .{zcm.getRelay()}); std.debug.print("{any}\n", .{zcm.getSaprusTypePayload()});
std.debug.print("{any}\n", .{zcm.getConnection()}); if (false) {
std.debug.print("{x}\n", .{std.mem.asBytes(zcm.getConnection())}); std.debug.print("{any}\n", .{zcm.getRelay()});
std.debug.print("{x}\n", .{std.mem.asBytes(zcm.getRelay())}); std.debug.print("{any}\n", .{zcm.getConnection()});
std.debug.print("{x}\n", .{std.mem.asBytes(zcm.getRelay())});
std.debug.print("{x}\n", .{std.mem.asBytes(zcm.getConnection())});
}
std.debug.print("{x}\n", .{bytes}); std.debug.print("{x}\n", .{bytes});
try std.testing.expect(true); try std.testing.expect(true);