aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/pool.zig25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/pool.zig b/src/pool.zig
index 158214e4b..7894a5758 100644
--- a/src/pool.zig
+++ b/src/pool.zig
@@ -154,6 +154,31 @@ pub fn ObjectPool(
pub fn has() bool {
return data().loaded and data().list.first != null;
}
+
+ pub fn push(allocator: std.mem.Allocator, pooled: Type) void {
+ if (comptime @import("./env.zig").allow_assert)
+ std.debug.assert(!full());
+
+ var new_node = allocator.create(LinkedList.Node) catch unreachable;
+ new_node.* = LinkedList.Node{
+ .allocator = allocator,
+ .data = pooled,
+ };
+ release(new_node);
+ }
+
+ pub fn getIfExists() ?*LinkedList.Node {
+ if (!data().loaded) {
+ return null;
+ }
+
+ var node = data().list.popFirst() orelse return null;
+ if (comptime std.meta.trait.isContainer(Type) and @hasDecl(Type, "reset")) node.data.reset();
+ if (comptime max_count > 0) data().count -|= 1;
+
+ return node;
+ }
+
pub fn get(allocator: std.mem.Allocator) *LinkedList.Node {
if (data().loaded) {
if (data().list.popFirst()) |node| {