]> git.sesse.net Git - stockfish/blobdiff - src/bitbase.cpp
Simplify code for pinaware SEE
[stockfish] / src / bitbase.cpp
index b3ae5c5fb5498b737ad4b0ba206268b5f3e9485d..25570e12a4b54a63f57e194e585caeca02f58368 100644 (file)
@@ -2,6 +2,7 @@
   Stockfish, a UCI chess playing engine derived from Glaurung 2.1
   Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
   Copyright (C) 2008-2015 Marco Costalba, Joona Kiiski, Tord Romstad
+  Copyright (C) 2015-2016 Marco Costalba, Joona Kiiski, Gary Linscott, Tord Romstad
 
   Stockfish is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -53,7 +54,7 @@ namespace {
     WIN     = 4
   };
 
-  inline Result& operator|=(Result& r, Result v) { return r = Result(r | v); }
+  Result& operator|=(Result& r, Result v) { return r = Result(r | v); }
 
   struct KPKPosition {
     KPKPosition() = default;
@@ -64,7 +65,6 @@ namespace {
 
     template<Color Us> Result classify(const std::vector<KPKPosition>& db);
 
-    unsigned id;
     Color us;
     Square ksq[COLOR_NB], psq;
     Result result;
@@ -85,20 +85,22 @@ bool Bitbases::probe(Square wksq, Square wpsq, Square bksq, Color us) {
 void Bitbases::init() {
 
   std::vector<KPKPosition> db(MAX_INDEX);
-  unsigned id = 0;
+  unsigned idx, repeat = 1;
 
   // Initialize db with known win / draw positions
-  std::generate(db.begin(), db.end(), [&id](){ return KPKPosition(id++); });
+  for (idx = 0; idx < MAX_INDEX; ++idx)
+      db[idx] = KPKPosition(idx);
 
   // Iterate through the positions until none of the unknown positions can be
   // changed to either wins or draws (15 cycles needed).
-  while (std::accumulate(db.begin(), db.end(), false, [&](bool repeat, KPKPosition& pos)
-  { return (pos == UNKNOWN && pos.classify(db) != UNKNOWN) || repeat; })){}
+  while (repeat)
+      for (repeat = idx = 0; idx < MAX_INDEX; ++idx)
+          repeat |= (db[idx] == UNKNOWN && db[idx].classify(db) != UNKNOWN);
 
   // Map 32 results into one KPKBitbase[] entry
-  for (auto& pos : db)
-      if (pos == WIN)
-          KPKBitbase[pos.id / 32] |= 1 << (pos.id & 0x1F);
+  for (idx = 0; idx < MAX_INDEX; ++idx)
+      if (db[idx] == WIN)
+          KPKBitbase[idx / 32] |= 1 << (idx & 0x1F);
 }
 
 
@@ -106,7 +108,6 @@ namespace {
 
   KPKPosition::KPKPosition(unsigned idx) {
 
-    id         = idx;
     ksq[WHITE] = Square((idx >>  0) & 0x3F);
     ksq[BLACK] = Square((idx >>  6) & 0x3F);
     us         = Color ((idx >> 12) & 0x01);