Better document move_to_san()
authorMarco Costalba <mcostalba@gmail.com>
Fri, 10 Jun 2011 06:49:12 +0000 (08:49 +0200)
committerMarco Costalba <mcostalba@gmail.com>
Fri, 10 Jun 2011 10:59:53 +0000 (11:59 +0100)
No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
src/bitboard.cpp
src/move.cpp

index ce4f5b8891d8fe107904e668169f85556f44ab64..b9071ea8bab0beb0323e1b597e27097c6ce7a732 100644 (file)
@@ -79,7 +79,7 @@ void print_bitboard(Bitboard b) {
   {
       std::cout << "+---+---+---+---+---+---+---+---+" << '\n';
       for (File f = FILE_A; f <= FILE_H; f++)
-          std::cout << "| " << (bit_is_set(b, make_square(f, r)) ? 'X' : ' ') << ' ';
+          std::cout << "| " << (bit_is_set(b, make_square(f, r)) ? "X " : "  ");
 
       std::cout << "|\n";
   }
@@ -332,9 +332,9 @@ namespace {
 
         attack[s] = &attTable[offset];
         mask[s]   = sliding_attacks(s, EmptyBoardBB, delta, excluded);
-        shift[s]  = (CpuIs64Bit ? 64 : 32) - count_1s<CNT64>(mask[s]);
+        shift[s]  = (CpuIs64Bit ? 64 : 32) - count_1s<CNT32_MAX15>(mask[s]);
 
-        maxKey = 1 << count_1s<CNT32>(mask[s]);
+        maxKey = 1 << count_1s<CNT32_MAX15>(mask[s]);
         offset += maxKey;
         booster = MagicBoosters[CpuIs64Bit][square_rank(s)];
 
index 7504615d6d670c5ee0e7279ca90c57aa06bd6b27..4a0a43b30fca539da6fb0d7db0e065904d8ab020 100644 (file)
@@ -91,8 +91,9 @@ const string move_to_san(Position& pos, Move m) {
   assert(pos.is_ok());
   assert(move_is_ok(m));
 
-  MoveStack mlist[MAX_MOVES];
-  Square from = move_from(m);
+  Bitboard attackers;
+  bool ambiguousMove, ambiguousFile, ambiguousRank;
+  Square sq, from = move_from(m);
   Square to = move_to(m);
   PieceType pt = pos.type_of_piece_on(from);
   string san;
@@ -113,31 +114,30 @@ const string move_to_san(Position& pos, Move m) {
       {
           san = piece_type_to_char(pt);
 
-          // Collect all legal moves of piece type 'pt' with destination 'to'
-          MoveStack* last = generate<MV_LEGAL>(pos, mlist);
-          int f = 0, r = 0, cnt = 0;
+          // Disambiguation if we have more then one piece with destination 'to'
+          // note that for pawns is not needed because starting file is explicit.
+          attackers = pos.attackers_to(to) & pos.pieces(pt, pos.side_to_move());
+          clear_bit(&attackers, from);
+          ambiguousMove = ambiguousFile = ambiguousRank = false;
 
-          for (MoveStack* cur = mlist; cur != last; cur++)
-              if (   move_to(cur->move) == to
-                  && pos.type_of_piece_on(move_from(cur->move)) == pt)
-              {
-                  cnt++;
+          while (attackers)
+          {
+              sq = pop_1st_bit(&attackers);
 
-                  if (square_file(move_from(cur->move)) == square_file(from))
-                      f++;
+              if (square_file(sq) == square_file(from))
+                  ambiguousFile = true;
 
-                  if (square_rank(move_from(cur->move)) == square_rank(from))
-                      r++;
-              }
+              if (square_rank(sq) == square_rank(from))
+                  ambiguousRank = true;
 
-          assert(cnt > 0 && f > 0 && r > 0);
+              ambiguousMove = true;
+          }
 
-          // Disambiguation if we have more then one piece with destination 'to'
-          if (cnt > 1)
+          if (ambiguousMove)
           {
-              if (f == 1)
+              if (!ambiguousFile)
                   san += file_to_char(square_file(from));
-              else if (r == 1)
+              else if (!ambiguousRank)
                   san += rank_to_char(square_rank(from));
               else
                   san += square_to_string(from);