]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/client/sortlist.qc
map previews when voting, g_maplist_textonly for old style
[divverent/nexuiz.git] / data / qcsrc / client / sortlist.qc
1 .float(entity,entity) sort_cmp;
2 .entity sort_next, sort_prev;
3
4 entity Sort_New(float(entity,entity) cmp)
5 {
6         entity sort;
7         sort = spawn();
8         sort.sort_cmp = cmp;
9         sort.sort_next = NULL;
10         sort.chain = sort;
11         return sort;
12 }
13
14 void Sort_Remove(entity sort)
15 {
16         entity next;
17         while(sort.sort_next)
18         {
19                 next = sort.sort_next;
20                 remove(sort);
21                 sort = next;
22         }
23         remove(sort);
24 }
25
26 void Sort_Add(entity sort, entity ent)
27 {
28         entity next, parent;
29         parent = sort;
30         next = sort.sort_next;
31         while(next)
32         {
33                 if(!sort.sort_cmp(next, ent))
34                         break;
35                 parent = next;
36                 next = next.sort_next;
37         }
38         ent.sort_next = next;
39         ent.sort_prev = parent;
40         parent.sort_next = ent;
41         if(next)
42                 next.sort_prev = ent;
43 }
44
45 void Sort_Reset(entity sort)
46 {
47         sort.chain = sort;
48 }
49
50 float Sort_HasNext(entity sort)
51 {
52         return (sort.chain.sort_next != NULL);
53 }
54
55 entity Sort_Next(entity sort)
56 {
57         entity next;
58         next = sort.chain.sort_next;
59         if(!next) {
60                 next = spawn();
61                 sort.chain.sort_next = next;
62                 next.sort_prev = sort.chain;
63                 next.sort_next = NULL;
64         }
65         sort.chain = next;
66         return next;
67 }
68
69 void Sort_Finish(entity sort)
70 {
71         entity next;
72         next = sort.chain;
73         if(!next)
74                 return;
75
76         while(next.sort_next)
77         {
78                 sort = next.sort_next;
79                 next.sort_next = sort.sort_next;
80                 remove(sort);
81         }
82 }
83
84 entity Sort_Get(entity sort, float i)
85 {
86         for(; sort.sort_next && i > 0; --i)
87                 sort = sort.sort_next;
88         return sort;
89 }
90
91 #define SORT_SWAP(a,b) \
92         b.sort_prev = a.sort_prev;                      \
93         a.sort_next = b.sort_next;                      \
94         if(b.sort_next) b.sort_next.sort_prev = a;                      \
95         a.sort_prev.sort_next = b;                      \
96         a.sort_prev = b;                                \
97         b.sort_next = a
98
99 void Sort_Erase(entity ent)
100 {
101         ent.sort_prev.sort_next = ent.sort_next;
102         if(ent.sort_next)
103                 ent.sort_next.sort_prev = ent.sort_prev;
104         remove(ent);
105 }
106
107 void Sort_RemoveOld(entity sort)
108 {
109         entity tmp;
110         for(tmp = sort.sort_next; tmp; tmp = tmp.sort_next)
111         {
112                 if(tmp.frame < time)
113                 {
114                         tmp = tmp.sort_prev;
115                         Sort_Erase(tmp.sort_next);
116                 }
117         }
118 }