Rearrange Endgames
authorMarco Costalba <mcostalba@gmail.com>
Wed, 21 Jan 2015 16:35:53 +0000 (17:35 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Wed, 21 Jan 2015 16:35:53 +0000 (17:35 +0100)
Remove references to EndgameBase and use instead
Value and ScaleFactor as template parameters of
the endgames maps.

No functional change.

src/endgame.cpp
src/endgame.h

index 82a01b12f7ace602793c1ba6e813165f54144a0f..836621d2a5428f02e220bd8c643005e6a21e4cc9 100644 (file)
@@ -128,9 +128,8 @@ Endgames::Endgames() {
 
 template<EndgameType E, typename T>
 void Endgames::add(const string& code) {
-
-  map<T>()[key(code, WHITE)] = std::unique_ptr<T>(new Endgame<E>(WHITE));
-  map<T>()[key(code, BLACK)] = std::unique_ptr<T>(new Endgame<E>(BLACK));
+  map<T>()[key(code, WHITE)] = std::unique_ptr<EndgameBase<T>>(new Endgame<E>(WHITE));
+  map<T>()[key(code, BLACK)] = std::unique_ptr<EndgameBase<T>>(new Endgame<E>(BLACK));
 }
 
 
index 392788cfe9fbdc12373ce304cdcf45f748172caf..cd05f0cd1b6273cfa91341d379bc36439d3271d5 100644 (file)
@@ -67,8 +67,8 @@ enum EndgameType {
 
 /// Endgame functions can be of two types depending on whether they return a
 /// Value or a ScaleFactor.
-template<EndgameType E>
-using eg_fun = std::conditional<(E < SCALING_FUNCTIONS), Value, ScaleFactor>;
+template<EndgameType E> using
+eg_type = typename std::conditional<(E < SCALING_FUNCTIONS), Value, ScaleFactor>::type;
 
 
 /// Base and derived templates for endgame evaluation and scaling functions
@@ -82,7 +82,7 @@ struct EndgameBase {
 };
 
 
-template<EndgameType E, typename T = typename eg_fun<E>::type>
+template<EndgameType E, typename T = eg_type<E>>
 struct Endgame : public EndgameBase<T> {
 
   explicit Endgame(Color c) : strongSide(c), weakSide(~c) {}
@@ -100,21 +100,25 @@ private:
 
 class Endgames {
 
-  template<typename T> using Map = std::map<Key, std::unique_ptr<T>>;
+  template<typename T> using Map = std::map<Key, std::unique_ptr<EndgameBase<T>>>;
 
-  template<EndgameType E, typename T = EndgameBase<typename eg_fun<E>::type>>
+  template<EndgameType E, typename T = eg_type<E>>
   void add(const std::string& code);
 
-  template<typename T, int I = std::is_same<T, EndgameBase<ScaleFactor>>::value>
-  Map<T>& map() { return std::get<I>(maps); }
+  template<typename T>
+  Map<T>& map() {
+    return std::get<std::is_same<T, ScaleFactor>::value>(maps);
+  }
 
-  std::pair<Map<EndgameBase<Value>>, Map<EndgameBase<ScaleFactor>>> maps;
+  std::pair<Map<Value>, Map<ScaleFactor>> maps;
 
 public:
   Endgames();
 
-  template<typename T, typename E = EndgameBase<T>> E* probe(Key key)
-  { return map<E>().count(key) ? map<E>()[key].get() : nullptr; }
+  template<typename T>
+  EndgameBase<T>* probe(Key key) {
+    return map<T>().count(key) ? map<T>()[key].get() : nullptr;
+  }
 };
 
 #endif // #ifndef ENDGAME_H_INCLUDED