Belofte version 2.1.9
A promising chess program using the UCI or Winboard interface
basicmove.h
Go to the documentation of this file.
1/*---------------------------------------------------------------------+
2 * File: basicmove.h
3 * Project: part of belofte - A Promising Chess Program
4 * Author: yves
5 * SPDX-License-Identifier: GPL-2.0-only
6+----------------------------------------------------------------------*/
7
8#if !defined(BASICMOVE_H)
9#define BASICMOVE_H
10
11/** basicmove */
13public:
14 explicit bBasicMove()
15 {}
16 explicit bBasicMove(bBasicMove const& bm)
17 : u_bmove{bm.u_bmove}
18 {}
19 explicit bBasicMove(bBasicMove&& bm)
20 : u_bmove{std::move(bm.u_bmove)}
21 {}
22 explicit bBasicMove(bmove_t const bmt)
23 : u_bmove{bmt}
24 {}
25 explicit bBasicMove(case_t cf, case_t ct)
26 : m_from{cf}
27 , m_to{ct}
28 , m_decoration{0}
29 {}
30 virtual ~bBasicMove()
31 {}
32
34 { u_bmove = bm.u_bmove;
35 return *this;
36 }
38 { u_bmove = std::move(bm.u_bmove);
39 return *this;
40 }
41
42 constexpr bool operator==(bBasicMove const& r) const
43 { // flags can be different in case they are not set, it will still be the same move
44 // so if flags are different, we only compare fromto case and promotion part
45 return (u_bmove == r.u_bmove)
46 || ((m_fromto == r.m_fromto) && (m_promotion == r.m_promotion));
47 }
48 bool operator==(bmove_t const& r) const
49 { // flags can be different in case they are not set, it will still be the same move
50 // so if flags are different, we only compare fromto case and promotion part
51 bBasicMove rm(r);
52 return (u_bmove == rm.u_bmove)
53 || ((m_fromto == rm.m_fromto) && (m_promotion == rm.m_promotion));
54 }
55
56 constexpr case_t from() const
57 { return m_from; }
58 constexpr case_t to() const
59 { return m_to; }
60
61 constexpr rank_t fromrank() const
62 { return bCase::rank(m_from); }
63 constexpr column_t fromcolumn() const
64 { return bCase::column(m_from); }
65 constexpr rank_t torank() const
66 { return bCase::rank(m_to); }
67 constexpr column_t tocolumn() const
68 { return bCase::column(m_to); }
69
70 constexpr fromto_t getFromTo() const
71 { return m_fromto; }
72 constexpr bmove_t getBMoveT() const
73 { return u_bmove; }
74 constexpr ppiece_t getPromotion() const
75 { return m_promotion; }
76
77 constexpr bool isValid() const
78 { return m_fromto != 0; }
79 constexpr bool isNullMove() const
80 { return m_fromto == 0; }
81
82 constexpr bool isPromotion() const
83 { return m_promotion; }
84 constexpr bool isMajorPromotion() const
85 { return m_promotion == tPPiece::N_P_QUEEN; }
86 inline void setPromotion(const ppiece_t p)
87 { m_promotion = p;
88 m_flag |= 0x40;
89 }
92
93 constexpr bool isCapture() const
94 { return m_flag & 0x80; }
95 inline void setCapture()
96 { m_flag |= 0x80; }
97 constexpr bool isPawnMove() const
98 { return m_flag & 0x40; }
99 inline void setPawnMove()
100 { m_flag |= 0x40; }
101 constexpr bool isCastleMove() const
102 { return m_flag & (0x08 | 0x04); }
103 inline void setShortCastleMove()
104 { m_flag |= 0x04; }
105 inline void setLongCastleMove()
106 { m_flag |= 0x08; }
107 constexpr bool isLongCastleMove() const
108 { return m_flag & 0x08; }
109 constexpr bool isCheck() const
110 { return m_flag & 0x02; }
111 inline void setCheck()
112 { m_flag |= 0x02; }
113 inline void clearIsCheck()
114 { m_flag &= ~(0x02); }
115 constexpr bool getGameEnd() const
116 { return m_flag & 0x01; }
117 inline void setGameEnd()
118 { m_flag |= 0x01; }
119
120 constexpr bool isEPPossible() const
121 { return m_flag & 0x10; }
122 inline void setEPPossible()
123 { // mix pawn move flag
124 m_flag |= 0x10 | 0x40;
125 }
126 constexpr bool isEPMove() const
127 { return m_flag & 0x20; }
128 inline void setEPMove()
129 { // mix pawn move flag
130 m_flag |= 0x20 | 0x40;
131 }
132
133 constexpr bool isNonSilent() const
134 { return isCapture() || isPromotion() || isEPMove(); }
135
136 operator std::string() const;
137
138private:
139 union {
140 bmove_t u_bmove = 0UL; // initialise all subsequent fields to 0
141 struct {
142 union {
144 struct {
147 };
148 };
149 union {
150 uint16_t m_decoration;
151 struct {
152 uint8_t m_flag;
153 // 0b00000000 some flags are not set in basicmove
154 // ^ capture move - 0x80 - 128
155 // ^ pawn move - 0x40 - 64
156 // ^ ep move - 0x20 - 32
157 // ^ double pawn move - 0x10 - 16
158 // ^ long castle move - 0x08 - 8
159 // ^ short castle - 0x04 - 4
160 // ^ check move - 0x02 - 2
161 // ^ game end - 0x01 - 1
162 ppiece_t m_promotion; // 0 for no promotion
163 };
164 };
165 };
166 };
167
168private:
169 std::string const getPromotionDecorationStr() const;
170
171private:
172 friend std::ostream& operator<<(std::ostream& os, bBasicMove const& m);
173};
174
175#endif // defined BASICMOVE_H
176
177// eof
uint32_t bmove_t
Definition belofte.h:98
int8_t rank_t
Definition belofte.h:94
int8_t column_t
Definition belofte.h:95
uint16_t fromto_t
Definition belofte.h:97
uint8_t case_t
Definition belofte.h:96
ppiece_t m_promotion
Definition basicmove.h:162
void setCheck()
Definition basicmove.h:111
fromto_t m_fromto
Definition basicmove.h:143
constexpr bool isLongCastleMove() const
Definition basicmove.h:107
void setGameEnd()
Definition basicmove.h:117
piece_t getWhitePromotionPiece() const
Definition basicmove.cpp:19
bBasicMove(case_t cf, case_t ct)
Definition basicmove.h:25
constexpr bool isValid() const
Definition basicmove.h:77
constexpr rank_t fromrank() const
Definition basicmove.h:61
constexpr bool operator==(bBasicMove const &r) const
Definition basicmove.h:42
uint8_t m_flag
Definition basicmove.h:152
virtual ~bBasicMove()
Definition basicmove.h:30
void setEPPossible()
Definition basicmove.h:122
piece_t getBlackPromotionPiece() const
Definition basicmove.cpp:33
void clearIsCheck()
Definition basicmove.h:113
constexpr bool isCastleMove() const
Definition basicmove.h:101
constexpr column_t tocolumn() const
Definition basicmove.h:67
constexpr fromto_t getFromTo() const
Definition basicmove.h:70
bBasicMove(bBasicMove const &bm)
Definition basicmove.h:16
constexpr bool isNonSilent() const
Definition basicmove.h:133
void setPawnMove()
Definition basicmove.h:99
bBasicMove & operator=(bBasicMove &&bm)
Definition basicmove.h:37
constexpr bool isPawnMove() const
Definition basicmove.h:97
constexpr bool isEPPossible() const
Definition basicmove.h:120
constexpr bool isCapture() const
Definition basicmove.h:93
bBasicMove(bmove_t const bmt)
Definition basicmove.h:22
constexpr column_t fromcolumn() const
Definition basicmove.h:63
constexpr ppiece_t getPromotion() const
Definition basicmove.h:74
friend std::ostream & operator<<(std::ostream &os, bBasicMove const &m)
Definition basicmove.cpp:62
constexpr bool isNullMove() const
Definition basicmove.h:79
bmove_t u_bmove
Definition basicmove.h:140
constexpr case_t to() const
Definition basicmove.h:58
bBasicMove & operator=(bBasicMove const &bm)
Definition basicmove.h:33
constexpr bool isPromotion() const
Definition basicmove.h:82
void setLongCastleMove()
Definition basicmove.h:105
constexpr bool isEPMove() const
Definition basicmove.h:126
case_t m_to
Definition basicmove.h:146
bBasicMove(bBasicMove &&bm)
Definition basicmove.h:19
void setShortCastleMove()
Definition basicmove.h:103
constexpr bool isMajorPromotion() const
Definition basicmove.h:84
void setPromotion(const ppiece_t p)
Definition basicmove.h:86
void setCapture()
Definition basicmove.h:95
bool operator==(bmove_t const &r) const
Definition basicmove.h:48
case_t m_from
Definition basicmove.h:145
constexpr bool getGameEnd() const
Definition basicmove.h:115
constexpr bool isCheck() const
Definition basicmove.h:109
constexpr bmove_t getBMoveT() const
Definition basicmove.h:72
constexpr case_t from() const
Definition basicmove.h:56
uint16_t m_decoration
Definition basicmove.h:150
constexpr rank_t torank() const
Definition basicmove.h:65
void setEPMove()
Definition basicmove.h:128
constexpr rank_t rank() const
Definition case.h:43
constexpr column_t column() const
Definition case.h:41
enum tPPiece ppiece_t
Definition piece.h:52
enum tPiece piece_t
Definition piece.h:44
@ N_P_QUEEN
Definition piece.h:48