130 lines
3.8 KiB
C++
130 lines
3.8 KiB
C++
#include "Square.hpp"
|
|
|
|
#include <ostream>
|
|
#include <iostream>
|
|
|
|
Square::Square(Index index) : mIndex(index) {
|
|
}
|
|
|
|
Square::Optional Square::fromCoordinates(Coordinate file, Coordinate rank) {
|
|
if (file > 7 || rank > 7) {
|
|
return std::nullopt;
|
|
}
|
|
|
|
return Square(rank * 8 + file);
|
|
}
|
|
|
|
Square::Optional Square::fromIndex(Index index) {
|
|
if (index >= 64)
|
|
return std::nullopt;
|
|
|
|
return Square(index);
|
|
}
|
|
|
|
Square::Optional Square::fromName(const std::string &name) {
|
|
if (name.length() != 2)
|
|
return std::nullopt;
|
|
|
|
auto file = static_cast<int>(name[0]) - 'a';
|
|
auto rank = static_cast<int>(name[1]) - '1';
|
|
|
|
return fromCoordinates(file, rank);
|
|
}
|
|
|
|
Square::Coordinate Square::file() const {
|
|
return mIndex % 8;
|
|
}
|
|
|
|
Square::Coordinate Square::rank() const {
|
|
return mIndex / 8;
|
|
}
|
|
|
|
Square::Index Square::index() const {
|
|
return mIndex;
|
|
}
|
|
|
|
const Square Square::A1 = Square(0 + 0);
|
|
const Square Square::B1 = Square(0 + 1);
|
|
const Square Square::C1 = Square(0 + 2);
|
|
const Square Square::D1 = Square(0 + 3);
|
|
const Square Square::E1 = Square(0 + 4);
|
|
const Square Square::F1 = Square(0 + 5);
|
|
const Square Square::G1 = Square(0 + 6);
|
|
const Square Square::H1 = Square(0 + 7);
|
|
|
|
const Square Square::A2 = Square(8 + 0);
|
|
const Square Square::B2 = Square(8 + 1);
|
|
const Square Square::C2 = Square(8 + 2);
|
|
const Square Square::D2 = Square(8 + 3);
|
|
const Square Square::E2 = Square(8 + 4);
|
|
const Square Square::F2 = Square(8 + 5);
|
|
const Square Square::G2 = Square(8 + 6);
|
|
const Square Square::H2 = Square(8 + 7);
|
|
|
|
const Square Square::A3 = Square(16 + 0);
|
|
const Square Square::B3 = Square(16 + 1);
|
|
const Square Square::C3 = Square(16 + 2);
|
|
const Square Square::D3 = Square(16 + 3);
|
|
const Square Square::E3 = Square(16 + 4);
|
|
const Square Square::F3 = Square(16 + 5);
|
|
const Square Square::G3 = Square(16 + 6);
|
|
const Square Square::H3 = Square(16 + 7);
|
|
|
|
const Square Square::A4 = Square(24 + 0);
|
|
const Square Square::B4 = Square(24 + 1);
|
|
const Square Square::C4 = Square(24 + 2);
|
|
const Square Square::D4 = Square(24 + 3);
|
|
const Square Square::E4 = Square(24 + 4);
|
|
const Square Square::F4 = Square(24 + 5);
|
|
const Square Square::G4 = Square(24 + 6);
|
|
const Square Square::H4 = Square(24 + 7);
|
|
|
|
const Square Square::A5 = Square(32 + 0);
|
|
const Square Square::B5 = Square(32 + 1);
|
|
const Square Square::C5 = Square(32 + 2);
|
|
const Square Square::D5 = Square(32 + 3);
|
|
const Square Square::E5 = Square(32 + 4);
|
|
const Square Square::F5 = Square(32 + 5);
|
|
const Square Square::G5 = Square(32 + 6);
|
|
const Square Square::H5 = Square(32 + 7);
|
|
|
|
const Square Square::A6 = Square(40 + 0);
|
|
const Square Square::B6 = Square(40 + 1);
|
|
const Square Square::C6 = Square(40 + 2);
|
|
const Square Square::D6 = Square(40 + 3);
|
|
const Square Square::E6 = Square(40 + 4);
|
|
const Square Square::F6 = Square(40 + 5);
|
|
const Square Square::G6 = Square(40 + 6);
|
|
const Square Square::H6 = Square(40 + 7);
|
|
|
|
const Square Square::A7 = Square(48 + 0);
|
|
const Square Square::B7 = Square(48 + 1);
|
|
const Square Square::C7 = Square(48 + 2);
|
|
const Square Square::D7 = Square(48 + 3);
|
|
const Square Square::E7 = Square(48 + 4);
|
|
const Square Square::F7 = Square(48 + 5);
|
|
const Square Square::G7 = Square(48 + 6);
|
|
const Square Square::H7 = Square(48 + 7);
|
|
|
|
const Square Square::A8 = Square(56 + 0);
|
|
const Square Square::B8 = Square(56 + 1);
|
|
const Square Square::C8 = Square(56 + 2);
|
|
const Square Square::D8 = Square(56 + 3);
|
|
const Square Square::E8 = Square(56 + 4);
|
|
const Square Square::F8 = Square(56 + 5);
|
|
const Square Square::G8 = Square(56 + 6);
|
|
const Square Square::H8 = Square(56 + 7);
|
|
|
|
std::ostream &operator<<(std::ostream &os, const Square &square) {
|
|
os << static_cast<char>(square.file() + 'a') << static_cast<char>(square.rank() + '1');
|
|
return os;
|
|
}
|
|
|
|
bool operator<(const Square &lhs, const Square &rhs) {
|
|
return lhs.index() < rhs.index();
|
|
}
|
|
|
|
bool operator==(const Square &lhs, const Square &rhs) {
|
|
return lhs.index() == rhs.index();
|
|
}
|