From 11c84472d4e510be3d5a6a7003646ce1f527f5cb Mon Sep 17 00:00:00 2001 From: Arthur Bols Date: Wed, 21 Dec 2022 21:05:05 +0100 Subject: [PATCH] [Move] Fix streaming with promotion --- Move.cpp | 3 ++- Piece.cpp | 44 ++++++++++++++++++++++++-------------------- Piece.hpp | 4 ++++ 3 files changed, 30 insertions(+), 21 deletions(-) diff --git a/Move.cpp b/Move.cpp index c1bb590..1037c71 100644 --- a/Move.cpp +++ b/Move.cpp @@ -1,6 +1,7 @@ #include "Move.hpp" #include +#include Move::Move(const Square &from, const Square &to, const std::optional &promotion) : mFrom(from), mTo(to), mPromotion(promotion) { @@ -41,7 +42,7 @@ std::optional Move::promotion() const { std::ostream &operator<<(std::ostream &os, const Move &move) { os << move.from() << move.to(); if (move.promotion().has_value()) { - os << static_cast(move.promotion().value()); + os << move.promotion().value(); } return os; } diff --git a/Piece.cpp b/Piece.cpp index 480dded..d7a70e5 100644 --- a/Piece.cpp +++ b/Piece.cpp @@ -35,38 +35,42 @@ std::optional Piece::pieceTypeFromSymbol(char symbol) { } } +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; + int typeNum = piece.toSymbol(); - switch (piece.type()) { - case PieceType::Pawn: typeNum = 'P'; - break; - case PieceType::Knight: typeNum = 'N'; - break; - case PieceType::Bishop: typeNum = 'B'; - break; - case PieceType::Rook:typeNum = 'R'; - break; - case PieceType::Queen: typeNum = 'Q'; - break; - case PieceType::King: typeNum = 'K'; - break; - default: - return os; - } - - if (piece.color() == PieceColor::Black) { - typeNum = std::tolower(typeNum); + if (piece.color() == PieceColor::White) { + typeNum = std::toupper(typeNum); } os << static_cast(typeNum); return os; } +std::ostream &operator<<(std::ostream &os, const PieceType &pt) { + return os << Piece::toSymbol(pt); +} + PieceColor operator!(PieceColor color) { return static_cast((static_cast(color) + 1) % 2); } diff --git a/Piece.hpp b/Piece.hpp index 04d7d33..50fee55 100644 --- a/Piece.hpp +++ b/Piece.hpp @@ -18,6 +18,8 @@ enum class PieceType { King }; +std::ostream &operator<<(std::ostream &os, const PieceType &pt); + class Piece { public: @@ -27,11 +29,13 @@ public: Piece(PieceColor color, PieceType type); static Optional fromSymbol(char symbol); + static char toSymbol(PieceType type); static std::optional pieceTypeFromSymbol(char symbol); PieceColor color() const; PieceType type() const; + char toSymbol() const; private: const PieceColor mColor;