const c = @import("c"); const zpy = @import("root.zig"); const conversion = zpy.conversion; const Self = @This(); object: zpy.Object, pub fn new(length: usize) !Self { return .{ .object = .fromPtr(try conversion.Ptr(c.PyTuple_New(@intCast(length)))), }; } pub fn pack(values: []const zpy.Object) !Self { var tuple = try new(values.len); errdefer tuple.object.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.Error!zpy.Object { return .fromPtr(conversion.Ptr(c.PyTuple_GetItem(self.object.ptr, @intCast(index))) catch return error.IndexError); } pub fn set(self: *Self, index: usize, value: zpy.Object) zpy.Error!void { conversion.success(c.PyTuple_SetItem(self.object.ptr, @intCast(index), value.ptr)) catch return error.IndexError; }