summaryrefslogtreecommitdiff
path: root/src/Int.zig
diff options
context:
space:
mode:
authorNathan Reiner <nathan@nathanreiner.xyz>2026-08-28 17:44:38 +0200
committerNathan Reiner <nathan@nathanreiner.xyz>2026-08-28 17:44:38 +0200
commit956cd84ca545f1d93e2218cbbdbb39c81a46bec8 (patch)
tree21e865b4af06acce77a0623ea5dd3a661306f21e /src/Int.zig
parentdf52109ff18ff354e4c0d1b003bc1a0a42c42b54 (diff)
implement other builtins
Diffstat (limited to 'src/Int.zig')
-rw-r--r--src/Int.zig41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/Int.zig b/src/Int.zig
new file mode 100644
index 0000000..bd13e99
--- /dev/null
+++ b/src/Int.zig
@@ -0,0 +1,41 @@
+const std = @import("std");
+const c = @import("c");
+
+const zpy = @import("root.zig");
+const conversion = zpy.conversion;
+
+const Self = @This();
+
+object: zpy.Object,
+
+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 .{
+ .object = .fromPtr(try conversion.ptr(result)),
+ };
+}
+
+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 deinit(self: *Self) void {
+ self.object.decref();
+}