Code like this is more a case of showing off one's C++ knowledge, rather than
using it adequately, IMHO.
**First loop (std::generate)**
Iterators are inadequate here, because they lose the key information which is
idx. As a result, we need to carry a redundant idx variable, and increment it
along the way. Very clumsy.
Usage of std::generate and a lambda function only obfuscate the code, which is
merely a simple and stupid loop over the elements of a vector.
**Second loop (std::accumulate)**
This code is thoroughlly incomprehensible. Restore the original, which was much
simpler to understand.
**Third loop (range based loop)**
Again, a range based loop is inadequate, because we lose idx! To resolve this
artificially created problem, the data model was made redundant (idx is a data
member of db[] elements!?), which is ugly and unjustified. A simple and stupid
for loop with idx does the job much better.
No functional change.
Resolves #313
template<Color Us> Result classify(const std::vector<KPKPosition>& db);
template<Color Us> Result classify(const std::vector<KPKPosition>& db);
Color us;
Square ksq[COLOR_NB], psq;
Result result;
Color us;
Square ksq[COLOR_NB], psq;
Result result;
void Bitbases::init() {
std::vector<KPKPosition> db(MAX_INDEX);
void Bitbases::init() {
std::vector<KPKPosition> db(MAX_INDEX);
+ unsigned idx, repeat = 1;
// Initialize db with known win / draw positions
// 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).
// 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
// 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);
KPKPosition::KPKPosition(unsigned idx) {
KPKPosition::KPKPosition(unsigned idx) {
ksq[WHITE] = Square((idx >> 0) & 0x3F);
ksq[BLACK] = Square((idx >> 6) & 0x3F);
us = Color ((idx >> 12) & 0x01);
ksq[WHITE] = Square((idx >> 0) & 0x3F);
ksq[BLACK] = Square((idx >> 6) & 0x3F);
us = Color ((idx >> 12) & 0x01);