1 //.float(entity,entity) sort_cmp;
\r
2 .entity sort_next, sort_prev;
\r
8 sort.sort_next = NULL;
\r
13 entity Sort_New(float(entity,entity) cmp)
\r
17 sort.sort_cmp = cmp;
\r
18 sort.sort_next = NULL;
\r
23 void Sort_Remove(entity sort)
\r
26 while(sort.sort_next)
\r
28 next = sort.sort_next;
\r
35 void Sort_Add(entity sort, entity ent)
\r
37 entity next, parent;
\r
39 next = sort.sort_next;
\r
42 if(!sort.sort_cmp(next, ent))
\r
45 next = next.sort_next;
\r
47 ent.sort_next = next;
\r
48 ent.sort_prev = parent;
\r
49 parent.sort_next = ent;
\r
51 next.sort_prev = ent;
\r
54 void Sort_Reset(entity sort)
\r
59 float Sort_HasNext(entity sort)
\r
61 return (sort.chain.sort_next != NULL);
\r
64 entity Sort_Next(entity sort)
\r
67 next = sort.chain.sort_next;
\r
70 sort.chain.sort_next = next;
\r
71 next.sort_prev = sort.chain;
\r
72 next.sort_next = NULL;
\r
78 void Sort_Finish(entity sort)
\r
85 while(next.sort_next)
\r
87 sort = next.sort_next;
\r
88 next.sort_next = sort.sort_next;
\r
93 entity Sort_Get(entity sort, float i)
\r
95 for(; sort.sort_next && i > 0; --i)
\r
96 sort = sort.sort_next;
\r
102 * Swap two neighbours in a sortlist.
\r
103 * @param a FIRST entity
\r
104 * @param b entity after a
\r
106 #define SORT_SWAP(a,b) \
\r
107 b.sort_prev = a.sort_prev; \
\r
108 a.sort_next = b.sort_next; \
\r
109 if(b.sort_next) b.sort_next.sort_prev = a; \
\r
110 if(a.sort_prev) a.sort_prev.sort_next = b; \
\r
115 void Sort_Erase(entity ent)
\r
117 ent.sort_prev.sort_next = ent.sort_next;
\r
119 ent.sort_next.sort_prev = ent.sort_prev;
\r
123 void Sort_RemoveOld(entity sort)
\r
126 for(tmp = sort.sort_next; tmp; tmp = tmp.sort_next)
\r
128 if(tmp.frame < time)
\r
130 tmp = tmp.sort_prev;
\r
131 Sort_Erase(tmp.sort_next);
\r