-template<EndgameType>
-struct ScalingFunction : public EndgameScalingFunctionBase {
- typedef EndgameScalingFunctionBase Base;
- explicit ScalingFunction(Color c) : EndgameScalingFunctionBase(c) {}
- ScaleFactor apply(const Position&) const;
+
+/// Endgames class stores in two std::map the pointers to endgame evaluation
+/// and scaling base objects. Then we use polymorphism to invoke the actual
+/// endgame function calling its apply() method that is virtual.
+
+class Endgames {
+
+ typedef std::map<Key, EndgameBase<Value>*> EFMap;
+ typedef std::map<Key, EndgameBase<ScaleFactor>*> SFMap;
+
+public:
+ Endgames();
+ ~Endgames();
+ template<class T> T* get(Key key) const;
+
+private:
+ template<class T> void add(const std::string& keyCode);
+
+ // Here we store two maps, for evaluate and scaling functions...
+ std::pair<EFMap, SFMap> maps;
+
+ // ...and here is the accessing template function
+ template<typename T> const std::map<Key, T*>& get() const;