Rev 169 | Details | Compare with Previous | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line | 
|---|---|---|---|
| 96 | pmbaty | 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-2015 Marco Costalba, Joona Kiiski, Tord Romstad | 
        ||
| 185 | pmbaty | 5 |   Copyright (C) 2015-2019 Marco Costalba, Joona Kiiski, Gary Linscott, Tord Romstad | 
        
| 96 | pmbaty | 6 | |
| 7 |   Stockfish is free software: you can redistribute it and/or modify | 
        ||
| 8 |   it under the terms of the GNU General Public License as published by | 
        ||
| 9 |   the Free Software Foundation, either version 3 of the License, or | 
        ||
| 10 |   (at your option) any later version. | 
        ||
| 11 | |||
| 12 |   Stockfish is distributed in the hope that it will be useful, | 
        ||
| 13 |   but WITHOUT ANY WARRANTY; without even the implied warranty of | 
        ||
| 14 |   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
        ||
| 15 |   GNU General Public License for more details. | 
        ||
| 16 | |||
| 17 |   You should have received a copy of the GNU General Public License | 
        ||
| 18 |   along with this program.  If not, see <http://www.gnu.org/licenses/>. | 
        ||
| 19 | */ | 
        ||
| 20 | |||
| 21 | #ifndef MOVEGEN_H_INCLUDED | 
        ||
| 22 | #define MOVEGEN_H_INCLUDED | 
        ||
| 23 | |||
| 169 | pmbaty | 24 | #include <algorithm> | 
        
| 25 | |||
| 96 | pmbaty | 26 | #include "types.h" | 
        
| 27 | |||
| 28 | class Position;  | 
        ||
| 29 | |||
| 30 | enum GenType {  | 
        ||
| 31 | CAPTURES,  | 
        ||
| 32 | QUIETS,  | 
        ||
| 33 | QUIET_CHECKS,  | 
        ||
| 34 | EVASIONS,  | 
        ||
| 35 | NON_EVASIONS,  | 
        ||
| 36 | LEGAL  | 
        ||
| 37 | };  | 
        ||
| 38 | |||
| 39 | struct ExtMove {  | 
        ||
| 40 |   Move move; | 
        ||
| 169 | pmbaty | 41 | int value;  | 
        
| 96 | pmbaty | 42 | |
| 43 | operator Move() const { return move; }  | 
        ||
| 44 | void operator=(Move m) { move = m; }  | 
        ||
| 169 | pmbaty | 45 | |
| 46 |   // Inhibit unwanted implicit conversions to Move | 
        ||
| 47 |   // with an ambiguity that yields to a compile error. | 
        ||
| 48 | operator float() const = delete;  | 
        ||
| 96 | pmbaty | 49 | };  | 
        
| 50 | |||
| 51 | inline bool operator<(const ExtMove& f, const ExtMove& s) {  | 
        ||
| 52 | return f.value < s.value;  | 
        ||
| 53 | } | 
        ||
| 54 | |||
| 55 | template<GenType>  | 
        ||
| 56 | ExtMove* generate(const Position& pos, ExtMove* moveList);  | 
        ||
| 57 | |||
| 58 | /// The MoveList struct is a simple wrapper around generate(). It sometimes comes | 
        ||
| 59 | /// in handy to use this class instead of the low level generate() function. | 
        ||
| 60 | template<GenType T>  | 
        ||
| 61 | struct MoveList {  | 
        ||
| 62 | |||
| 63 | explicit MoveList(const Position& pos) : last(generate<T>(pos, moveList)) {}  | 
        ||
| 64 | const ExtMove* begin() const { return moveList; }  | 
        ||
| 65 | const ExtMove* end() const { return last; }  | 
        ||
| 66 | size_t size() const { return last - moveList; }  | 
        ||
| 67 | bool contains(Move move) const {  | 
        ||
| 169 | pmbaty | 68 | return std::find(begin(), end(), move) != end();  | 
        
| 96 | pmbaty | 69 |   } | 
        
| 70 | |||
| 71 | private:  | 
        ||
| 72 | ExtMove moveList[MAX_MOVES], *last;  | 
        ||
| 73 | };  | 
        ||
| 74 | |||
| 75 | #endif // #ifndef MOVEGEN_H_INCLUDED |