Add forgotten files 1.4.70b
[polyglot.git] / list.cpp
1 \r
2 // list.cpp\r
3 \r
4 // includes\r
5 \r
6 #include "board.h"\r
7 #include "list.h"\r
8 #include "move.h"\r
9 #include "util.h"\r
10 \r
11 // functions\r
12 \r
13 // list_is_ok()\r
14 \r
15 bool list_is_ok(const list_t * list) {\r
16 \r
17    if (list == NULL) return false;\r
18 \r
19    if (list->size >= ListSize) return false;\r
20 \r
21    return true;\r
22 }\r
23 \r
24 // list_clear()\r
25 \r
26 void list_clear(list_t * list) {\r
27 \r
28    ASSERT(list!=NULL);\r
29 \r
30    list->size = 0;\r
31 }\r
32 \r
33 // list_add()\r
34 \r
35 void list_add(list_t * list, int move, int value) {\r
36 \r
37    ASSERT(list_is_ok(list));\r
38    ASSERT(move_is_ok(move));\r
39    ASSERT(value>=-32767&&value<=+32767);\r
40 \r
41    ASSERT(list->size<ListSize-1);\r
42 \r
43    list->move[list->size] = move;\r
44    list->value[list->size] = value;\r
45    list->size++;\r
46 }\r
47 \r
48 // list_remove()\r
49 \r
50 void list_remove(list_t * list, int index) {\r
51 \r
52    int i;\r
53 \r
54    ASSERT(list_is_ok(list));\r
55    ASSERT(index>=0&&index<list->size);\r
56 \r
57    for (i = index; i < list->size-1; i++) {\r
58       list->move[i] = list->move[i+1];\r
59       list->value[i] = list->value[i+1];\r
60    }\r
61 \r
62    list->size--;\r
63 }\r
64 \r
65 // list_is_empty()\r
66 \r
67 bool list_is_empty(const list_t * list) {\r
68 \r
69    ASSERT(list_is_ok(list));\r
70 \r
71    return list->size == 0;\r
72 }\r
73 \r
74 // list_size()\r
75 \r
76 int list_size(const list_t * list) {\r
77 \r
78    ASSERT(list_is_ok(list));\r
79 \r
80    return list->size;\r
81 }\r
82 \r
83 // list_move()\r
84 \r
85 int list_move(const list_t * list, int index) {\r
86 \r
87    ASSERT(list_is_ok(list));\r
88    ASSERT(index>=0&&index<list->size);\r
89 \r
90    return list->move[index];\r
91 }\r
92 \r
93 // list_value()\r
94 \r
95 int list_value(const list_t * list, int index) {\r
96 \r
97    ASSERT(list_is_ok(list));\r
98    ASSERT(index>=0&&index<list->size);\r
99 \r
100    return list->value[index];\r
101 }\r
102 \r
103 // list_copy()\r
104 \r
105 void list_copy(list_t * dst, const list_t * src) {\r
106 \r
107    int i;\r
108 \r
109    ASSERT(dst!=NULL);\r
110    ASSERT(list_is_ok(src));\r
111 \r
112    dst->size = src->size;\r
113 \r
114    for (i = 0; i < src->size; i++) {\r
115       dst->move[i] = src->move[i];\r
116       dst->value[i] = src->value[i];\r
117    }\r
118 }\r
119 \r
120 // list_move_to_front()\r
121 \r
122 void list_move_to_front(list_t * list, int index) {\r
123 \r
124    int i;\r
125    int move, value;\r
126 \r
127    ASSERT(list_is_ok(list));\r
128    ASSERT(index>=0&&index<list->size);\r
129 \r
130    if (index != 0) {\r
131 \r
132       move = list->move[index];\r
133       value = list->value[index];\r
134 \r
135       for (i = index; i > 0; i--) {\r
136          list->move[i] = list->move[i-1];\r
137          list->value[i] = list->value[i-1];\r
138       }\r
139 \r
140       list->move[0] = move;\r
141       list->value[0] = value;\r
142    }\r
143 }\r
144 \r
145 // list_note()\r
146 \r
147 void list_note(list_t * list) {\r
148 \r
149    int i, move;\r
150 \r
151    ASSERT(list_is_ok(list));\r
152 \r
153    for (i = 0; i < list->size; i++) {\r
154       move = list->move[i];\r
155       ASSERT(move_is_ok(move));\r
156       list->value[i] = -move_order(move);\r
157    }\r
158 }\r
159 \r
160 // list_sort()\r
161 \r
162 void list_sort(list_t * list) {\r
163 \r
164    int i, j;\r
165    int best_index, best_move, best_value;\r
166 \r
167    ASSERT(list_is_ok(list));\r
168 \r
169    for (i = 0; i < list->size-1; i++) {\r
170 \r
171       best_index = i;\r
172       best_value = list->value[i];\r
173 \r
174       for (j = i+1; j < list->size; j++) {\r
175          if (list->value[j] > best_value) {\r
176             best_index = j;\r
177             best_value = list->value[j];\r
178          }\r
179       }\r
180 \r
181       if (best_index != i) {\r
182 \r
183          best_move = list->move[best_index];\r
184          ASSERT(best_value==list->value[best_index]);\r
185 \r
186          for (j = best_index; j > i; j--) {\r
187             list->move[j] = list->move[j-1];\r
188             list->value[j] = list->value[j-1];\r
189          }\r
190 \r
191          list->move[i] = best_move;\r
192          list->value[i] = best_value;\r
193       }\r
194    }\r
195 \r
196    if (DEBUG) {\r
197       for (i = 0; i < list->size-1; i++) {\r
198          ASSERT(list->value[i]>=list->value[i+1]);\r
199       }\r
200    }\r
201 }\r
202 \r
203 // list_contain()\r
204 \r
205 bool list_contain(const list_t * list, int move) {\r
206 \r
207    int i;\r
208 \r
209    ASSERT(list_is_ok(list));\r
210    ASSERT(move_is_ok(move));\r
211 \r
212    for (i = 0; i < list->size; i++) {\r
213       if (list->move[i] == move) return true;\r
214    }\r
215 \r
216    return false;\r
217 }\r
218 \r
219 // list_equal()\r
220 \r
221 bool list_equal(list_t * list_1, list_t * list_2) {\r
222 \r
223    list_t copy_1[1], copy_2[1];\r
224    int i;\r
225 \r
226    ASSERT(list_is_ok(list_1));\r
227    ASSERT(list_is_ok(list_2));\r
228 \r
229    if (list_1->size != list_2->size) return false;\r
230 \r
231    list_copy(copy_1,list_1);\r
232    list_note(copy_1);\r
233    list_sort(copy_1);\r
234 \r
235    list_copy(copy_2,list_2);\r
236    list_note(copy_2);\r
237    list_sort(copy_2);\r
238 \r
239    for (i = 0; i < copy_1->size; i++) {\r
240       if (copy_1->move[i] != copy_2->move[i]) return false;\r
241    }\r
242 \r
243    return true;\r
244 }\r
245 \r
246 // list_disp()\r
247 \r
248 void list_disp(const list_t * list, const board_t * board) {\r
249 \r
250    int i, move, value;\r
251    char string[256];\r
252 \r
253    ASSERT(list_is_ok(list));\r
254    ASSERT(board_is_ok(board));\r
255 \r
256    for (i = 0; i < list->size; i++) {\r
257 \r
258       move = list->move[i];\r
259       value = list->value[i];\r
260 \r
261       if (!move_to_can(move,board,string,256)) ASSERT(false);\r
262       my_log("POLYGLOT %-5s %04X %+4d\n",string,move,value);\r
263    }\r
264 \r
265    my_log("POLYGLOT\n");\r
266 }\r
267 \r
268 // end of list.cpp\r
269 \r