Scid  4.7.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
sqmove.h
Go to the documentation of this file.
1 //////////////////////////////////////////////////////////////////////
2 //
3 // FILE: sqmove.h
4 // Square movement lookup table
5 //
6 // Part of: Scid (Shane's Chess Information Database)
7 // Version: 3.4
8 //
9 // Notice: Copyright (c) 1999-2002 Shane Hudson. All rights reserved.
10 //
11 // Author: Shane Hudson (sgh@users.sourceforge.net)
12 //
13 //////////////////////////////////////////////////////////////////////
14 
15 #ifndef SCID_SQMOVE_H
16 #define SCID_SQMOVE_H
17 
18 #include "common.h"
19 
20 constexpr uint MAX_SQUARELIST = 65; // 64 squares plus null square
21 
22 class SquareList {
23  uint ListSize;
24  squareT Squares[MAX_SQUARELIST];
25 
26 public:
27  SquareList() { ListSize = 0; }
28 
29  void Init() { ListSize = 0; }
30  void Clear() { ListSize = 0; }
31  void Add(squareT sq) {
32  Squares[ListSize] = sq;
33  ListSize++;
34  }
35  uint Size() { return ListSize; }
36 
37  squareT Get(uint index) {
38  ASSERT(index < ListSize);
39  return Squares[index];
40  }
41 
43  for (uint i = 0; i < ListSize; i++) {
44  if (Squares[i] == sq) {
45  return true;
46  }
47  }
48  return false;
49  }
50 
51  void Remove(uint index) {
52  ASSERT(index < ListSize);
53  ListSize--;
54  if (index != ListSize) {
55  Squares[index] = Squares[ListSize];
56  }
57  }
58 };
59 
60 class SquareSet {
61  uint Bits_a1h4;
62  uint Bits_a5h8;
63 
64 public:
65  SquareSet() { Bits_a1h4 = Bits_a5h8 = 0; }
66  SquareSet(squareT* squares) {
67  Bits_a1h4 = Bits_a5h8 = 0;
68  AddAll(squares);
69  }
70 
71  void Clear(void) { Bits_a1h4 = Bits_a5h8 = 0; }
72  void AddAll(void) { Bits_a1h4 = Bits_a5h8 = 0xFFFFFFFFu; }
73 
74  void Add(squareT sq) {
75  ASSERT(sq <= H8);
76  if (sq <= H4) {
77  Bits_a1h4 |= (1 << sq);
78  } else {
79  Bits_a5h8 |= (1 << (sq & 31));
80  }
81  }
82 
83  void AddAll(squareT* squares) {
84  while (true) {
85  squareT sq = *squares;
86  if (sq == NULL_SQUARE) {
87  break;
88  }
89  ASSERT(sq <= H8);
90  squares++;
91  if (sq <= H4) {
92  Bits_a1h4 |= (1 << sq);
93  } else {
94  Bits_a5h8 |= (1 << (sq & 31));
95  }
96  }
97  }
98 
100  ASSERT(sq <= H8);
101  if (sq <= H4) {
102  return (Bits_a1h4 & (1 << sq)) != 0;
103  } else {
104  return (Bits_a5h8 & (1 << (sq & 31))) != 0;
105  }
106  }
107 
108  void Remove(squareT sq) {
109  ASSERT(sq <= H8);
110  if (sq <= H4) {
111  Bits_a1h4 &= ~(1 << sq);
112  } else {
113  Bits_a5h8 &= ~(1 << (sq & 31));
114  }
115  }
116 };
117 
118 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~
119 // sqMove
120 // Array indexed by square value and direction, giving the square
121 // obtained by moving from the square in that direction.
122 constexpr squareT
123 sqMove[66][11] = {
124  /* UP DOWN LEFT UL DL RIGHT UR DR */
125  { /* A1 */ NS, A2, NS, NS, NS, NS, NS, NS, B1, B2, NS },
126  { /* B1 */ NS, B2, NS, NS, A1, A2, NS, NS, C1, C2, NS },
127  { /* C1 */ NS, C2, NS, NS, B1, B2, NS, NS, D1, D2, NS },
128  { /* D1 */ NS, D2, NS, NS, C1, C2, NS, NS, E1, E2, NS },
129  { /* E1 */ NS, E2, NS, NS, D1, D2, NS, NS, F1, F2, NS },
130  { /* F1 */ NS, F2, NS, NS, E1, E2, NS, NS, G1, G2, NS },
131  { /* G1 */ NS, G2, NS, NS, F1, F2, NS, NS, H1, H2, NS },
132  { /* H1 */ NS, H2, NS, NS, G1, G2, NS, NS, NS, NS, NS },
133  { /* A2 */ NS, A3, A1, NS, NS, NS, NS, NS, B2, B3, B1 },
134  { /* B2 */ NS, B3, B1, NS, A2, A3, A1, NS, C2, C3, C1 },
135  { /* C2 */ NS, C3, C1, NS, B2, B3, B1, NS, D2, D3, D1 },
136  { /* D2 */ NS, D3, D1, NS, C2, C3, C1, NS, E2, E3, E1 },
137  { /* E2 */ NS, E3, E1, NS, D2, D3, D1, NS, F2, F3, F1 },
138  { /* F2 */ NS, F3, F1, NS, E2, E3, E1, NS, G2, G3, G1 },
139  { /* G2 */ NS, G3, G1, NS, F2, F3, F1, NS, H2, H3, H1 },
140  { /* H2 */ NS, H3, H1, NS, G2, G3, G1, NS, NS, NS, NS },
141  { /* A3 */ NS, A4, A2, NS, NS, NS, NS, NS, B3, B4, B2 },
142  { /* B3 */ NS, B4, B2, NS, A3, A4, A2, NS, C3, C4, C2 },
143  { /* C3 */ NS, C4, C2, NS, B3, B4, B2, NS, D3, D4, D2 },
144  { /* D3 */ NS, D4, D2, NS, C3, C4, C2, NS, E3, E4, E2 },
145  { /* E3 */ NS, E4, E2, NS, D3, D4, D2, NS, F3, F4, F2 },
146  { /* F3 */ NS, F4, F2, NS, E3, E4, E2, NS, G3, G4, G2 },
147  { /* G3 */ NS, G4, G2, NS, F3, F4, F2, NS, H3, H4, H2 },
148  { /* H3 */ NS, H4, H2, NS, G3, G4, G2, NS, NS, NS, NS },
149  { /* A4 */ NS, A5, A3, NS, NS, NS, NS, NS, B4, B5, B3 },
150  { /* B4 */ NS, B5, B3, NS, A4, A5, A3, NS, C4, C5, C3 },
151  { /* C4 */ NS, C5, C3, NS, B4, B5, B3, NS, D4, D5, D3 },
152  { /* D4 */ NS, D5, D3, NS, C4, C5, C3, NS, E4, E5, E3 },
153  { /* E4 */ NS, E5, E3, NS, D4, D5, D3, NS, F4, F5, F3 },
154  { /* F4 */ NS, F5, F3, NS, E4, E5, E3, NS, G4, G5, G3 },
155  { /* G4 */ NS, G5, G3, NS, F4, F5, F3, NS, H4, H5, H3 },
156  { /* H4 */ NS, H5, H3, NS, G4, G5, G3, NS, NS, NS, NS },
157  { /* A5 */ NS, A6, A4, NS, NS, NS, NS, NS, B5, B6, B4 },
158  { /* B5 */ NS, B6, B4, NS, A5, A6, A4, NS, C5, C6, C4 },
159  { /* C5 */ NS, C6, C4, NS, B5, B6, B4, NS, D5, D6, D4 },
160  { /* D5 */ NS, D6, D4, NS, C5, C6, C4, NS, E5, E6, E4 },
161  { /* E5 */ NS, E6, E4, NS, D5, D6, D4, NS, F5, F6, F4 },
162  { /* F5 */ NS, F6, F4, NS, E5, E6, E4, NS, G5, G6, G4 },
163  { /* G5 */ NS, G6, G4, NS, F5, F6, F4, NS, H5, H6, H4 },
164  { /* H5 */ NS, H6, H4, NS, G5, G6, G4, NS, NS, NS, NS },
165  { /* A6 */ NS, A7, A5, NS, NS, NS, NS, NS, B6, B7, B5 },
166  { /* B6 */ NS, B7, B5, NS, A6, A7, A5, NS, C6, C7, C5 },
167  { /* C6 */ NS, C7, C5, NS, B6, B7, B5, NS, D6, D7, D5 },
168  { /* D6 */ NS, D7, D5, NS, C6, C7, C5, NS, E6, E7, E5 },
169  { /* E6 */ NS, E7, E5, NS, D6, D7, D5, NS, F6, F7, F5 },
170  { /* F6 */ NS, F7, F5, NS, E6, E7, E5, NS, G6, G7, G5 },
171  { /* G6 */ NS, G7, G5, NS, F6, F7, F5, NS, H6, H7, H5 },
172  { /* H6 */ NS, H7, H5, NS, G6, G7, G5, NS, NS, NS, NS },
173  { /* A7 */ NS, A8, A6, NS, NS, NS, NS, NS, B7, B8, B6 },
174  { /* B7 */ NS, B8, B6, NS, A7, A8, A6, NS, C7, C8, C6 },
175  { /* C7 */ NS, C8, C6, NS, B7, B8, B6, NS, D7, D8, D6 },
176  { /* D7 */ NS, D8, D6, NS, C7, C8, C6, NS, E7, E8, E6 },
177  { /* E7 */ NS, E8, E6, NS, D7, D8, D6, NS, F7, F8, F6 },
178  { /* F7 */ NS, F8, F6, NS, E7, E8, E6, NS, G7, G8, G6 },
179  { /* G7 */ NS, G8, G6, NS, F7, F8, F6, NS, H7, H8, H6 },
180  { /* H7 */ NS, H8, H6, NS, G7, G8, G6, NS, NS, NS, NS },
181  { /* A8 */ NS, NS, A7, NS, NS, NS, NS, NS, B8, NS, B7 },
182  { /* B8 */ NS, NS, B7, NS, A8, NS, A7, NS, C8, NS, C7 },
183  { /* C8 */ NS, NS, C7, NS, B8, NS, B7, NS, D8, NS, D7 },
184  { /* D8 */ NS, NS, D7, NS, C8, NS, C7, NS, E8, NS, E7 },
185  { /* E8 */ NS, NS, E7, NS, D8, NS, D7, NS, F8, NS, F7 },
186  { /* F8 */ NS, NS, F7, NS, E8, NS, E7, NS, G8, NS, G7 },
187  { /* G8 */ NS, NS, G7, NS, F8, NS, F7, NS, H8, NS, H7 },
188  { /* H8 */ NS, NS, H7, NS, G8, NS, G7, NS, NS, NS, NS },
189  { /* NS */ NS, NS, NS, NS, NS, NS, NS, NS, NS, NS, NS },
190  { /* NS */ NS, NS, NS, NS, NS, NS, NS, NS, NS, NS, NS }
191  };
192 
193 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~
194 // sqLast
195 // Array indexed by square value and direction, giving the last
196 // square reached by moving from the square in that direction.
197 // The last square is the same as the original square if moving
198 // in the specified direction would move off the board.
199 constexpr squareT
200 sqLast[66][11] = {
201  /* UP DOWN LEFT UL DL RIGHT UR DR */
202  { /* A1 */ NS, A8, A1, NS, A1, A1, A1, NS, H1, H8, A1 },
203  { /* B1 */ NS, B8, B1, NS, A1, A2, B1, NS, H1, H7, B1 },
204  { /* C1 */ NS, C8, C1, NS, A1, A3, C1, NS, H1, H6, C1 },
205  { /* D1 */ NS, D8, D1, NS, A1, A4, D1, NS, H1, H5, D1 },
206  { /* E1 */ NS, E8, E1, NS, A1, A5, E1, NS, H1, H4, E1 },
207  { /* F1 */ NS, F8, F1, NS, A1, A6, F1, NS, H1, H3, F1 },
208  { /* G1 */ NS, G8, G1, NS, A1, A7, G1, NS, H1, H2, G1 },
209  { /* H1 */ NS, H8, H1, NS, A1, A8, H1, NS, H1, H1, H1 },
210  { /* A2 */ NS, A8, A1, NS, A2, A2, A2, NS, H2, G8, B1 },
211  { /* B2 */ NS, B8, B1, NS, A2, A3, A1, NS, H2, H8, C1 },
212  { /* C2 */ NS, C8, C1, NS, A2, A4, B1, NS, H2, H7, D1 },
213  { /* D2 */ NS, D8, D1, NS, A2, A5, C1, NS, H2, H6, E1 },
214  { /* E2 */ NS, E8, E1, NS, A2, A6, D1, NS, H2, H5, F1 },
215  { /* F2 */ NS, F8, F1, NS, A2, A7, E1, NS, H2, H4, G1 },
216  { /* G2 */ NS, G8, G1, NS, A2, A8, F1, NS, H2, H3, H1 },
217  { /* H2 */ NS, H8, H1, NS, A2, B8, G1, NS, H2, H2, H2 },
218  { /* A3 */ NS, A8, A1, NS, A3, A3, A3, NS, H3, F8, C1 },
219  { /* B3 */ NS, B8, B1, NS, A3, A4, A2, NS, H3, G8, D1 },
220  { /* C3 */ NS, C8, C1, NS, A3, A5, A1, NS, H3, H8, E1 },
221  { /* D3 */ NS, D8, D1, NS, A3, A6, B1, NS, H3, H7, F1 },
222  { /* E3 */ NS, E8, E1, NS, A3, A7, C1, NS, H3, H6, G1 },
223  { /* F3 */ NS, F8, F1, NS, A3, A8, D1, NS, H3, H5, H1 },
224  { /* G3 */ NS, G8, G1, NS, A3, B8, E1, NS, H3, H4, H2 },
225  { /* H3 */ NS, H8, H1, NS, A3, C8, F1, NS, H3, H3, H3 },
226  { /* A4 */ NS, A8, A1, NS, A4, A4, A4, NS, H4, E8, D1 },
227  { /* B4 */ NS, B8, B1, NS, A4, A5, A3, NS, H4, F8, E1 },
228  { /* C4 */ NS, C8, C1, NS, A4, A6, A2, NS, H4, G8, F1 },
229  { /* D4 */ NS, D8, D1, NS, A4, A7, A1, NS, H4, H8, G1 },
230  { /* E4 */ NS, E8, E1, NS, A4, A8, B1, NS, H4, H7, H1 },
231  { /* F4 */ NS, F8, F1, NS, A4, B8, C1, NS, H4, H6, H2 },
232  { /* G4 */ NS, G8, G1, NS, A4, C8, D1, NS, H4, H5, H3 },
233  { /* H4 */ NS, H8, H1, NS, A4, D8, E1, NS, H4, H4, H4 },
234  { /* A5 */ NS, A8, A1, NS, A5, A5, A5, NS, H5, D8, E1 },
235  { /* B5 */ NS, B8, B1, NS, A5, A6, A4, NS, H5, E8, F1 },
236  { /* C5 */ NS, C8, C1, NS, A5, A7, A3, NS, H5, F8, G1 },
237  { /* D5 */ NS, D8, D1, NS, A5, A8, A2, NS, H5, G8, H1 },
238  { /* E5 */ NS, E8, E1, NS, A5, B8, A1, NS, H5, H8, H2 },
239  { /* F5 */ NS, F8, F1, NS, A5, C8, B1, NS, H5, H7, H3 },
240  { /* G5 */ NS, G8, G1, NS, A5, D8, C1, NS, H5, H6, H4 },
241  { /* H5 */ NS, H8, H1, NS, A5, E8, D1, NS, H5, H5, H5 },
242  { /* A6 */ NS, A8, A1, NS, A6, A6, A6, NS, H6, C8, F1 },
243  { /* B6 */ NS, B8, B1, NS, A6, A7, A5, NS, H6, D8, G1 },
244  { /* C6 */ NS, C8, C1, NS, A6, A8, A4, NS, H6, E8, H1 },
245  { /* D6 */ NS, D8, D1, NS, A6, B8, A3, NS, H6, F8, H2 },
246  { /* E6 */ NS, E8, E1, NS, A6, C8, A2, NS, H6, G8, H3 },
247  { /* F6 */ NS, F8, F1, NS, A6, D8, A1, NS, H6, H8, H4 },
248  { /* G6 */ NS, G8, G1, NS, A6, E8, B1, NS, H6, H7, H5 },
249  { /* H6 */ NS, H8, H1, NS, A6, F8, C1, NS, H6, H6, H6 },
250  { /* A7 */ NS, A8, A1, NS, A7, A7, A7, NS, H7, B8, G1 },
251  { /* B7 */ NS, B8, B1, NS, A7, A8, A6, NS, H7, C8, H1 },
252  { /* C7 */ NS, C8, C1, NS, A7, B8, A5, NS, H7, D8, H2 },
253  { /* D7 */ NS, D8, D1, NS, A7, C8, A4, NS, H7, E8, H3 },
254  { /* E7 */ NS, E8, E1, NS, A7, D8, A3, NS, H7, F8, H4 },
255  { /* F7 */ NS, F8, F1, NS, A7, E8, A2, NS, H7, G8, H5 },
256  { /* G7 */ NS, G8, G1, NS, A7, F8, A1, NS, H7, H8, H6 },
257  { /* H7 */ NS, H8, H1, NS, A7, G8, B1, NS, H7, H7, H7 },
258  { /* A8 */ NS, A8, A1, NS, A8, A8, A8, NS, H8, A8, H1 },
259  { /* B8 */ NS, B8, B1, NS, A8, B8, A7, NS, H8, B8, H2 },
260  { /* C8 */ NS, C8, C1, NS, A8, C8, A6, NS, H8, C8, H3 },
261  { /* D8 */ NS, D8, D1, NS, A8, D8, A5, NS, H8, D8, H4 },
262  { /* E8 */ NS, E8, E1, NS, A8, E8, A4, NS, H8, E8, H5 },
263  { /* F8 */ NS, F8, F1, NS, A8, F8, A3, NS, H8, F8, H6 },
264  { /* G8 */ NS, G8, G1, NS, A8, G8, A2, NS, H8, G8, H7 },
265  { /* H8 */ NS, H8, H1, NS, A8, H8, A1, NS, H8, H8, H8 },
266  { /* NS */ NS, NS, NS, NS, NS, NS, NS, NS, NS, NS, NS },
267  { /* NS */ NS, NS, NS, NS, NS, NS, NS, NS, NS, NS, NS }
268 };
269 
270 // square_Move(): Return the new square resulting from moving in
271 // direction d from x.
272 constexpr squareT
274 {
275  return sqMove[sq][dir];
276 }
277 
278 // square_Last():
279 // Return the last square reached by moving as far as possible in
280 // the direction d from the square sq. If sq is a valid on-board
281 // square and d is a valid direction, the result will always be
282 // a valid on-board square; the result will be the same as the
283 // input square if moving in the specified direction would end
284 // up off the board.
285 constexpr squareT
287 {
288  return sqLast[sq][dir];
289 }
290 
291 #endif
292 
293 //////////////////////////////////////////////////////////////////////
294 // EOF: sqmove.h
295 //////////////////////////////////////////////////////////////////////
296 
const squareT F5
Definition: common.h:352
const squareT F2
Definition: common.h:349
const squareT C5
Definition: common.h:352
const squareT C4
Definition: common.h:351
const squareT C8
Definition: common.h:355
sqsqname
Definition: board.tcl:292
const squareT B3
Definition: common.h:350
const squareT F4
Definition: common.h:351
const squareT F8
Definition: common.h:355
const squareT H1
Definition: common.h:348
const squareT NULL_SQUARE
Definition: common.h:357
constexpr squareT sqLast[66][11]
Definition: sqmove.h:200
const squareT A4
Definition: common.h:351
const squareT D2
Definition: common.h:349
const squareT G6
Definition: common.h:353
constexpr squareT square_Move(squareT sq, directionT dir)
Definition: sqmove.h:273
void Clear(void)
Definition: sqmove.h:71
#define ASSERT(f)
Definition: common.h:59
const squareT H7
Definition: common.h:354
const squareT C1
Definition: common.h:348
const squareT H4
Definition: common.h:351
SquareSet()
Definition: sqmove.h:65
const squareT B5
Definition: common.h:352
const squareT E7
Definition: common.h:354
void Add(squareT sq)
Definition: sqmove.h:31
SquareList()
Definition: sqmove.h:27
const squareT G5
Definition: common.h:352
const squareT D7
Definition: common.h:354
const squareT A8
Definition: common.h:355
const squareT E6
Definition: common.h:353
const squareT H6
Definition: common.h:353
const squareT A1
Definition: common.h:348
const squareT A7
Definition: common.h:354
uint Size()
Definition: sqmove.h:35
const squareT B4
Definition: common.h:351
constexpr uint MAX_SQUARELIST
Definition: sqmove.h:20
void AddAll(void)
Definition: sqmove.h:72
const squareT A6
Definition: common.h:353
const squareT F6
Definition: common.h:353
const squareT G1
Definition: common.h:348
const squareT F7
Definition: common.h:354
bool Contains(squareT sq)
Definition: sqmove.h:99
const squareT H3
Definition: common.h:350
uint32_t uint
Definition: common.h:91
SquareSet(squareT *squares)
Definition: sqmove.h:66
const squareT H2
Definition: common.h:349
void Remove(squareT sq)
Definition: sqmove.h:108
const squareT B2
Definition: common.h:349
const squareT C2
Definition: common.h:349
const squareT H5
Definition: common.h:352
const squareT H8
Definition: common.h:355
const squareT A3
Definition: common.h:350
const squareT B1
Definition: common.h:348
const squareT G8
Definition: common.h:355
const squareT G7
Definition: common.h:354
const squareT D1
Definition: common.h:348
const squareT B8
Definition: common.h:355
const squareT B7
Definition: common.h:354
const squareT E5
Definition: common.h:352
const squareT C6
Definition: common.h:353
const squareT D6
Definition: common.h:353
void AddAll(squareT *squares)
Definition: sqmove.h:83
const squareT G3
Definition: common.h:350
const squareT E2
Definition: common.h:349
bool Contains(squareT sq)
Definition: sqmove.h:42
void Remove(uint index)
Definition: sqmove.h:51
const squareT A2
Definition: common.h:349
const squareT E8
Definition: common.h:355
const squareT D3
Definition: common.h:350
const squareT D4
Definition: common.h:351
constexpr squareT sqMove[66][11]
Definition: sqmove.h:123
const squareT E3
Definition: common.h:350
const squareT B6
Definition: common.h:353
void Add(squareT sq)
Definition: sqmove.h:74
const squareT F3
Definition: common.h:350
void Clear()
Definition: sqmove.h:30
constexpr squareT square_Last(squareT sq, directionT dir)
Definition: sqmove.h:286
byte directionT
Definition: common.h:106
const squareT E1
Definition: common.h:348
const squareT D5
Definition: common.h:352
void Init()
Definition: sqmove.h:29
const squareT G4
Definition: common.h:351
const squareT E4
Definition: common.h:351
const squareT G2
Definition: common.h:349
const squareT A5
Definition: common.h:352
const squareT C3
Definition: common.h:350
const squareT NS
Definition: common.h:357
const squareT F1
Definition: common.h:348
const squareT C7
Definition: common.h:354
byte squareT
Definition: common.h:105
const squareT D8
Definition: common.h:355
squareT Get(uint index)
Definition: sqmove.h:37