Chess Engine
A Chess Engine project written in C++.
Loading...
Searching...
No Matches
piece.hpp
1#pragma once
2
3#include <cassert>
4#include <cstdint>
5#include <ostream>
6#include <string_view>
7
8#include "iterator.hpp"
9
10struct PieceType : Iterable<PieceType> {
11 public:
12 enum : uint8_t {
13 PAWN = 0b000,
14 KNIGHT = 0b001,
15 BISHOP = 0b010,
16 ROOK = 0b011,
17 QUEEN = 0b100,
18 KING = 0b101,
19
20 FIRST = PAWN,
21 LAST = KING,
22
23 MASK = 0b111,
24 SIZE = 3,
25 NB = 6
26 };
27
28 constexpr PieceType(uint8_t value) : m_value(value) {}
29
30 [[nodiscard]] constexpr uint8_t value() const { return m_value; }
31
32 [[nodiscard]] static constexpr uint8_t number() { return NB; }
33 [[nodiscard]] static constexpr uint8_t mask() { return MASK; }
34 [[nodiscard]] static constexpr uint8_t size() { return SIZE; }
35
36 constexpr operator uint8_t() { return m_value; }
37
38 private:
39 uint8_t m_value;
40};
41
42struct Color : Iterable<Color> {
43 public:
44 enum : uint8_t {
45 WHITE = 0,
46 BLACK = 1,
47
48 MASK = 0b1,
49 SIZE = 1,
50 NB = 2
51 };
52
53 constexpr Color(uint8_t value) : m_value(value) {}
54
55 [[nodiscard]] constexpr uint8_t value() const { return m_value; }
56 [[nodiscard]] static constexpr uint8_t number() { return NB; }
57 [[nodiscard]] static constexpr uint8_t mask() { return MASK; }
58 [[nodiscard]] static constexpr uint8_t size() { return SIZE; }
59
60 constexpr operator uint8_t() { return m_value; }
61
62 private:
63 uint8_t m_value;
64};
65
66struct Piece {
67 enum : uint8_t {
68 W_PAWN = (Color::WHITE << PieceType::size()) | PieceType::PAWN,
69 W_KNIGHT = (Color::WHITE << PieceType::size()) | PieceType::KNIGHT,
70 W_BISHOP = (Color::WHITE << PieceType::size()) | PieceType::BISHOP,
71 W_ROOK = (Color::WHITE << PieceType::size()) | PieceType::ROOK,
72 W_QUEEN = (Color::WHITE << PieceType::size()) | PieceType::QUEEN,
73 W_KING = (Color::WHITE << PieceType::size()) | PieceType::KING,
74
75 B_PAWN = (Color::BLACK << PieceType::size()) | PieceType::PAWN,
76 B_KNIGHT = (Color::BLACK << PieceType::size()) | PieceType::KNIGHT,
77 B_BISHOP = (Color::BLACK << PieceType::size()) | PieceType::BISHOP,
78 B_ROOK = (Color::BLACK << PieceType::size()) | PieceType::ROOK,
79 B_QUEEN = (Color::BLACK << PieceType::size()) | PieceType::QUEEN,
80 B_KING = (Color::BLACK << PieceType::size()) | PieceType::KING,
81
82 FIRST = W_PAWN,
83 LAST = B_KING,
84
85 NONE = 0b1111,
86 MASK = 0b1111,
87 SIZE = 4,
88 NB = 12
89 };
90
91 static constexpr std::string_view pieceToChar = "PNBRQK pnbrqk";
92
93 constexpr Piece(uint8_t value = none()) : m_value(value) {}
94 explicit constexpr Piece(PieceType pieceType, Color color) : m_value((color << PieceType::size()) | pieceType) {}
95
96 explicit constexpr Piece(char c) {
97 size_t index = pieceToChar.find(c);
98 m_value = (index != std::string_view::npos) ? static_cast<uint8_t>(index) : 0;
99 }
100
101 [[nodiscard]] constexpr uint8_t value() const { return m_value; }
102
103 [[nodiscard]] constexpr bool ok() const { return m_value <= LAST && m_value != 6 && m_value != 7; }
104
105 [[nodiscard]] static constexpr Piece none() { return Piece::NONE; }
106
107 [[nodiscard]] constexpr Color color() const { return m_value >> PieceType::size(); }
108 [[nodiscard]] constexpr Color pieceType() const { return m_value & PieceType::mask(); }
109
110 [[nodiscard]] static constexpr uint8_t number() { return NB; }
111 [[nodiscard]] static constexpr uint8_t mask() { return MASK; }
112 [[nodiscard]] static constexpr uint8_t size() { return SIZE; }
113
114 [[nodiscard]] static constexpr Piece first() { return Piece::FIRST; }
115 [[nodiscard]] static constexpr Piece last() { return Piece::LAST; }
116
117 class Iterator {
118 private:
119 uint8_t m_current;
120 constexpr void skipInvalid() {
121 while (m_current <= Piece::LAST && !Piece(m_current).ok()) {
122 ++m_current;
123 }
124 }
125
126 public:
127 using iterator_category = std::forward_iterator_tag;
128 using value_type = Piece;
129 using difference_type = std::ptrdiff_t;
130 using pointer = const Piece*;
131 using reference = const Piece&;
132
133 constexpr Iterator(uint8_t value) : m_current(value) { skipInvalid(); }
134
135 constexpr Piece operator*() const { return m_current; }
136
137 constexpr Iterator& operator++() {
138 ++m_current;
139 skipInvalid();
140 return *this;
141 }
142
143 constexpr Iterator operator++(int) {
144 Iterator tmp = *this;
145 ++m_current;
146 skipInvalid();
147 return tmp;
148 }
149
150 constexpr bool operator==(const Iterator& other) const { return m_current == other.m_current; }
151
152 constexpr bool operator!=(const Iterator& other) const { return m_current != other.m_current; }
153 };
154
155 class Range {
156 public:
157 [[nodiscard]] constexpr Iterator begin() const { return Piece::FIRST; }
158 [[nodiscard]] constexpr Iterator end() const { return Piece::LAST + 1; }
159 };
160
161 [[nodiscard]] static constexpr Range all() { return Range{}; }
162
163 constexpr operator uint8_t() { return m_value; }
164
165 friend std::ostream& operator<<(std::ostream& os, const Piece& obj) {
166 obj.print(os);
167 return os;
168 }
169
170 void print(std::ostream& os) const { os << to_char(); }
171
172 [[nodiscard]] char constexpr to_char() const { return ok() ? pieceToChar[m_value] : '?'; }
173
174 private:
175 uint8_t m_value;
176};
Definition piece.hpp:117
Definition piece.hpp:155
Definition piece.hpp:42
Definition iterator.hpp:6
Definition piece.hpp:10