Merge pull request #5050 from Kelimion/pq-err

Let `core:container/priority_queue` return `runtime.Allocator_Error`
This commit is contained in:
Jeroen van Rijn
2025-04-17 14:35:04 +02:00
committed by GitHub
@@ -1,6 +1,7 @@
package container_priority_queue package container_priority_queue
import "base:builtin" import "base:builtin"
import "base:runtime"
Priority_Queue :: struct($T: typeid) { Priority_Queue :: struct($T: typeid) {
queue: [dynamic]T, queue: [dynamic]T,
@@ -17,13 +18,14 @@ default_swap_proc :: proc($T: typeid) -> proc(q: []T, i, j: int) {
} }
} }
init :: proc(pq: ^$Q/Priority_Queue($T), less: proc(a, b: T) -> bool, swap: proc(q: []T, i, j: int), capacity := DEFAULT_CAPACITY, allocator := context.allocator) { init :: proc(pq: ^$Q/Priority_Queue($T), less: proc(a, b: T) -> bool, swap: proc(q: []T, i, j: int), capacity := DEFAULT_CAPACITY, allocator := context.allocator) -> (err: runtime.Allocator_Error) {
if pq.queue.allocator.procedure == nil { if pq.queue.allocator.procedure == nil {
pq.queue.allocator = allocator pq.queue.allocator = allocator
} }
reserve(pq, capacity) reserve(pq, capacity) or_return
pq.less = less pq.less = less
pq.swap = swap pq.swap = swap
return .None
} }
init_from_dynamic_array :: proc(pq: ^$Q/Priority_Queue($T), queue: [dynamic]T, less: proc(a, b: T) -> bool, swap: proc(q: []T, i, j: int)) { init_from_dynamic_array :: proc(pq: ^$Q/Priority_Queue($T), queue: [dynamic]T, less: proc(a, b: T) -> bool, swap: proc(q: []T, i, j: int)) {
@@ -41,8 +43,8 @@ destroy :: proc(pq: ^$Q/Priority_Queue($T)) {
delete(pq.queue) delete(pq.queue)
} }
reserve :: proc(pq: ^$Q/Priority_Queue($T), capacity: int) { reserve :: proc(pq: ^$Q/Priority_Queue($T), capacity: int) -> (err: runtime.Allocator_Error) {
builtin.reserve(&pq.queue, capacity) return builtin.reserve(&pq.queue, capacity)
} }
clear :: proc(pq: ^$Q/Priority_Queue($T)) { clear :: proc(pq: ^$Q/Priority_Queue($T)) {
builtin.clear(&pq.queue) builtin.clear(&pq.queue)
@@ -103,9 +105,10 @@ fix :: proc(pq: ^$Q/Priority_Queue($T), i: int) {
} }
} }
push :: proc(pq: ^$Q/Priority_Queue($T), value: T) { push :: proc(pq: ^$Q/Priority_Queue($T), value: T) -> (err: runtime.Allocator_Error) {
append(&pq.queue, value) append(&pq.queue, value) or_return
_shift_up(pq, builtin.len(pq.queue)-1) _shift_up(pq, builtin.len(pq.queue)-1)
return .None
} }
pop :: proc(pq: ^$Q/Priority_Queue($T), loc := #caller_location) -> (value: T) { pop :: proc(pq: ^$Q/Priority_Queue($T), loc := #caller_location) -> (value: T) {