Files
cpl_cpp-project/Piece.cpp

78 lines
1.8 KiB
C++

#include "Piece.hpp"
#include <ostream>
Piece::Piece(PieceColor color, PieceType type) : mColor(color), mType(type) {
}
Piece::Optional Piece::fromSymbol(char symbol) {
PieceColor color = std::isupper(symbol) ? PieceColor::White : PieceColor::Black;
auto type = pieceTypeFromSymbol(symbol);
if (!type.has_value()) {
return std::nullopt;
}
return Piece(color, type.value());
}
PieceColor Piece::color() const {
return mColor;
}
PieceType Piece::type() const {
return mType;
}
std::optional<PieceType> Piece::pieceTypeFromSymbol(char symbol) {
switch (toupper(symbol)) {
case 'P': return PieceType::Pawn;
case 'N': return PieceType::Knight;
case 'B': return PieceType::Bishop;
case 'R': return PieceType::Rook;
case 'Q': return PieceType::Queen;
case 'K': return PieceType::King;
default: return std::nullopt;
}
}
char Piece::toSymbol() const {
return toSymbol(mType);
}
char Piece::toSymbol(PieceType type) {
switch (type) {
case PieceType::Pawn: return 'p';
case PieceType::Knight: return 'n';
case PieceType::Bishop: return 'b';
case PieceType::Rook: return 'r';
case PieceType::Queen: return 'q';
case PieceType::King: return 'k';
}
return '\0';
}
bool operator==(const Piece &lhs, const Piece &rhs) {
return lhs.color() == rhs.color() && lhs.type() == rhs.type();
}
std::ostream &operator<<(std::ostream &os, const Piece &piece) {
int typeNum = piece.toSymbol();
if (piece.color() == PieceColor::White) {
typeNum = std::toupper(typeNum);
}
os << static_cast<char>(typeNum);
return os;
}
std::ostream &operator<<(std::ostream &os, const PieceType &pt) {
return os << Piece::toSymbol(pt);
}
PieceColor operator!(PieceColor color) {
return static_cast<PieceColor>((static_cast<int>(color) + 1) % 2);
}