diff options
Diffstat (limited to 'src/message.zig')
-rw-r--r-- | src/message.zig | 57 |
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()); +} |