diff options
Diffstat (limited to 'src/int.zig')
| -rw-r--r-- | src/int.zig | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/src/int.zig b/src/int.zig new file mode 100644 index 0000000..d5e7589 --- /dev/null +++ b/src/int.zig @@ -0,0 +1,40 @@ +const std = @import("std"); +const c = @import("c"); + +const zpy = @import("root.zig"); + +pub const Int = extern struct { + const Self = @This(); + + data: c.PyObject, + + pub fn from(value: anytype) !*Self { + const T = @TypeOf(value); + const result = switch (@typeInfo(T)) { + .int => |i| switch (i.signedness) { + .signed => c.PyLong_FromLong(value), + .unsigned => c.PyLong_FromUnsignedLong(value), + }, + .comptime_int => c.PyLong_FromLong(value), + .float => c.PyLong_FromDouble(value), + else => @compileError("value must be numberic."), + }; + + return @ptrCast(result orelse return error.Exception); + } + + pub fn as(self: *const Self, T: type) T { + return switch(@typeInfo(T)) { + .int => |i| switch (i) { + .signed => c.PyLong_AsLong(self.object.ptr), + .unsigned => c.PyLong_AsUnsignedLong(self.object.ptr), + }, + .float => c.PyLong_AsDouble(self.object.ptr), + else => @compileError("value must be numberic."), + }; + } + + pub fn asObject(self: *Self) *zpy.Object { + return @ptrCast(self); + } +}; |