]> git.sesse.net Git - stockfish/blobdiff - src/direction.cpp
Space inflate and cleanup direction.cpp
[stockfish] / src / direction.cpp
index b4e2a99e867c89bde8475a6ad1f5dd8613b7f8de..64898eaf4537e6e086264717868c732c6e90a8c3 100644 (file)
 #include "square.h"
 
 
+////
+//// Local definitions
+////
+
+namespace {
+
+  const SquareDelta directionToDelta[] = {
+      DELTA_E, DELTA_W, DELTA_N, DELTA_S, DELTA_NE, DELTA_SW, DELTA_NW, DELTA_SE
+  };
+
+  bool reachable(Square orig, Square dest, SignedDirection dir) {
+
+    SquareDelta delta = directionToDelta[dir];
+    Square from = orig;
+    Square to = from + delta;
+    while (to != dest && square_distance(to, from) == 1 && square_is_ok(to))
+    {
+        from = to;
+        to += delta;
+    }
+    return (to == dest && square_distance(from, to) == 1);
+  }
+
+}
+
+
 ////
 //// Variables
 ////
@@ -39,25 +65,23 @@ uint8_t SignedDirectionTable[64][64];
 ////
 
 void init_direction_table() {
-  SquareDelta deltas[8] = {
-    DELTA_E, DELTA_W, DELTA_N, DELTA_S, DELTA_NE, DELTA_SW, DELTA_NW, DELTA_SE
-  };
-  for(Square s1 = SQ_A1; s1 <= SQ_H8; s1++)
-    for(Square s2 = SQ_A1; s2 <= SQ_H8; s2++) {
-      DirectionTable[s1][s2] = uint8_t(DIR_NONE);
-      SignedDirectionTable[s1][s2] = uint8_t(SIGNED_DIR_NONE);
-      if(s1 == s2) continue;
-      for(SignedDirection d = SIGNED_DIR_E; d <= SIGNED_DIR_SE; d++) {
-        SquareDelta delta = deltas[d];
-        Square s3, s4;
-        for(s4 = s1 + delta, s3 = s1;
-            square_distance(s4, s3) == 1 && s4 != s2 && square_is_ok(s4);
-            s3 = s4, s4 += delta);
-        if(s4 == s2 && square_distance(s4, s3) == 1) {
-          SignedDirectionTable[s1][s2] = uint8_t(d);
-          DirectionTable[s1][s2] = uint8_t(d/2);
-          break;
-        }
+
+  for (Square s1 = SQ_A1; s1 <= SQ_H8; s1++)
+      for (Square s2 = SQ_A1; s2 <= SQ_H8; s2++)
+      {
+          DirectionTable[s1][s2] = uint8_t(DIR_NONE);
+          SignedDirectionTable[s1][s2] = uint8_t(SIGNED_DIR_NONE);
+          if (s1 == s2)
+              continue;
+
+          for (SignedDirection d = SIGNED_DIR_E; d != SIGNED_DIR_NONE; d++)
+          {
+              if (reachable(s1, s2, d))
+              {
+                  SignedDirectionTable[s1][s2] = uint8_t(d);
+                  DirectionTable[s1][s2] = uint8_t(d / 2);
+                  break;
+              }
+          }
       }
-    }
 }