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