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");
PushFront(&arena.pools, node, null);
SLLPushFront(&arena.pools, node, null);
}
T[]

View File

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

86
util.d
View File

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