make linked lists more generic

This commit is contained in:
Matthew 2025-08-31 08:01:02 +10:00
parent 263cd8435d
commit 7781744031
3 changed files with 33 additions and 59 deletions

View File

@ -91,7 +91,7 @@ AddArenaPool(Arena* arena)
assert(node.value.mem != null, "Unable to allocate memory for arena"); assert(node.value.mem != null, "Unable to allocate memory for arena");
PushFront(&arena.pools, node, null); SLLPushFront(&arena.pools, node, null);
} }
T[] T[]

View File

@ -94,7 +94,7 @@ Push(Inputs* inputs, Input input, bool pressed)
node.value.key = input; node.value.key = input;
node.value.pressed = pressed; node.value.pressed = pressed;
PushFront(&inputs.list, node, null); DLLPushFront(&inputs.list, node, null);
} }
void void
@ -107,7 +107,7 @@ Push(Inputs* inputs, i32 rel_x, i32 rel_y, u16 x, u16 y)
node.value.x = x; node.value.x = x;
node.value.y = y; node.value.y = y;
PushFront(&inputs.list, node, null); DLLPushFront(&inputs.list, node, null);
} }
struct PlatformWindow struct PlatformWindow

86
util.d
View File

@ -98,14 +98,8 @@ struct DLList(T)
DNode!(T)* last; DNode!(T)* last;
} }
pragma(inline) bool
CheckNil(T)(DNode!(T)* nil, DNode!(T)* node)
{
return node == null || node == nil;
}
void void
ConcatInPlace(T)(DLList!(T)* list, DLList!(T)* to_concat) ConcatInPlace(T)(T* list, T* to_concat)
{ {
if (to_concat.first) if (to_concat.first)
{ {
@ -120,18 +114,18 @@ ConcatInPlace(T)(DLList!(T)* list, DLList!(T)* to_concat)
list.last = to_concat.last; list.last = to_concat.last;
} }
memset(to_concat, 0, DLList!(T).sizeof); memset(to_concat, 0, T.sizeof);
} }
} }
DNode!(T)* U*
Pop(T)(DLList!(T)* list, DNode!(T)* nil) SLLPop(T, U)(T* list, T* nil)
{ {
DNode!(T)* node = list.first; U* node = list.first;
if (list.first == list.last) if (list.first == list.last)
{ {
list.first = list.last = nil; list.first = list.last = list.nil;
} }
else else
{ {
@ -143,7 +137,7 @@ Pop(T)(DLList!(T)* list, DNode!(T)* nil)
} }
void void
Remove(T)(DLList!(T)* list, DNode!(T)* node, DNode!(T)* nil) DLLRemove(T, U)(T* list, U* node, U* nil)
{ {
if (list.first == list.last) if (list.first == list.last)
{ {
@ -169,7 +163,7 @@ Remove(T)(DLList!(T)* list, DNode!(T)* node, DNode!(T)* nil)
} }
void void
PushFront(T)(DLList!(T)* list, DNode!(T)* node, DNode!(T)* nil) DLLPushFront(T, U)(T* list, U* node, U* nil)
{ {
if (CheckNil(nil, list.first)) if (CheckNil(nil, list.first))
{ {
@ -186,7 +180,7 @@ PushFront(T)(DLList!(T)* list, DNode!(T)* node, DNode!(T)* nil)
} }
void void
Push(T)(DLList!(T)* list, DNode!(T)* node, DNode!(T)* nil) DLLPush(T, U)(T* list, U* node, U* nil)
{ {
if (CheckNil(nil, list.first)) if (CheckNil(nil, list.first))
{ {
@ -215,35 +209,15 @@ struct SLList(T)
} }
pragma(inline) bool pragma(inline) bool
CheckNil(T)(Node!(T)* nil, Node!(T)* node) CheckNil(T)(T* nil, T* node)
{ {
return node == null || node == nil; return node == null || node == nil;
} }
void pragma(inline) U*
ConcatInPlace(T)(SLList!(T)* list, SLList!(T)* to_concat) SLLPop(T, U)(T* list, U* nil)
{ {
if (to_concat.first) U* node = list.first;
{
if (list.first)
{
list.last.next = to_concat.first;
list.last = to_concat.last;
}
else
{
list.first = to_concat.first;
list.last = to_concat.last;
}
memset(to_concat, 0, SLList!(T).sizeof);
}
}
pragma(inline) Node!(T)*
Pop(T)(SLList!(T)*list, Node!(T)* nil)
{
Node!(T)* node = list.first;
if (list.first == list.last) if (list.first == list.last)
{ {
@ -258,7 +232,7 @@ Pop(T)(SLList!(T)*list, Node!(T)* nil)
} }
pragma(inline) void pragma(inline) void
Remove(T)(SLList!(T)* list, Node!(T)* node, Node!(T)* prev, Node!(T)* nil) SLLRemove(T, U)(T* list, U* node, U* prev, U* nil)
{ {
if (list.first == list.last) if (list.first == list.last)
{ {
@ -282,7 +256,7 @@ Remove(T)(SLList!(T)* list, Node!(T)* node, Node!(T)* prev, Node!(T)* nil)
} }
pragma(inline) void pragma(inline) void
PushFront(T)(SLList!(T)* list, Node!(T)* node, Node!(T)* nil) SLLPushFront(T, U)(T* list, U* node, U* nil)
{ {
if (CheckNil(nil, list.first)) if (CheckNil(nil, list.first))
{ {
@ -297,7 +271,7 @@ PushFront(T)(SLList!(T)* list, Node!(T)* node, Node!(T)* nil)
} }
pragma(inline) void pragma(inline) void
Push(T)(SLList!(T)* list, Node!(T)* node, Node!(T)* nil) SLLPush(T, U)(T* list, U* node, U* nil)
{ {
if (CheckNil(nil, list.first)) if (CheckNil(nil, list.first))
{ {
@ -760,14 +734,14 @@ unittest
foreach(u32 i, n; nodes) foreach(u32 i, n; nodes)
{ {
nodes[i].value = i; nodes[i].value = i;
Push(&list, &nodes[i], null); SLLPush(&list, &nodes[i], null);
} }
u32 count = 0; u32 count = 0;
u32[3] res1 = [0, 2, 4]; u32[3] res1 = [0, 2, 4];
Remove(&list, &nodes[1], &nodes[0], null); SLLRemove(&list, &nodes[1], &nodes[0], null);
Remove(&list, &nodes[3], &nodes[2], null); SLLRemove(&list, &nodes[3], &nodes[2], null);
Node!(u32)* n = list.first; Node!(u32)* n = list.first;
@ -798,15 +772,15 @@ unittest
count = 0; count = 0;
u32[5] res2 = [3, 0, 2, 4, 1]; u32[5] res2 = [3, 0, 2, 4, 1];
PushFront(&list, &nodes[3], null); SLLPushFront(&list, &nodes[3], null);
Push(&list, &nodes[1], null); SLLPush(&list, &nodes[1], null);
TestSLList(&list, res2); TestSLList(&list, res2);
count = 0; count = 0;
Remove(&list, &nodes[3], null, null); SLLRemove(&list, &nodes[3], null, null);
Remove(&list, &nodes[1], &nodes[4], null); SLLRemove(&list, &nodes[1], &nodes[4], null);
TestSLList(&list, res1); TestSLList(&list, res1);
} }
@ -860,7 +834,7 @@ unittest
foreach(u32 i, n; nodes) foreach(u32 i, n; nodes)
{ {
nodes[i].value = i; nodes[i].value = i;
Push(&list, &nodes[i], null); DLLPush(&list, &nodes[i], null);
} }
assert(list.first != null && list.last != null); assert(list.first != null && list.last != null);
@ -870,21 +844,21 @@ unittest
u32 count = 0; u32 count = 0;
u32[3] res1 = [0, 2, 4]; u32[3] res1 = [0, 2, 4];
Remove(&list, &nodes[1], null); DLLRemove(&list, &nodes[1], null);
Remove(&list, &nodes[3], null); DLLRemove(&list, &nodes[3], null);
TestDLList(&list, res1); TestDLList(&list, res1);
count = 0; count = 0;
u32[5] res2 = [3, 0, 2, 4, 1]; u32[5] res2 = [3, 0, 2, 4, 1];
PushFront(&list, &nodes[3], null); DLLPushFront(&list, &nodes[3], null);
Push(&list, &nodes[1], null); DLLPush(&list, &nodes[1], null);
TestDLList(&list, res2); TestDLList(&list, res2);
Remove(&list, &nodes[3], null); DLLRemove(&list, &nodes[3], null);
Remove(&list, &nodes[1], null); DLLRemove(&list, &nodes[1], null);
TestDLList(&list, res1); TestDLList(&list, res1);
} }