From c7f77523c4b7c86b625149ef7fde76257f6fcf51 Mon Sep 17 00:00:00 2001 From: Matthew Date: Sat, 6 Sep 2025 15:10:54 +1000 Subject: [PATCH] update stack (again) --- util.d | 64 +++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 46 insertions(+), 18 deletions(-) diff --git a/util.d b/util.d index 6cc4411..6c91a09 100644 --- a/util.d +++ b/util.d @@ -199,15 +199,30 @@ DLLPush(T, U)(T* list, U* node, U* nil) struct Stack(T) { Node!(T)* top; + Node!(T)* free; + Node!(T)* nil; } void -SPush(T)(Stack!(T)* stack, Node!(T)* node, Node!(T)* nil) +SPush(T)(Arena* arena, Stack!(T)* stack, T value) { - if (CheckNil(nil, stack.top)) + Node!(T)* node; + if (!CheckNil(stack.nil, stack.free)) + { + node = stack.free; + stack.free = node.next; + } + else + { + node = Alloc!(Node!(T))(arena); + } + + node.value = value; + + if (CheckNil(stack.nil, stack.top)) { stack.top = node; - node.next = nil; + node.next = stack.nil; } else { @@ -216,15 +231,22 @@ SPush(T)(Stack!(T)* stack, Node!(T)* node, Node!(T)* nil) } } -Node!(T)* -SPop(T)(Stack!(T)* stack, Node!(T)* nil) +T +SPop(T)(Stack!(T)* stack) { - Node!(T)* node = stack.top; - if (!CheckNil(nil, stack.top)) + T result; + + if (!CheckNil(stack.nil, stack.top)) { - stack.top = stack.top.next; + result = stack.top.value; + + Node!(T)* free_node = stack.top; + stack.top = free_node.next; + free_node.next = stack.free; + stack.free = free_node; } - return node; + + return result; } struct Node(T) @@ -967,13 +989,19 @@ unittest { // Stack Stack!(u32) stack; - Node!(u32) n1 = { value: 1 }; - Node!(u32) n2 = { value: 2 }; - Node!(u32) n3 = { value: 3 }; + Arena arena = CreateArena(MB(1)); - SPush(&stack, &n1, null); - SPush(&stack, &n2, null); - SPush(&stack, &n3, null); + u32 v1 = 1; + u32 v2 = 2; + u32 v3 = 3; + + Node!(u32) nil; + + stack.nil = &nil; + + SPush(&arena, &stack, v1); + SPush(&arena, &stack, v2); + SPush(&arena, &stack, v3); u32 count = 3; for (auto n = stack.top; !CheckNil(null, n); n = n.next, count -= 1) @@ -982,11 +1010,11 @@ unittest } count = 3; - for (auto n = SPop(&stack, cast(Node!(u32)*)null); !CheckNil(null, n); n = SPop(&stack, cast(Node!(u32)*)null), count -= 1) + for (u32 n = SPop(&stack); n != 0; n = SPop(&stack), count -= 1) { - assert(n.value == count); + assert(n == count); } - assert(stack.top == null); + assert(stack.top == &nil); } }