Overload Board's subscript operator
[purplehaze.git] / src / position.h
blob739e0131ae9a8b97924e48559eef99d1b440f33b
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 NODE_H
18 #define NODE_H
20 #include <bitset>
22 #include "common.h"
23 #include "piece.h"
24 #include "zobrist.h"
26 class Position
28 private:
29 Hash zobrist_hash;
30 Hash material_zobrist_hash;
31 Piece capture;
32 std::bitset<4> castle_rights;
33 std::bitset<2> castle;
34 Square en_passant;
35 unsigned char halfmove_counter;
36 bool null_move_right;
37 Color side_to_move;
39 public:
40 Position() :
41 en_passant(OUT),
42 halfmove_counter(0),
43 null_move_right(true),
44 side_to_move(WHITE)
47 Hash& hash() {
48 return zobrist_hash;
50 Hash& material_hash() {
51 return material_zobrist_hash;
53 Color get_turn_color() const {
54 return side_to_move;
56 void change_side() {
57 side_to_move = !side_to_move;
59 unsigned char get_halfmove() const {
60 return halfmove_counter;
62 void set_halfmove(unsigned char i) {
63 halfmove_counter = i;
65 void inc_halfmove() {
66 ++halfmove_counter;
68 void reset_halfmove() {
69 halfmove_counter = 0;
71 Square get_en_passant() const {
72 return en_passant;
74 void set_en_passant(Square ep) {
75 en_passant = ep;
77 Piece get_capture() const {
78 return capture;
80 void set_capture(Piece p) {
81 capture = p;
83 bool can_castle(Color c, PieceType t) const {
84 return castle_rights[2 * c + t - QUEEN];
86 void set_castle_right(Color c, PieceType t, bool b = true) {
87 castle_rights.set(2 * c + t - QUEEN, b);
89 bool has_castle(Color c) const {
90 return castle[c];
92 void set_has_castle(Color c, bool b = true) {
93 castle.set(c, b);
95 bool get_null_move_right() const {
96 return null_move_right;
98 void set_null_move_right(bool b) {
99 null_move_right = b;
103 #endif /* !NODE_H */