X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fendgame.h;h=d7a7681abd985910b8ddf53254a4ab4394f64dc2;hb=856a5f3aaaf8b9d53599963decacd4476b55c034;hp=453d8b29d47d98780fb8a04bb00da8efed95ff8c;hpb=f7d8ea3866c26df10617e97513e906d1f5a5b833;p=stockfish diff --git a/src/endgame.h b/src/endgame.h index 453d8b29..d7a7681a 100644 --- a/src/endgame.h +++ b/src/endgame.h @@ -21,10 +21,7 @@ #define ENDGAME_H_INCLUDED #include -#include #include -#include -#include #include "position.h" #include "types.h" @@ -66,9 +63,11 @@ enum EndgameType { /// Endgame functions can be of two types depending on whether they return a -/// Value or a ScaleFactor. -template -using eg_fun = std::conditional<(E < SCALING_FUNCTIONS), Value, ScaleFactor>; +/// Value or a ScaleFactor. Type eg_fun::type returns either ScaleFactor +/// or Value depending on whether the template parameter is 0 or 1. + +template struct eg_fun { typedef Value type; }; +template<> struct eg_fun<1> { typedef ScaleFactor type; }; /// Base and derived templates for endgame evaluation and scaling functions @@ -82,7 +81,7 @@ struct EndgameBase { }; -template::type> +template SCALING_FUNCTIONS)>::type> struct Endgame : public EndgameBase { explicit Endgame(Color c) : strongSide(c), weakSide(~c) {} @@ -90,7 +89,7 @@ struct Endgame : public EndgameBase { T operator()(const Position&) const; private: - const Color strongSide, weakSide; + Color strongSide, weakSide; }; @@ -100,21 +99,24 @@ private: class Endgames { - template using Map = std::map>; + typedef std::map::type>*> M1; + typedef std::map::type>*> M2; - template::type>> - void add(const std::string& code); + M1 m1; + M2 m2; - template>::value> - Map& map() { return std::get(maps); } + M1& map(M1::mapped_type) { return m1; } + M2& map(M2::mapped_type) { return m2; } - std::pair>, Map>> maps; + template void add(const std::string& code); public: Endgames(); + ~Endgames(); - template> E* probe(Key key) - { return map().count(key) ? map()[key].get() : nullptr; } + template T probe(Key key, T& eg) { + return eg = map(eg).count(key) ? map(eg)[key] : NULL; + } }; #endif // #ifndef ENDGAME_H_INCLUDED