Subversion Repositories Games.Chess Giants

Rev

Rev 96 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  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
  5.   Copyright (C) 2015-2018 Marco Costalba, Joona Kiiski, Gary Linscott, Tord Romstad
  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.  
  24. #include <algorithm>
  25.  
  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;
  41.   int value;
  42.  
  43.   operator Move() const { return move; }
  44.   void operator=(Move m) { move = m; }
  45.  
  46.   // Inhibit unwanted implicit conversions to Move
  47.   // with an ambiguity that yields to a compile error.
  48.   operator float() const = delete;
  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 {
  68.     return std::find(begin(), end(), move) != end();
  69.   }
  70.  
  71. private:
  72.   ExtMove moveList[MAX_MOVES], *last;
  73. };
  74.  
  75. #endif // #ifndef MOVEGEN_H_INCLUDED
  76.