From cca36469168bac04f2b31250c002fd815eac8c46 Mon Sep 17 00:00:00 2001 From: Petr Baudis Date: Fri, 15 Jan 2010 02:22:20 +0100 Subject: [PATCH] foreach_{8,diag}neighbor(): Simplify+speed up, use persistent shift array --- board.c | 14 ++++++++++++++ board.h | 27 +++++++++------------------ 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/board.c b/board.c index 55a49f4..8cb509c 100644 --- a/board.c +++ b/board.c @@ -179,6 +179,20 @@ board_clear(struct board *board) board->komi = komi; + /* Setup neighborhood iterators */ + board->nei8[0] = -size - 1; // (-1,-1) + board->nei8[1] = 1; + board->nei8[2] = 1; + board->nei8[3] = size - 2; // (-1,0) + board->nei8[4] = 2; + board->nei8[5] = size - 2; // (-1,1) + board->nei8[6] = 1; + board->nei8[7] = 1; + board->dnei[0] = -size - 1; + board->dnei[1] = 2; + board->dnei[2] = size*2 - 2; + board->dnei[3] = 2; + /* Setup initial symmetry */ board->symmetry.d = 1; board->symmetry.x1 = board->symmetry.y1 = board_size(board) / 2; diff --git a/board.h b/board.h index 75bedb1..61cd85f 100644 --- a/board.h +++ b/board.h @@ -84,6 +84,9 @@ struct board { float komi; int handicap; + /* Iterator offsets for foreach_neighbor*() */ + int nei8[8], dnei[4]; + int moves; struct move last_move; struct move last_move2; /* second-to-last move */ @@ -294,32 +297,20 @@ float board_official_score(struct board *board, struct move_queue *mq); #define foreach_8neighbor(board_, coord_) \ do { \ - coord_t q__[8]; int q__i = 0; \ - coord_pos(q__[q__i++], coord_raw(coord_) - board_size(board_) - 1, (board_)); \ - coord_pos(q__[q__i++], coord_raw(coord_) - board_size(board_), (board_)); \ - coord_pos(q__[q__i++], coord_raw(coord_) - board_size(board_) + 1, (board_)); \ - coord_pos(q__[q__i++], coord_raw(coord_) - 1, (board_)); \ - coord_pos(q__[q__i++], coord_raw(coord_) + 1, (board_)); \ - coord_pos(q__[q__i++], coord_raw(coord_) + board_size(board_) - 1, (board_)); \ - coord_pos(q__[q__i++], coord_raw(coord_) + board_size(board_), (board_)); \ - coord_pos(q__[q__i++], coord_raw(coord_) + board_size(board_) + 1, (board_)); \ int fn__i; \ - for (fn__i = 0; fn__i < q__i; fn__i++) { \ - coord_t c = q__[fn__i]; + coord_t c = (coord_); \ + for (fn__i = 0; fn__i < 8; fn__i++) { \ + c += (board_)->nei8[fn__i]; #define foreach_8neighbor_end \ } \ } while (0) #define foreach_diag_neighbor(board_, coord_) \ do { \ - coord_t q__[4]; int q__i = 0; \ - coord_pos(q__[q__i++], coord_raw(coord_) - board_size(board_) - 1, (board_)); \ - coord_pos(q__[q__i++], coord_raw(coord_) - board_size(board_) + 1, (board_)); \ - coord_pos(q__[q__i++], coord_raw(coord_) + board_size(board_) - 1, (board_)); \ - coord_pos(q__[q__i++], coord_raw(coord_) + board_size(board_) + 1, (board_)); \ int fn__i; \ - for (fn__i = 0; fn__i < q__i; fn__i++) { \ - coord_t c = q__[fn__i]; + coord_t c = (coord_); \ + for (fn__i = 0; fn__i < 4; fn__i++) { \ + c += (board_)->dnei[fn__i]; #define foreach_diag_neighbor_end \ } \ } while (0) -- 2.11.4.GIT