Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef PIECE_H
00025 #define PIECE_H
00026
00027 #ifndef USE_PCH
00028 #endif
00029
00030 #include "Code.h"
00031 #include "Flags.h"
00032
00033 namespace cwchess {
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045 class Piece {
00046 protected:
00047 Code M_code;
00048 Flags M_flags;
00049
00050 public:
00051
00052
00053
00054
00055
00056 Piece(void) : M_code(), M_flags(fl_none) { }
00057
00058
00059
00060
00061
00062
00063
00064 Piece(Color const& color, Type const& type, Flags const& flags) : M_code(color, type), M_flags(flags) { }
00065
00066
00067
00068
00069
00070
00071 Piece(Color const& color, Type const& type) : M_code(color, type), M_flags(fl_none) { }
00072
00073
00074
00075
00076
00077
00078 Piece(Code const& code, Flags const& flags) : M_code(code), M_flags(flags) { }
00079
00080
00081 Piece(Piece const& piece) : M_code(piece.M_code), M_flags(piece.M_flags) { }
00082
00083
00084
00085
00086
00087
00088
00089 Piece& operator=(Piece const& piece) { M_code = piece.M_code; M_flags = piece.M_flags; return* this; }
00090
00091
00092 Piece& operator=(Color const& color) { M_code = color; return* this; }
00093
00094
00095 Piece& operator=(Type const& type) { M_code = type; return* this; }
00096
00097
00098 Piece& operator=(Code const& code) { M_code = code; return* this; }
00099
00100
00101 Piece& operator=(Flags const& flags) { M_flags = flags; return* this; }
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112 Color color(void) const { return M_code.color(); }
00113
00114
00115 Type type(void) const { return M_code.type(); }
00116
00117
00118 Flags flags(void) const { return M_flags; }
00119
00120
00121 Code code(void) const { return M_code; }
00122
00123
00124
00125 private:
00126 friend class ChessPosition;
00127 #ifdef PIECE_TEST_H
00128 friend class testsuite::PieceTest;
00129 #endif
00130
00131
00132 void set_flags(Flags const& flags) { M_flags = flags; }
00133
00134
00135 void set_type(Type const& type) { if (type == nothing) { M_code.clear(); M_flags.clear(); } else M_code = type; }
00136
00137
00138 void reset_can_take_queen_side(void) { M_flags.reset(fl_pawn_can_take_queen_side); }
00139
00140
00141 void reset_can_take_king_side(void) { M_flags.reset(fl_pawn_can_take_king_side); }
00142
00143
00144 void reset_is_not_blocked(void) { M_flags.reset(fl_pawn_is_not_blocked|fl_pawn_can_move_two_squares); }
00145
00146
00147 void reset_can_move_two_squares(void) { M_flags.reset(fl_pawn_can_move_two_squares); }
00148
00149
00150 void set_can_take_queen_side(void) { M_flags.set(fl_pawn_can_take_queen_side); }
00151
00152
00153 void set_can_take_king_side(void) { M_flags.set(fl_pawn_can_take_king_side); }
00154
00155
00156 void set_is_not_blocked(void) { M_flags.set(fl_pawn_is_not_blocked); }
00157
00158
00159 void set_can_move_two_squares(void) { M_flags.set(fl_pawn_can_move_two_squares); }
00160
00161
00162 void set_can_move_two_squares_if_not_blocked(void) { M_flags.set_can_move_two_squares_if_not_blocked(); }
00163
00164 public:
00165
00166
00167
00168
00169
00170
00171
00172 friend bool operator==(Piece const& piece1, Piece const& piece2) { return piece1.M_code == piece2.M_code; }
00173
00174
00175
00176
00177
00178 friend bool operator!=(Piece const& piece1, Piece const& piece2) { return piece1.M_code != piece2.M_code; }
00179
00180
00181 friend bool operator==(Piece const& piece, Type const& type) { return piece.M_code.is_a(type); }
00182
00183
00184 friend bool operator==(Type const& type, Piece const& piece) { return piece.M_code.is_a(type); }
00185
00186
00187 friend bool operator!=(Piece const& piece, Type const& type) { return !piece.M_code.is_a(type); }
00188
00189
00190 friend bool operator!=(Type const& type, Piece const& piece) { return !piece.M_code.is_a(type); }
00191
00192
00193 friend bool operator==(Piece const& piece, Color const& color) { return piece.M_code.is(color); }
00194
00195
00196 friend bool operator==(Color const& color, Piece const& piece) { return piece.M_code.is(color); }
00197
00198
00199 friend bool operator!=(Piece const& piece, Color const& color) { return !piece.M_code.is(color); }
00200
00201
00202 friend bool operator!=(Color const& color, Piece const& piece) { return !piece.M_code.is(color); }
00203
00204
00205 friend bool operator==(Piece const& piece, Code const& code) { return piece.M_code == code; }
00206
00207
00208 friend bool operator==(Code const& code, Piece const& piece) { return piece.M_code == code; }
00209
00210
00211 friend bool operator!=(Piece const& piece, Code const& code) { return piece.M_code != code; }
00212
00213
00214 friend bool operator!=(Code const& code, Piece const& piece) { return piece.M_code != code; }
00215
00216
00217 };
00218
00219 }
00220
00221 #endif // PIECE_H