6void List_Init(
List *list, u16 offset) {
7 list->headObject =
nullptr;
8 list->tailObject =
nullptr;
10 list->offset = offset;
13void List_Append(
List *list,
void *obj) {
16 if (list->headObject ==
nullptr) {
17 Link *node = NW4R_UT_LIST_GET_LINK(*list, obj);
18 node->nextObject =
nullptr;
19 node->prevObject =
nullptr;
20 list->headObject = obj;
21 list->tailObject = obj;
25 Link *node = NW4R_UT_LIST_GET_LINK(*list, obj);
26 node->prevObject = list->tailObject;
27 node->nextObject =
nullptr;
30 NW4R_UT_LIST_GET_LINK(*list, list->tailObject)->nextObject = obj;
33 list->tailObject = obj;
38void List_Prepend(
List *list,
void *obj) {
41 if (list->headObject ==
nullptr) {
42 Link *node = NW4R_UT_LIST_GET_LINK(*list, obj);
43 node->nextObject =
nullptr;
44 node->prevObject =
nullptr;
45 list->headObject = obj;
46 list->tailObject = obj;
50 Link *node = NW4R_UT_LIST_GET_LINK(*list, obj);
51 node->prevObject =
nullptr;
52 node->nextObject = list->headObject;
55 NW4R_UT_LIST_GET_LINK(*list, list->headObject)->prevObject = obj;
58 list->headObject = obj;
63void List_Insert(
List *list,
void *target,
void *obj) {
67 if (target ==
nullptr) {
68 List_Append(list, obj);
70 }
else if (target == list->headObject) {
71 List_Prepend(list, obj);
74 Link *node = NW4R_UT_LIST_GET_LINK(*list, obj);
75 void *prevObj = NW4R_UT_LIST_GET_LINK(*list, target)->prevObject;
76 Link *prevNode = NW4R_UT_LIST_GET_LINK(*list, prevObj);
79 node->prevObject = prevObj;
80 node->nextObject = target;
83 prevNode->nextObject = obj;
84 NW4R_UT_LIST_GET_LINK(*list, target)->prevObject = obj;
91void List_Remove(
List *list,
void *obj) {
92 Link *node = NW4R_UT_LIST_GET_LINK(*list, obj);
96 if (node->prevObject ==
nullptr) {
97 list->headObject = node->nextObject;
99 NW4R_UT_LIST_GET_LINK(*list, node->prevObject)->nextObject = node->nextObject;
104 if (node->nextObject ==
nullptr) {
105 list->tailObject = node->prevObject;
107 NW4R_UT_LIST_GET_LINK(*list, node->nextObject)->prevObject = node->prevObject;
111 node->prevObject =
nullptr;
112 node->nextObject =
nullptr;
118void *List_GetNext(
const List *list,
const void *obj) {
119 if (obj ==
nullptr) {
120 return list->headObject;
123 return NW4R_UT_LIST_GET_LINK(*list, obj)->nextObject;
126void *List_GetPrev(
const List *list,
const void *obj) {
127 if (obj ==
nullptr) {
128 return list->tailObject;
131 return NW4R_UT_LIST_GET_LINK(*list, obj)->prevObject;