-\r
-// list.c\r
-\r
-// includes\r
-\r
-#include "board.h"\r
-#include "list.h"\r
-#include "move.h"\r
-#include "util.h"\r
-\r
-// functions\r
-\r
-// list_is_ok()\r
-\r
-bool list_is_ok(const list_t * list) {\r
-\r
- if (list == NULL) return FALSE;\r
-\r
- if (list->size >= ListSize) return FALSE;\r
-\r
- return TRUE;\r
-}\r
-\r
-// list_clear()\r
-\r
-void list_clear(list_t * list) {\r
-\r
- ASSERT(list!=NULL);\r
-\r
- list->size = 0;\r
-}\r
-\r
-// list_add\r
-\r
-void list_add(list_t * list, int move){\r
- list_add_ex(list, move, 0);\r
-}\r
-\r
-// list_add_ex()\r
-\r
-void list_add_ex(list_t * list, int move, int value) {\r
-\r
- ASSERT(list_is_ok(list));\r
- ASSERT(move_is_ok(move));\r
- ASSERT(value>=-32767&&value<=+32767);\r
-\r
- ASSERT(list->size<ListSize-1);\r
-\r
- list->move[list->size] = move;\r
- list->value[list->size] = value;\r
- list->size++;\r
-}\r
-\r
-// list_remove()\r
-\r
-void list_remove(list_t * list, int index) {\r
-\r
- int i;\r
-\r
- ASSERT(list_is_ok(list));\r
- ASSERT(index>=0&&index<list->size);\r
-\r
- for (i = index; i < list->size-1; i++) {\r
- list->move[i] = list->move[i+1];\r
- list->value[i] = list->value[i+1];\r
- }\r
-\r
- list->size--;\r
-}\r
-\r
-// list_is_empty()\r
-\r
-bool list_is_empty(const list_t * list) {\r
-\r
- ASSERT(list_is_ok(list));\r
-\r
- return list->size == 0;\r
-}\r
-\r
-// list_size()\r
-\r
-int list_size(const list_t * list) {\r
-\r
- ASSERT(list_is_ok(list));\r
-\r
- return list->size;\r
-}\r
-\r
-// list_move()\r
-\r
-int list_move(const list_t * list, int index) {\r
-\r
- ASSERT(list_is_ok(list));\r
- ASSERT(index>=0&&index<list->size);\r
-\r
- return list->move[index];\r
-}\r
-\r
-// list_value()\r
-\r
-int list_value(const list_t * list, int index) {\r
-\r
- ASSERT(list_is_ok(list));\r
- ASSERT(index>=0&&index<list->size);\r
-\r
- return list->value[index];\r
-}\r
-\r
-// list_copy()\r
-\r
-void list_copy(list_t * dst, const list_t * src) {\r
-\r
- int i;\r
-\r
- ASSERT(dst!=NULL);\r
- ASSERT(list_is_ok(src));\r
-\r
- dst->size = src->size;\r
-\r
- for (i = 0; i < src->size; i++) {\r
- dst->move[i] = src->move[i];\r
- dst->value[i] = src->value[i];\r
- }\r
-}\r
-\r
-// list_move_to_front()\r
-\r
-void list_move_to_front(list_t * list, int index) {\r
-\r
- int i;\r
- int move, value;\r
-\r
- ASSERT(list_is_ok(list));\r
- ASSERT(index>=0&&index<list->size);\r
-\r
- if (index != 0) {\r
-\r
- move = list->move[index];\r
- value = list->value[index];\r
-\r
- for (i = index; i > 0; i--) {\r
- list->move[i] = list->move[i-1];\r
- list->value[i] = list->value[i-1];\r
- }\r
-\r
- list->move[0] = move;\r
- list->value[0] = value;\r
- }\r
-}\r
-\r
-// list_note()\r
-\r
-void list_note(list_t * list) {\r
-\r
- int i, move;\r
-\r
- ASSERT(list_is_ok(list));\r
-\r
- for (i = 0; i < list->size; i++) {\r
- move = list->move[i];\r
- ASSERT(move_is_ok(move));\r
- list->value[i] = -move_order(move);\r
- }\r
-}\r
-\r
-// list_sort()\r
-\r
-void list_sort(list_t * list) {\r
-\r
- int i, j;\r
- int best_index, best_move, best_value;\r
-\r
- ASSERT(list_is_ok(list));\r
-\r
- for (i = 0; i < list->size-1; i++) {\r
-\r
- best_index = i;\r
- best_value = list->value[i];\r
-\r
- for (j = i+1; j < list->size; j++) {\r
- if (list->value[j] > best_value) {\r
- best_index = j;\r
- best_value = list->value[j];\r
- }\r
- }\r
-\r
- if (best_index != i) {\r
-\r
- best_move = list->move[best_index];\r
- ASSERT(best_value==list->value[best_index]);\r
-\r
- for (j = best_index; j > i; j--) {\r
- list->move[j] = list->move[j-1];\r
- list->value[j] = list->value[j-1];\r
- }\r
-\r
- list->move[i] = best_move;\r
- list->value[i] = best_value;\r
- }\r
- }\r
-\r
- if (DEBUG) {\r
- for (i = 0; i < list->size-1; i++) {\r
- ASSERT(list->value[i]>=list->value[i+1]);\r
- }\r
- }\r
-}\r
-\r
-// list_contain()\r
-\r
-bool list_contain(const list_t * list, int move) {\r
-\r
- int i;\r
-\r
- ASSERT(list_is_ok(list));\r
- ASSERT(move_is_ok(move));\r
-\r
- for (i = 0; i < list->size; i++) {\r
- if (list->move[i] == move) return TRUE;\r
- }\r
-\r
- return FALSE;\r
-}\r
-\r
-// list_equal()\r
-\r
-bool list_equal(list_t * list_1, list_t * list_2) {\r
-\r
- list_t copy_1[1], copy_2[1];\r
- int i;\r
-\r
- ASSERT(list_is_ok(list_1));\r
- ASSERT(list_is_ok(list_2));\r
-\r
- if (list_1->size != list_2->size) return FALSE;\r
-\r
- list_copy(copy_1,list_1);\r
- list_note(copy_1);\r
- list_sort(copy_1);\r
-\r
- list_copy(copy_2,list_2);\r
- list_note(copy_2);\r
- list_sort(copy_2);\r
-\r
- for (i = 0; i < copy_1->size; i++) {\r
- if (copy_1->move[i] != copy_2->move[i]) return FALSE;\r
- }\r
-\r
- return TRUE;\r
-}\r
-\r
-// list_disp()\r
-\r
-void list_disp(const list_t * list, const board_t * board) {\r
-\r
- int i, move, value;\r
- char string[256];\r
-\r
- ASSERT(list_is_ok(list));\r
- ASSERT(board_is_ok(board));\r
-\r
- for (i = 0; i < list->size; i++) {\r
-\r
- move = list->move[i];\r
- value = list->value[i];\r
-\r
- if (!move_to_can(move,board,string,256)) ASSERT(FALSE);\r
- my_log("POLYGLOT %-5s %04X %+4d\n",string,move,value);\r
- }\r
-\r
- my_log("POLYGLOT\n");\r
-}\r
-\r
-// end of list.cpp\r
-\r
+
+// list.c
+
+// includes
+
+#include "board.h"
+#include "list.h"
+#include "move.h"
+#include "util.h"
+
+// functions
+
+// list_is_ok()
+
+bool list_is_ok(const list_t * list) {
+
+ if (list == NULL) return FALSE;
+
+ if (list->size >= ListSize) return FALSE;
+
+ return TRUE;
+}
+
+// list_clear()
+
+void list_clear(list_t * list) {
+
+ ASSERT(list!=NULL);
+
+ list->size = 0;
+}
+
+// list_add
+
+void list_add(list_t * list, int move){
+ list_add_ex(list, move, 0);
+}
+
+// list_add_ex()
+
+void list_add_ex(list_t * list, int move, int value) {
+
+ ASSERT(list_is_ok(list));
+ ASSERT(move_is_ok(move));
+ ASSERT(value>=-32767&&value<=+32767);
+
+ ASSERT(list->size<ListSize-1);
+
+ list->move[list->size] = move;
+ list->value[list->size] = value;
+ list->size++;
+}
+
+// list_remove()
+
+void list_remove(list_t * list, int index) {
+
+ int i;
+
+ ASSERT(list_is_ok(list));
+ ASSERT(index>=0&&index<list->size);
+
+ for (i = index; i < list->size-1; i++) {
+ list->move[i] = list->move[i+1];
+ list->value[i] = list->value[i+1];
+ }
+
+ list->size--;
+}
+
+// list_is_empty()
+
+bool list_is_empty(const list_t * list) {
+
+ ASSERT(list_is_ok(list));
+
+ return list->size == 0;
+}
+
+// list_size()
+
+int list_size(const list_t * list) {
+
+ ASSERT(list_is_ok(list));
+
+ return list->size;
+}
+
+// list_move()
+
+int list_move(const list_t * list, int index) {
+
+ ASSERT(list_is_ok(list));
+ ASSERT(index>=0&&index<list->size);
+
+ return list->move[index];
+}
+
+// list_value()
+
+int list_value(const list_t * list, int index) {
+
+ ASSERT(list_is_ok(list));
+ ASSERT(index>=0&&index<list->size);
+
+ return list->value[index];
+}
+
+// list_copy()
+
+void list_copy(list_t * dst, const list_t * src) {
+
+ int i;
+
+ ASSERT(dst!=NULL);
+ ASSERT(list_is_ok(src));
+
+ dst->size = src->size;
+
+ for (i = 0; i < src->size; i++) {
+ dst->move[i] = src->move[i];
+ dst->value[i] = src->value[i];
+ }
+}
+
+// list_move_to_front()
+
+void list_move_to_front(list_t * list, int index) {
+
+ int i;
+ int move, value;
+
+ ASSERT(list_is_ok(list));
+ ASSERT(index>=0&&index<list->size);
+
+ if (index != 0) {
+
+ move = list->move[index];
+ value = list->value[index];
+
+ for (i = index; i > 0; i--) {
+ list->move[i] = list->move[i-1];
+ list->value[i] = list->value[i-1];
+ }
+
+ list->move[0] = move;
+ list->value[0] = value;
+ }
+}
+
+// list_note()
+
+void list_note(list_t * list) {
+
+ int i, move;
+
+ ASSERT(list_is_ok(list));
+
+ for (i = 0; i < list->size; i++) {
+ move = list->move[i];
+ ASSERT(move_is_ok(move));
+ list->value[i] = -move_order(move);
+ }
+}
+
+// list_sort()
+
+void list_sort(list_t * list) {
+
+ int i, j;
+ int best_index, best_move, best_value;
+
+ ASSERT(list_is_ok(list));
+
+ for (i = 0; i < list->size-1; i++) {
+
+ best_index = i;
+ best_value = list->value[i];
+
+ for (j = i+1; j < list->size; j++) {
+ if (list->value[j] > best_value) {
+ best_index = j;
+ best_value = list->value[j];
+ }
+ }
+
+ if (best_index != i) {
+
+ best_move = list->move[best_index];
+ ASSERT(best_value==list->value[best_index]);
+
+ for (j = best_index; j > i; j--) {
+ list->move[j] = list->move[j-1];
+ list->value[j] = list->value[j-1];
+ }
+
+ list->move[i] = best_move;
+ list->value[i] = best_value;
+ }
+ }
+
+ if (DEBUG) {
+ for (i = 0; i < list->size-1; i++) {
+ ASSERT(list->value[i]>=list->value[i+1]);
+ }
+ }
+}
+
+// list_contain()
+
+bool list_contain(const list_t * list, int move) {
+
+ int i;
+
+ ASSERT(list_is_ok(list));
+ ASSERT(move_is_ok(move));
+
+ for (i = 0; i < list->size; i++) {
+ if (list->move[i] == move) return TRUE;
+ }
+
+ return FALSE;
+}
+
+// list_equal()
+
+bool list_equal(list_t * list_1, list_t * list_2) {
+
+ list_t copy_1[1], copy_2[1];
+ int i;
+
+ ASSERT(list_is_ok(list_1));
+ ASSERT(list_is_ok(list_2));
+
+ if (list_1->size != list_2->size) return FALSE;
+
+ list_copy(copy_1,list_1);
+ list_note(copy_1);
+ list_sort(copy_1);
+
+ list_copy(copy_2,list_2);
+ list_note(copy_2);
+ list_sort(copy_2);
+
+ for (i = 0; i < copy_1->size; i++) {
+ if (copy_1->move[i] != copy_2->move[i]) return FALSE;
+ }
+
+ return TRUE;
+}
+
+// list_disp()
+
+void list_disp(const list_t * list, const board_t * board) {
+
+ int i, move, value;
+ char string[256];
+
+ ASSERT(list_is_ok(list));
+ ASSERT(board_is_ok(board));
+
+ for (i = 0; i < list->size; i++) {
+
+ move = list->move[i];
+ value = list->value[i];
+
+ if (!move_to_can(move,board,string,256)) ASSERT(FALSE);
+ my_log("POLYGLOT %-5s %04X %+4d\n",string,move,value);
+ }
+
+ my_log("POLYGLOT\n");
+}
+
+// end of list.cpp
+