make linked lists more generic
This commit is contained in:
parent
263cd8435d
commit
7781744031
2
alloc.d
2
alloc.d
@ -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[]
|
||||||
|
|||||||
@ -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
86
util.d
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user