4 CLASS(LinkedListNode, Object)
5 ATTRIB(LinkedListNode, ll_data, entity, NULL)
6 ATTRIB(LinkedListNode, ll_prev, LinkedListNode, NULL)
7 ATTRIB(LinkedListNode, ll_next, LinkedListNode, NULL)
8 ENDCLASS(LinkedListNode)
10 CLASS(LinkedList, Object)
11 ATTRIB(LinkedList, ll_head, LinkedListNode, NULL);
12 ATTRIB(LinkedList, ll_tail, LinkedListNode, NULL);
15 #define LL_NEW() NEW(LinkedList)
20 entity LL_PUSH(LinkedList this, entity e) {
21 LinkedListNode n = NEW(LinkedListNode);
23 n.ll_prev = this.ll_tail;
24 LinkedListNode tail = this.ll_tail;
28 this.ll_head = this.ll_tail = n;
36 entity LL_POP(LinkedList this) {
37 if (!this.ll_tail) return NULL;
38 LinkedListNode n = this.ll_tail;
40 LinkedListNode prev = n.ll_prev;
44 this.ll_head = this.ll_tail = NULL;
49 #define LL_EACH(list, cond, body) do { \
51 for (entity _it = list.ll_head; _it; (_it = _it.ll_next, ++i)) { \
52 noref entity it = _it.ll_data; \