+ add<Value, KPK>("KPK");
+ add<Value, KNNK>("KNNK");
+ add<Value, KBNK>("KBNK");
+ add<Value, KRKP>("KRKP");
+ add<Value, KRKB>("KRKB");
+ add<Value, KRKN>("KRKN");
+ add<Value, KQKR>("KQKR");
+ add<Value, KBBKN>("KBBKN");
+
+ add<ScaleFactor, KNPK>("KNPK");
+ add<ScaleFactor, KRPKR>("KRPKR");
+ add<ScaleFactor, KBPKB>("KBPKB");
+ add<ScaleFactor, KBPKN>("KBPKN");
+ add<ScaleFactor, KBPPKB>("KBPPKB");
+ add<ScaleFactor, KRPPKRP>("KRPPKRP");
+}
+
+Endgames::~Endgames() {
+
+ for (EFMap::const_iterator it = map<EF>().begin(); it != map<EF>().end(); ++it)
+ delete it->second;
+
+ for (SFMap::const_iterator it = map<SF>().begin(); it != map<SF>().end(); ++it)
+ delete it->second;
+}
+
+template<typename T, EndgameType E>
+void Endgames::add(const string& keyCode) {
+
+ typedef Endgame<T, E> EG;
+ typedef typename EG::Base B;
+ typedef std::map<Key, B*> M;
+
+ const_cast<M&>(map<B>()).insert(std::pair<Key, B*>(mat_key(keyCode), new EG(WHITE)));
+ const_cast<M&>(map<B>()).insert(std::pair<Key, B*>(mat_key(swap_colors(keyCode)), new EG(BLACK)));