From cdc9d65b0db3e988ae0f4006e05c178312518bfb Mon Sep 17 00:00:00 2001 From: dweiller <4678790+dweiller@users.noreply.github.com> Date: Fri, 14 Jun 2024 00:18:58 +1000 Subject: [PATCH] std.priority_queue: add useful functions from ArrayList API The `ensureTotalCapacityPrecise`, `clearRetainingCapacity` and `clearAndFree` functions from the ArrayList API are also useful for a PriorityQueue. --- lib/std/priority_queue.zig | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/lib/std/priority_queue.zig b/lib/std/priority_queue.zig index a5ea649c46..c7b315afef 100644 --- a/lib/std/priority_queue.zig +++ b/lib/std/priority_queue.zig @@ -182,8 +182,14 @@ pub fn PriorityQueue(comptime T: type, comptime Context: type, comptime compareF better_capacity += better_capacity / 2 + 8; if (better_capacity >= new_capacity) break; } + try self.ensureTotalCapacityPrecise(better_capacity); + } + + pub fn ensureTotalCapacityPrecise(self: *Self, new_capacity: usize) !void { + if (self.capacity() >= new_capacity) return; + const old_memory = self.allocatedSlice(); - const new_memory = try self.allocator.realloc(old_memory, better_capacity); + const new_memory = try self.allocator.realloc(old_memory, new_capacity); self.items.ptr = new_memory.ptr; self.cap = new_memory.len; } @@ -211,6 +217,16 @@ pub fn PriorityQueue(comptime T: type, comptime Context: type, comptime compareF self.cap = new_memory.len; } + pub fn clearRetainingCapacity(self: *Self) void { + self.items.len = 0; + } + + pub fn clearAndFree(self: *Self) void { + self.allocator.free(self.allocatedSlice()); + self.items.len = 0; + self.cap = 0; + } + pub fn update(self: *Self, elem: T, new_elem: T) !void { const update_index = blk: { var idx: usize = 0;