Add Game::is_dangerous() for Futility Pruning
[purplehaze.git] / src / zobrist.h
blobcbd104d1314d3f482af3a1cff3b6295ce111d058
1 /* Copyright (C) 2007-2011 Vincent Ollivier
3 * Purple Haze is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 3 of the License, or
6 * (at your option) any later version.
8 * Purple Haze is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 #ifndef ZOBRIST_H
18 #define ZOBRIST_H
20 #include <iostream>
21 #include <random>
23 #include "common.h"
25 typedef uint64_t Hash;
27 class Zobrist
29 private:
30 Hash gen_hash();
31 Hash pieces_positions[2][7][BOARD_SIZE];
32 Hash side_to_move;
33 Hash castle_rights[4];
34 Hash en_passants[BOARD_SIZE];
35 std::mt19937_64 generator;
37 public:
38 Zobrist();
39 void change_side(Hash& h) {
40 h ^= side_to_move;
42 void update_piece(Hash& h, Color c, PieceType t, Square s) {
43 h ^= pieces_positions[c][t][s];
45 void update_castle_right(Hash& h, Color c, PieceType t) {
46 h ^= castle_rights[2 * c + t - QUEEN];
48 void update_en_passant(Hash& h, Square s) {
49 h ^= en_passants[s];
51 friend std::ostream& operator<<(std::ostream& out, const Zobrist& zobrist);
54 #endif /* !ZOBRIST_H */