From 638a1529a30c4dbcf54b4e65b7f9c8fa034cba1c Mon Sep 17 00:00:00 2001 From: Feoramund <161657516+Feoramund@users.noreply.github.com> Date: Wed, 11 Jun 2025 11:36:57 -0400 Subject: container/queue: Add `shrink` --- core/container/queue/queue.odin | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'core/container/queue/queue.odin') diff --git a/core/container/queue/queue.odin b/core/container/queue/queue.odin index 7e3e18075..5c7369a50 100644 --- a/core/container/queue/queue.odin +++ b/core/container/queue/queue.odin @@ -121,6 +121,33 @@ reserve :: proc(q: ^$Q/Queue($T), capacity: int) -> runtime.Allocator_Error { return nil } +/* +Shrink a queue's dynamically allocated array. + +This has no effect if the queue was initialized with a backing slice. +*/ +shrink :: proc(q: ^$Q/Queue($T), temp_allocator := context.temp_allocator, loc := #caller_location) { + if q.data.allocator.procedure == runtime.nil_allocator_proc { + return + } + + if q.len > 0 && q.offset > 0 { + // Make the array contiguous again. + buffer := make([]T, q.len, temp_allocator) + defer delete(buffer, temp_allocator) + + right := uint(builtin.len(q.data)) - q.offset + copy(buffer[:], q.data[q.offset:]) + copy(buffer[right:], q.data[:q.offset]) + + copy(q.data[:], buffer[:]) + + q.offset = 0 + } + + builtin.shrink(&q.data, q.len, loc) +} + /* Get the element at index `i`. -- cgit v1.2.3