From 804204db7cf1e8a28defd359d17fa72949e13eff Mon Sep 17 00:00:00 2001 From: Nathan Reiner Date: Mon, 31 Aug 2026 23:05:16 +0200 Subject: Implement with ptrCast to make it more transparent. --- src/tuple.zig | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/tuple.zig (limited to 'src/tuple.zig') diff --git a/src/tuple.zig b/src/tuple.zig new file mode 100644 index 0000000..ba82003 --- /dev/null +++ b/src/tuple.zig @@ -0,0 +1,46 @@ +const c = @import("c"); +const zpy = @import("root.zig"); + +pub const Tuple = extern struct { + const Self = @This(); + + data: c.PyObject, + + pub fn new(length: usize) !*Self { + return @ptrCast(c.PyTuple_New(@intCast(length)) orelse return error.Exception); + } + + pub fn pack(values: []const *zpy.Object) !*Self { + var tuple = try new(values.len); + errdefer tuple.asObject().decref(); + + for (values, 0..) |value, index| { + try tuple.set(index, value); + } + + return tuple; + } + + pub fn size(self: *const Self) usize { + return c.PyTuple_GET_SIZE(self.object.ptr); + } + + pub fn get(self: *Self, index: usize) !*zpy.Object { + return @ptrCast( + c.PyTuple_GetItem( + self.object.ptr, + @intCast(index), + ) orelse return error.Exception, + ); + } + + pub fn set(self: *Self, index: usize, value: *zpy.Object) !void { + if (c.PyTuple_SetItem(@ptrCast(self), @intCast(index), @ptrCast(value)) == -1) { + return error.Exception; + } + } + + pub fn asObject(self: *Self) *zpy.Object { + return @ptrCast(self); + } +}; -- cgit v1.2.3-70-g09d2