From cd07e136301429ab1f50027c78a9188799f1c9ae Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Wed, 3 Dec 2014 23:58:56 +0100 Subject: [PATCH] Be lazier when parsing pretty moves. About 25% speedup in PGN parsing. --- Board.pm | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/Board.pm b/Board.pm index d2a6e0e..921de3d 100644 --- a/Board.pm +++ b/Board.pm @@ -148,6 +148,8 @@ sub move_to_uci_notation { return _pos_to_square($from_row, $from_col) . _pos_to_square($to_row, $to_col) . $promo; } +# Note: This is in general not a validation that the move is actually allowed +# (e.g. you can castle even though you're in check). sub parse_pretty_move { my ($board, $move, $toplay) = @_; @@ -192,14 +194,18 @@ sub parse_pretty_move { for my $col (0..7) { next if (defined($from_col) && $from_col != $col); next if ($board->[$row][$col] ne $piece); - next if (!$board->can_reach($piece, $row, $col, $to_row, $to_col)); - - # See if doing this move would put us in check - # (yes, there are clients that expect us to do this). - next if ($board->make_move($row, $col, $to_row, $to_col, $promo)->in_check($side)); push @squares, [ $row, $col ]; } } + if (scalar @squares > 1) { + # Filter out pieces which cannot reach this square. + @squares = grep { $board->can_reach($piece, $_->[0], $_->[1], $to_row, $to_col) } @squares; + } + if (scalar @squares > 1) { + # See if doing this move would put us in check + # (yes, there are clients that expect us to do this). + @squares = grep { !$board->make_move($_->[0], $_->[1], $to_row, $to_col, $promo)->in_check($side) } @squares; + } if (scalar @squares == 0) { die "Impossible move $move"; } -- 2.39.2