version 1.4.30b
[polyglot.git] / list.c
diff --git a/list.c b/list.c
new file mode 100644 (file)
index 0000000..4c2b08f
--- /dev/null
+++ b/list.c
@@ -0,0 +1,275 @@
+\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