/*
 
    Texel - A UCI chess engine.
 
    Copyright (C) 2012-2013  Peter Ă–sterlund, peterosterlund2@gmail.com
 
 
 
    This program is free software: you can redistribute it and/or modify
 
    it under the terms of the GNU General Public License as published by
 
    the Free Software Foundation, either version 3 of the License, or
 
    (at your option) any later version.
 
 
 
    This program is distributed in the hope that it will be useful,
 
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
    GNU General Public License for more details.
 
 
 
    You should have received a copy of the GNU General Public License
 
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
*/
 
 
 
/*
 
 * piece.hpp
 
 *
 
 *  Created on: Feb 25, 2012
 
 *      Author: petero
 
 */
 
 
 
#ifndef PIECE_HPP_
 
#define PIECE_HPP_
 
 
 
/**
 
 * Constants for different piece types.
 
 */
 
class Piece {
 
public:
 
    enum Type {
 
      EMPTY = 0,
 
      WKING = 1,
 
      WQUEEN = 2,
 
      WROOK = 3,
 
      WBISHOP = 4,
 
      WKNIGHT = 5,
 
      WPAWN = 6,
 
 
 
      BKING = 7,
 
      BQUEEN = 8,
 
      BROOK = 9,
 
      BBISHOP = 10,
 
      BKNIGHT = 11,
 
      BPAWN = 12,
 
 
 
      nPieceTypes = 13
 
    };
 
 
 
    /**
 
     * Return true if p is a white piece, false otherwise.
 
     * Note that if p is EMPTY, an unspecified value is returned.
 
     */
 
    static bool isWhite(int pType);
 
 
 
    static int makeWhite(int pType);
 
 
 
    static int makeBlack(int pType);
 
};
 
 
 
template <bool wtm> struct ColorTraits {
 
};
 
 
 
template<> struct ColorTraits<true> {
 
    static const Piece::Type KING   = Piece::WKING;
 
    static const Piece::Type QUEEN  = Piece::WQUEEN;
 
    static const Piece::Type ROOK   = Piece::WROOK;
 
    static const Piece::Type BISHOP = Piece::WBISHOP;
 
    static const Piece::Type KNIGHT = Piece::WKNIGHT;
 
    static const Piece::Type PAWN   = Piece::WPAWN;
 
};
 
 
 
template<> struct ColorTraits<false> {
 
    static const Piece::Type KING   = Piece::BKING;
 
    static const Piece::Type QUEEN  = Piece::BQUEEN;
 
    static const Piece::Type ROOK   = Piece::BROOK;
 
    static const Piece::Type BISHOP = Piece::BBISHOP;
 
    static const Piece::Type KNIGHT = Piece::BKNIGHT;
 
    static const Piece::Type PAWN   = Piece::BPAWN;
 
};
 
 
 
inline bool
 
Piece::isWhite(int pType) {
 
    return pType < BKING;
 
}
 
 
 
inline int
 
Piece::makeWhite(int pType) {
 
    return pType < BKING ? pType : pType - (BKING - WKING);
 
}
 
 
 
inline int
 
Piece::makeBlack(int pType) {
 
    return ((pType > EMPTY) && (pType < BKING)) ? pType + (BKING - WKING) : pType;
 
}
 
 
 
#endif /* PIECE_HPP_ */