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