66 constexpr Move() : m_value(0) {}
67 constexpr Move(uint16_t value) : m_value(value) {}
70 : m_value((promotion << PROMO_SHIFT) | (flag << FLAG_SHIFT) | (to << TO_SHIFT) | from) {}
72 [[nodiscard]]
constexpr Square from()
const {
return m_value & Square::mask(); }
74 [[nodiscard]]
constexpr Square to()
const {
return (m_value >> TO_SHIFT) & Square::mask(); }
76 [[nodiscard]]
constexpr Flag flag()
const {
return (m_value >> FLAG_SHIFT) & Flag::mask(); }
78 [[nodiscard]]
constexpr Promotion promotion()
const {
return (m_value >> PROMO_SHIFT) & Promotion::mask(); }
80 constexpr operator uint16_t()
const {
return m_value; }
82 [[nodiscard]]
constexpr bool isNull()
const {
return m_value == 0; }
87 static constexpr int FROM_SHIFT = 0;
88 static constexpr int TO_SHIFT = Square::size();
89 static constexpr int FLAG_SHIFT = 2 * Square::size();
90 static constexpr int PROMO_SHIFT = FLAG_SHIFT + Flag::size();
102 constexpr Delta() : m_value(0) {}
104 constexpr Delta(
Piece captured,
Castling castling, uint8_t enpassant, uint8_t halfmoves, uint8_t extraFlags = 0)
105 : m_value((
static_cast<uint32_t
>(captured) << CAPTURE_SHIFT) |
106 (
static_cast<uint32_t
>(castling) << CASTLING_SHIFT) |
107 (
static_cast<uint32_t
>(enpassant) << ENPASSANT_SHIFT) |
108 (
static_cast<uint32_t
>(halfmoves) << HALFMOVES_SHIFT) |
109 (
static_cast<uint32_t
>(extraFlags) << EXTRA_SHIFT)) {}
111 constexpr Delta(uint32_t raw) : m_value(raw) {}
113 constexpr operator uint32_t()
const {
return m_value; }
115 [[nodiscard]]
constexpr Piece captured()
const {
return (m_value >> CAPTURE_SHIFT) & CAPTURE_MASK; }
116 [[nodiscard]]
constexpr Castling castling()
const {
117 return static_cast<Castling>((m_value >> CASTLING_SHIFT) & CASTLING_MASK);
119 [[nodiscard]]
constexpr uint8_t enpassant()
const {
return (m_value >> ENPASSANT_SHIFT) & ENPASSANT_MASK; }
120 [[nodiscard]]
constexpr uint8_t halfmoves()
const {
return (m_value >> HALFMOVES_SHIFT) & HALFMOVES_MASK; }
121 [[nodiscard]]
constexpr uint8_t extraFlags()
const {
return (m_value >> EXTRA_SHIFT) & EXTRA_MASK; }
126 static constexpr int CAPTURE_SHIFT = 0;
127 static constexpr int CASTLING_SHIFT = 4;
128 static constexpr int ENPASSANT_SHIFT = 8;
129 static constexpr int HALFMOVES_SHIFT = 14;
130 static constexpr int EXTRA_SHIFT = 22;
132 static constexpr uint32_t CAPTURE_MASK = 0xF;
133 static constexpr uint32_t CASTLING_MASK = 0xF;
134 static constexpr uint32_t ENPASSANT_MASK = 0x3F;
135 static constexpr uint32_t HALFMOVES_MASK = 0xFF;
136 static constexpr uint32_t EXTRA_MASK = 0x3;