38 constexpr FullMove(std::uint32_t m = 0) : m_(m){};
40 FullMove(colorT c, squareT kingSq, squareT rookSq)
42 :
FullMove(c, kingSq, rookSq, KING) {
46 FullMove(colorT c, squareT from, squareT to, pieceT pt) {
47 m_ = to | (from << 6) | (pt << 24) | (c << 27);
50 bool operator==(
FullMove const& f)
const {
return m_ == f.m_; }
60 explicit operator bool()
const {
return m_ != 0; }
61 bool isNull()
const {
return m_ == 0b01000001; }
62 bool isPromo()
const {
return (m_ & (3 << 14)) == (1 << 14); }
63 bool isEnpassant()
const {
return (m_ & (3 << 14)) == (2 << 14); }
64 bool isCastle()
const {
return (m_ & (3 << 14)) == (3 << 14); }
66 squareT getTo()
const {
return m_ & 0x3F; }
67 squareT getFrom()
const {
return (m_ >> 6) & 0x3F; }
68 pieceT getPiece()
const {
return (m_ >> 24) & 0x07; }
69 colorT getColor()
const {
return (m_ >> 27 & 1) ? BLACK : WHITE; }
70 pieceT getPromo()
const {
return ((m_ >> 12) & 0x03) +2; }
71 pieceT getCaptured()
const {
return (m_ >> 21) & 0x07; }
72 std::string getSAN()
const {
74 const auto to = getTo();
75 const auto from = getFrom();
76 if (to == 0 && from == 0)
return "--";
78 res = (to > from) ?
"O-O" :
"O-O-O";
79 bool check = (m_ >> 30) & 1;
84 bool fromFyle = (m_ >> 28) & 1;
85 bool fromRank = (m_ >> 29) & 1;
86 bool check = (m_ >> 30) & 1;
87 bool capture = (getCaptured() != 0);
90 case BISHOP: res +=
"B";
break;
91 case KNIGHT: res +=
"N";
break;
92 case ROOK: res +=
"R";
break;
93 case QUEEN: res +=
"Q";
break;
94 case KING: res +=
"K";
break;
96 if (capture) res +=
'a' + (from % 8);
98 if (fromFyle) res +=
'a' + (from % 8);
99 if (fromRank) res +=
'1' + (from / 8);
100 if (capture) res +=
"x";
101 res +=
'a' + (to % 8);
102 res +=
'1' + (to / 8);
104 switch (getPromo()) {
105 case BISHOP: res +=
"=B";
break;
106 case KNIGHT: res +=
"=N";
break;
107 case ROOK: res +=
"=R";
break;
108 case QUEEN: res +=
"=Q";
break;
111 if (check) res +=
"+";
115 void setPromo(pieceT promo) {
116 assert(promo == QUEEN || promo == ROOK || promo == BISHOP ||
118 m_ |= ((promo - 2) << 12) | (1 << 14);
120 void setCapture(pieceT piece,
bool enPassant) {
121 m_ |= ((piece & 0x07) << 21);
122 if (enPassant) m_ |= (2 << 14);
124 void setAmbiguity(
bool fyle,
bool rank) {
131 void setCheck() { m_ |= (1 << 30); }