]> git.sesse.net Git - stockfish/blob - src/endgame.h
Simplify wait_for_stop_or_ponderhit()
[stockfish] / src / endgame.h
1 /*
2   Stockfish, a UCI chess playing engine derived from Glaurung 2.1
3   Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
4   Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
5
6   Stockfish is free software: you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation, either version 3 of the License, or
9   (at your option) any later version.
10
11   Stockfish is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   GNU General Public License for more details.
15
16   You should have received a copy of the GNU General Public License
17   along with this program.  If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 #if !defined(ENDGAME_H_INCLUDED)
21 #define ENDGAME_H_INCLUDED
22
23 #include "position.h"
24 #include "types.h"
25
26 enum EndgameType {
27
28     // Evaluation functions
29     KXK,   // Generic "mate lone king" eval
30     KBNK,  // KBN vs K
31     KPK,   // KP vs K
32     KRKP,  // KR vs KP
33     KRKB,  // KR vs KB
34     KRKN,  // KR vs KN
35     KQKR,  // KQ vs KR
36     KBBKN, // KBB vs KN
37     KNNK,  // KNN vs K
38     KmmKm, // K and two minors vs K and one or two minors
39
40     // Scaling functions
41     KBPsK,   // KB+pawns vs K
42     KQKRPs,  // KQ vs KR+pawns
43     KRPKR,   // KRP vs KR
44     KRPPKRP, // KRPP vs KRP
45     KPsK,    // King and pawns vs king
46     KBPKB,   // KBP vs KB
47     KBPPKB,  // KBPP vs KB
48     KBPKN,   // KBP vs KN
49     KNPK,    // KNP vs K
50     KPKP     // KP vs KP
51 };
52
53 /// Template abstract base class for all special endgame functions
54
55 template<typename T>
56 class EndgameFunctionBase {
57 public:
58   EndgameFunctionBase(Color c) : strongerSide(c), weakerSide(opposite_color(c)) {}
59   virtual ~EndgameFunctionBase() {}
60   virtual T apply(const Position&) const = 0;
61   Color color() const { return strongerSide; }
62
63 protected:
64   Color strongerSide, weakerSide;
65 };
66
67 typedef EndgameFunctionBase<Value> EndgameEvaluationFunctionBase;
68 typedef EndgameFunctionBase<ScaleFactor> EndgameScalingFunctionBase;
69
70
71 /// Templates subclass for various concrete endgames
72
73 template<EndgameType>
74 struct EvaluationFunction : public EndgameEvaluationFunctionBase {
75   typedef EndgameEvaluationFunctionBase Base;
76   explicit EvaluationFunction(Color c): EndgameEvaluationFunctionBase(c) {}
77   Value apply(const Position&) const;
78 };
79
80 template<EndgameType>
81 struct ScalingFunction : public EndgameScalingFunctionBase {
82   typedef EndgameScalingFunctionBase Base;
83   explicit ScalingFunction(Color c) : EndgameScalingFunctionBase(c) {}
84   ScaleFactor apply(const Position&) const;
85 };
86
87 #endif // !defined(ENDGAME_H_INCLUDED)