+ // Build corresponding key for the opposite color: "KBPKN" -> "KNKBP"
+ const string swapColors(const string& keyCode) {
+
+ size_t idx = keyCode.find('K', 1);
+ return keyCode.substr(idx) + keyCode.substr(0, idx);
+ }
+
+ // Build up a fen string with the given pieces, note that the fen string
+ // could be of an illegal position.
+ Key buildKey(const string& keyCode) {
+
+ assert(keyCode.length() > 0 && keyCode.length() < 8);
+ assert(keyCode[0] == 'K');
+
+ string fen;
+ bool upcase = false;
+
+ for (size_t i = 0; i < keyCode.length(); i++)
+ {
+ if (keyCode[i] == 'K')
+ upcase = !upcase;
+
+ fen += char(upcase ? toupper(keyCode[i]) : tolower(keyCode[i]));
+ }
+ fen += char(8 - keyCode.length() + '0');
+ fen += "/8/8/8/8/8/8/8 w - -";
+ return Position(fen, false, 0).get_material_key();
+ }
+
+ typedef EndgameBase<Value> EF;
+ typedef EndgameBase<ScaleFactor> SF;
+
+} // namespace
+
+
+/// Endgames member definitions
+
+template<> const Endgames::EFMap& Endgames::get<EF>() const { return maps.first; }
+template<> const Endgames::SFMap& Endgames::get<SF>() const { return maps.second; }
+
+Endgames::Endgames() {
+
+ add<Endgame<Value, KNNK> >("KNNK");
+ add<Endgame<Value, KPK> >("KPK");
+ add<Endgame<Value, KBNK> >("KBNK");
+ add<Endgame<Value, KRKP> >("KRKP");
+ add<Endgame<Value, KRKB> >("KRKB");
+ add<Endgame<Value, KRKN> >("KRKN");
+ add<Endgame<Value, KQKR> >("KQKR");
+ add<Endgame<Value, KBBKN> >("KBBKN");
+
+ add<Endgame<ScaleFactor, KNPK> >("KNPK");
+ add<Endgame<ScaleFactor, KRPKR> >("KRPKR");
+ add<Endgame<ScaleFactor, KBPKB> >("KBPKB");
+ add<Endgame<ScaleFactor, KBPPKB> >("KBPPKB");
+ add<Endgame<ScaleFactor, KBPKN> >("KBPKN");
+ add<Endgame<ScaleFactor, KRPPKRP> >("KRPPKRP");
+}
+
+Endgames::~Endgames() {
+
+ for (EFMap::const_iterator it = get<EF>().begin(); it != get<EF>().end(); ++it)
+ delete it->second;
+
+ for (SFMap::const_iterator it = get<SF>().begin(); it != get<SF>().end(); ++it)
+ delete it->second;
+}
+
+template<class T>
+void Endgames::add(const string& keyCode) {
+
+ typedef typename T::Base F;
+ typedef std::map<Key, F*> M;