--- /dev/null
+\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