1 /****************************************************************************
2 *   Copyright (C) 2015 by Jens Nissen jens-chessx@gmx.net                   *
3 ****************************************************************************/
4 
5 #ifndef PIECE_H
6 #define PIECE_H
7 
8 enum Piece
9 {
10     Empty,
11     WhiteKing, WhiteQueen, WhiteRook, WhiteBishop, WhiteKnight, WhitePawn,
12     BlackKing, BlackQueen, BlackRook, BlackBishop, BlackKnight, BlackPawn,
13     ConstPieceTypes,
14     InvalidPiece = 255
15 };
16 
17 // Pre-Increment
18 Piece& operator++(Piece& w);
19 
20 // Post-Increment
21 Piece operator++(Piece& w, int);
22 
23 enum PieceType { None, King, Queen, Rook, Bishop, Knight, Pawn };
24 
25 enum Color {White, Black, NoColor};
26 
27 /** Return opposite color */
oppositeColor(Color c)28 inline Color oppositeColor(Color c)
29 {
30     if (c == White) return Black;
31     else if (c == Black) return White;
32     return NoColor;
33 }
34 
35 /** Return true if given piece is White */
isWhite(Piece p)36 inline bool isWhite(Piece p)
37 {
38     return p >= WhiteKing && p <= WhitePawn;
39 }
40 
41 /** Return true if given piece is Black */
isBlack(Piece p)42 inline bool isBlack(Piece p)
43 {
44     return p >= BlackKing && p <= BlackPawn;
45 }
46 
47 /** Return PieceType of given Piece */
pieceType(Piece p)48 inline PieceType pieceType(Piece p)
49 {
50     return PieceType(isWhite(p) ? p : (isBlack(p) ? p - 6 : 0));
51 }
52 
53 /** Return Color of given Piece */
pieceColor(Piece p)54 inline Color pieceColor(Piece p)
55 {
56     return isBlack(p) ? Black : White;
57 }
58 
59 /** Verify that given Piece is within range */
isValidPiece(Piece p)60 inline bool isValidPiece(Piece p)
61 {
62     return isWhite(p) || isBlack(p);
63 }
64 
flipPiece(Piece p)65 inline Piece flipPiece(Piece p)
66 {
67     switch (p)
68     {
69     case WhiteKing:
70     case WhiteQueen:
71     case WhiteRook:
72     case WhiteBishop:
73     case WhiteKnight:
74     case WhitePawn:
75         return Piece((int)p+6);
76     case BlackKing:
77     case BlackQueen:
78     case BlackRook:
79     case BlackBishop:
80     case BlackKnight:
81     case BlackPawn:
82         return Piece((int)p-6);
83     default:
84         break;
85     }
86     return p;
87 }
88 
89 #endif // PIECE_H
90 
91