This commit is contained in:
2025-04-27 18:06:11 -04:00
parent 1731b2e643
commit eacfaffb6b
3 changed files with 61 additions and 4 deletions

View File

@@ -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());
}