15 bool list_is_ok(const list_t * list) {
\r
17 if (list == NULL) return false;
\r
19 if (list->size >= ListSize) return false;
\r
26 void list_clear(list_t * list) {
\r
35 void list_add(list_t * list, int move, int value) {
\r
37 ASSERT(list_is_ok(list));
\r
38 ASSERT(move_is_ok(move));
\r
39 ASSERT(value>=-32767&&value<=+32767);
\r
41 ASSERT(list->size<ListSize-1);
\r
43 list->move[list->size] = move;
\r
44 list->value[list->size] = value;
\r
50 void list_remove(list_t * list, int index) {
\r
54 ASSERT(list_is_ok(list));
\r
55 ASSERT(index>=0&&index<list->size);
\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
67 bool list_is_empty(const list_t * list) {
\r
69 ASSERT(list_is_ok(list));
\r
71 return list->size == 0;
\r
76 int list_size(const list_t * list) {
\r
78 ASSERT(list_is_ok(list));
\r
85 int list_move(const list_t * list, int index) {
\r
87 ASSERT(list_is_ok(list));
\r
88 ASSERT(index>=0&&index<list->size);
\r
90 return list->move[index];
\r
95 int list_value(const list_t * list, int index) {
\r
97 ASSERT(list_is_ok(list));
\r
98 ASSERT(index>=0&&index<list->size);
\r
100 return list->value[index];
\r
105 void list_copy(list_t * dst, const list_t * src) {
\r
110 ASSERT(list_is_ok(src));
\r
112 dst->size = src->size;
\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
120 // list_move_to_front()
\r
122 void list_move_to_front(list_t * list, int index) {
\r
127 ASSERT(list_is_ok(list));
\r
128 ASSERT(index>=0&&index<list->size);
\r
132 move = list->move[index];
\r
133 value = list->value[index];
\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
140 list->move[0] = move;
\r
141 list->value[0] = value;
\r
147 void list_note(list_t * list) {
\r
151 ASSERT(list_is_ok(list));
\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
162 void list_sort(list_t * list) {
\r
165 int best_index, best_move, best_value;
\r
167 ASSERT(list_is_ok(list));
\r
169 for (i = 0; i < list->size-1; i++) {
\r
172 best_value = list->value[i];
\r
174 for (j = i+1; j < list->size; j++) {
\r
175 if (list->value[j] > best_value) {
\r
177 best_value = list->value[j];
\r
181 if (best_index != i) {
\r
183 best_move = list->move[best_index];
\r
184 ASSERT(best_value==list->value[best_index]);
\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
191 list->move[i] = best_move;
\r
192 list->value[i] = best_value;
\r
197 for (i = 0; i < list->size-1; i++) {
\r
198 ASSERT(list->value[i]>=list->value[i+1]);
\r
205 bool list_contain(const list_t * list, int move) {
\r
209 ASSERT(list_is_ok(list));
\r
210 ASSERT(move_is_ok(move));
\r
212 for (i = 0; i < list->size; i++) {
\r
213 if (list->move[i] == move) return true;
\r
221 bool list_equal(list_t * list_1, list_t * list_2) {
\r
223 list_t copy_1[1], copy_2[1];
\r
226 ASSERT(list_is_ok(list_1));
\r
227 ASSERT(list_is_ok(list_2));
\r
229 if (list_1->size != list_2->size) return false;
\r
231 list_copy(copy_1,list_1);
\r
235 list_copy(copy_2,list_2);
\r
239 for (i = 0; i < copy_1->size; i++) {
\r
240 if (copy_1->move[i] != copy_2->move[i]) return false;
\r
248 void list_disp(const list_t * list, const board_t * board) {
\r
250 int i, move, value;
\r
253 ASSERT(list_is_ok(list));
\r
254 ASSERT(board_is_ok(board));
\r
256 for (i = 0; i < list->size; i++) {
\r
258 move = list->move[i];
\r
259 value = list->value[i];
\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
265 my_log("POLYGLOT\n");
\r