1
0
Fork 0

Rearrange Endgames

Remove references to EndgameBase and use instead
Value and ScaleFactor as template parameters of
the endgames maps.

No functional change.
pull/268/head
Marco Costalba 2015-01-21 17:35:53 +01:00
parent 96e36a7897
commit 36f8814aa6
2 changed files with 16 additions and 13 deletions

View 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));
}

View 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