#include "CastlingRights.hpp" #include #include CastlingRights operator&(CastlingRights lhs, CastlingRights rhs) { using T = std::underlying_type_t; return static_cast(static_cast(lhs) & static_cast(rhs)); } CastlingRights& operator&=(CastlingRights& lhs, CastlingRights rhs) { lhs = lhs & rhs; return lhs; } CastlingRights operator|(CastlingRights lhs, CastlingRights rhs) { using T = std::underlying_type_t; return static_cast(static_cast(lhs) | static_cast(rhs)); } CastlingRights& operator|=(CastlingRights& lhs, CastlingRights rhs) { lhs = lhs | rhs; return lhs; } CastlingRights operator~(CastlingRights cr) { using T = std::underlying_type_t; return static_cast(~static_cast(cr)); } std::ostream& operator<<(std::ostream& os, CastlingRights cr) { if (cr == CastlingRights::None) { return os << "-"; } else { if ((cr & CastlingRights::WhiteKingside) != CastlingRights::None) { os << "K"; } if ((cr & CastlingRights::WhiteQueenside) != CastlingRights::None) { os << "Q"; } if ((cr & CastlingRights::BlackKingside) != CastlingRights::None) { os << "k"; } if ((cr & CastlingRights::BlackQueenside) != CastlingRights::None) { os << "q"; } return os; } }