summaryrefslogtreecommitdiff
path: root/src/zisp/gc/PairPool.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/zisp/gc/PairPool.zig')
-rw-r--r--src/zisp/gc/PairPool.zig35
1 files changed, 34 insertions, 1 deletions
diff --git a/src/zisp/gc/PairPool.zig b/src/zisp/gc/PairPool.zig
index 70b786d..8a437ae 100644
--- a/src/zisp/gc/PairPool.zig
+++ b/src/zisp/gc/PairPool.zig
@@ -1 +1,34 @@
-// TODO
+const std = @import("std");
+
+const value = @import("../value.zig");
+
+const Alloc = std.mem.Allocator;
+const PairMemPool = std.heap.MemoryPool(value.pair.Pair);
+
+const Value = value.Value;
+const PairPtr = value.pair.PairPtr;
+
+const PairPool = @This();
+
+alloc: Alloc,
+pair_pool: PairMemPool,
+
+const default_init_cap = 1024;
+
+pub fn init(alloc: Alloc) !PairPool {
+ return initCustom(alloc, default_init_cap);
+}
+
+pub fn initCustom(alloc: Alloc, init_cap: usize) !PairPool {
+ return .{
+ .alloc = alloc,
+ .pair_pool = try PairMemPool.initCapacity(alloc, init_cap),
+ };
+}
+
+pub fn cons(self: *PairPool, car: Value, cdr: Value) !PairPtr {
+ var p = try self.pair_pool.create(self.alloc);
+ p.car = car;
+ p.cdr = cdr;
+ return p;
+}