Skip to content

Commit f23bcac

Browse files
author
Jesper Torp Kristensen
committed
Refactoring
1 parent dd735c8 commit f23bcac

14 files changed

+372
-325
lines changed

src/board.hxx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include "typedefs.hxx"
99
#include "util/help_functions.hxx"
1010
#include "parser.hxx"
11+
#include "piece_pos.hxx"
1112

1213
#define PRINT_CONSTRUCTOR_DESTRUCTOR_CALLS false
1314

src/compression/bdd_index.hxx

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#ifndef _BDD_INDEX_
2+
#define _BDD_INDEX_
3+
4+
#include "../experimenting.hxx"
5+
#include "../piece_pos.hxx"
6+
7+
struct BDD_Index {
8+
BDD_Index() {
9+
u.raw[0] = 0;
10+
#if MAX_MEN >= 5
11+
u.raw[1] = 0;
12+
#endif
13+
}
14+
15+
Position &operator[](int index) { return u.positions[index];}
16+
17+
int index() {
18+
return u.positions[0] | (u.positions[1] << 6) |
19+
(u.positions[2] << 12) | (u.positions[3] << 18)
20+
#if MAX_MEN >= 5
21+
| (u.positions[4] << 24)
22+
#endif
23+
;
24+
}
25+
26+
27+
BDD_Index &operator==(const BDD_Index &bddi) {
28+
u.raw[0] = bddi.u.raw[0];
29+
#if MAX_MEN >= 5
30+
u.raw[1] = bddi.u.raw[1];
31+
#endif
32+
return *this;
33+
}
34+
35+
private:
36+
union {
37+
Position positions[MAX_MEN];
38+
uint raw[(MAX_MEN+3)/4];
39+
} u;
40+
};
41+
42+
43+
#endif

src/compression/endgame_table_bdd.hxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
#include "../typedefs.hxx"
77
#include "binary_decision_diagram.hxx"
8-
8+
#include "bdd_index.hxx"
99
#include "endgame_clustering_functions.hxx"
1010

1111
class BDD {

src/endgames/endgame_castling.hxx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#define _ENDGAME_CASTLING_
33

44
#include "../typedefs.hxx"
5+
#include "../piece_pos.hxx"
56

67
extern const bool KING_CASTLING_POSITIONS[64];
78
extern const Position DECODE_SHORT_CASTLING_ROOK[64];

src/endgames/endgame_functionality.cxx

Lines changed: 1 addition & 198 deletions
Original file line numberDiff line numberDiff line change
@@ -11,204 +11,7 @@
1111
#include "../compression/endgame_square_permutations.hxx"
1212
#include "../compression/endgame_piece_enumerations.hxx"
1313
#include "../compression/endgame_run_length_encoding.hxx"
14-
15-
string endgame_value_to_string(char v) {
16-
if (is_special_value(v)) {
17-
switch (v) {
18-
case ENDGAME_TABLE_WIN:
19-
return "WIN";
20-
case ENDGAME_TABLE_LOSS:
21-
return "LOSS";
22-
case ENDGAME_TABLE_DRAW:
23-
return "DRAW";
24-
case ENDGAME_TABLE_UNKNOWN:
25-
return "????";
26-
case ENDGAME_TABLE_ILLEGAL:
27-
return "*";
28-
}
29-
}
30-
if (v>0) {
31-
return "M"+signedToString(v);
32-
} else {
33-
return "-M"+signedToString(-v);
34-
}
35-
}
36-
37-
bool swap_piece_pos(vector<PiecePos> &pieces,
38-
bool symmetric_endgame_and_btm)
39-
{
40-
//cerr << "pieces.size() = " << pieces.size() << "\n";
41-
42-
switch (pieces.size()) {
43-
case 2:
44-
// NEW!
45-
if (symmetric_endgame_and_btm) swap(pieces[0], pieces[2]);
46-
return symmetric_endgame_and_btm;
47-
case 3:
48-
if (PIECE_KIND[pieces[1].piece] == KING) {
49-
PiecePos weak_king = pieces[0];
50-
pieces[0] = pieces[1];
51-
pieces[1] = pieces[2];
52-
pieces[2] = weak_king;
53-
return true;
54-
}
55-
return false;
56-
case 4:
57-
if (PIECE_KIND[pieces[1].piece] == KING) {
58-
PiecePos weak_king = pieces[0];
59-
pieces[0] = pieces[1];
60-
pieces[1] = pieces[2];
61-
pieces[2] = pieces[3];
62-
pieces[3] = weak_king;
63-
return true;
64-
}
65-
if (PIECE_KIND[pieces[2].piece] == KING) {
66-
if (PIECE_KIND[pieces[1].piece] < PIECE_KIND[pieces[3].piece]) {
67-
swap(pieces[0], pieces[2]);
68-
swap(pieces[1], pieces[3]);
69-
return true;
70-
}
71-
// NEW!
72-
if (symmetric_endgame_and_btm) {
73-
swap(pieces[0], pieces[2]);
74-
swap(pieces[1], pieces[3]);
75-
return true;
76-
}
77-
}
78-
// PIECE_KIND[pieces[3]] == KING
79-
return false;
80-
#ifdef ALLOW_5_MEN_ENDGAME
81-
case 5:
82-
if (PIECE_KIND[pieces[1].piece] == KING) {
83-
PiecePos weak_king = pieces[0];
84-
pieces[0] = pieces[1];
85-
pieces[1] = pieces[2];
86-
pieces[2] = pieces[3];
87-
pieces[3] = pieces[4];
88-
pieces[4] = weak_king;
89-
return true;
90-
}
91-
if (PIECE_KIND[pieces[2].piece] == KING) {
92-
PiecePos weak_king_piece = pieces[1];
93-
pieces[1] = pieces[3];
94-
pieces[3] = pieces[0];
95-
pieces[0] = pieces[2];
96-
pieces[2] = pieces[4];
97-
pieces[4] = weak_king_piece;
98-
return true;
99-
}
100-
return false;
101-
#endif
102-
}
103-
assert(0);
104-
return false;
105-
}
106-
107-
// Sorting order : KQRBNPkqrbnp
108-
const bool GT[16][16] =
109-
{{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
110-
{0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0},
111-
{0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0},
112-
{0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0},
113-
{0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0},
114-
{0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0},
115-
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
116-
{0,1,1,1,1,1,1,0,1,1,1,1,1,0,0,0},
117-
{0,1,1,1,1,1,1,0,0,1,1,1,1,0,0,0},
118-
{0,1,1,1,1,1,1,0,0,0,1,1,1,0,0,0},
119-
{0,1,1,1,1,1,1,0,0,0,0,1,1,0,0,0},
120-
{0,1,1,1,1,1,1,0,0,0,0,0,1,0,0,0},
121-
{0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0},
122-
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
123-
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
124-
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};
125-
126-
void sort_piece_pos(vector<PiecePos> &pieces) {
127-
switch(pieces.size()) {
128-
case 2:
129-
if (GT[pieces[0].piece][pieces[1].piece]) swap(pieces[0], pieces[1]);
130-
return;
131-
case 3:
132-
if (GT[pieces[0].piece][pieces[1].piece]) swap(pieces[0], pieces[1]);
133-
if (GT[pieces[1].piece][pieces[2].piece]) swap(pieces[1], pieces[2]);
134-
if (GT[pieces[0].piece][pieces[1].piece]) swap(pieces[0], pieces[1]);
135-
return;
136-
case 4:
137-
// Partial sort pieces[0..1] and pieces[2..3]
138-
if (GT[pieces[0].piece][pieces[1].piece]) swap(pieces[0], pieces[1]);
139-
if (GT[pieces[2].piece][pieces[3].piece]) swap(pieces[2], pieces[3]);
140-
141-
// Find smallest and largest element
142-
if (GT[pieces[0].piece][pieces[2].piece]) swap(pieces[0], pieces[2]);
143-
if (GT[pieces[1].piece][pieces[3].piece]) swap(pieces[1], pieces[3]);
144-
145-
// Sort middle elements
146-
if (GT[pieces[1].piece][pieces[2].piece]) swap(pieces[1], pieces[2]);
147-
return;
148-
#ifdef ALLOW_5_MEN_ENDGAME
149-
case 5:
150-
// start by sorting pieces[0,1,3,4] like sort_4_piece_pos
151-
if (GT[pieces[0].piece][pieces[1].piece]) swap(pieces[0], pieces[1]);
152-
if (GT[pieces[3].piece][pieces[4].piece]) swap(pieces[3], pieces[4]);
153-
if (GT[pieces[0].piece][pieces[3].piece]) swap(pieces[0], pieces[3]);
154-
if (GT[pieces[1].piece][pieces[4].piece]) swap(pieces[1], pieces[4]);
155-
if (GT[pieces[1].piece][pieces[3].piece]) swap(pieces[1], pieces[3]);
156-
157-
// find the place for pieces[2]
158-
if (GT[pieces[1].piece][pieces[2].piece]) {
159-
swap(pieces[1], pieces[2]);
160-
if (GT[pieces[0].piece][pieces[1].piece]) swap(pieces[0], pieces[1]);
161-
162-
} else if (GT[pieces[2].piece][pieces[3].piece]) {
163-
164-
swap(pieces[2], pieces[3]);
165-
if (GT[pieces[3].piece][pieces[4].piece]) swap(pieces[3], pieces[4]);
166-
}
167-
168-
assert(!GT[pieces[0].piece][pieces[1].piece]);
169-
assert(!GT[pieces[1].piece][pieces[2].piece]);
170-
assert(!GT[pieces[2].piece][pieces[3].piece]);
171-
assert(!GT[pieces[3].piece][pieces[4].piece]);
172-
173-
return;
174-
#endif
175-
}
176-
assert(0);
177-
178-
}
179-
180-
// If endgame is KBKP, and bishop captured by pawn is being promoted to queen,
181-
// then s is K_KQ (and stm is BLACK).
182-
// Result will be the needed stm, hence BLACK in this case (B->W->B)
183-
// Will change p if it contains a zero entry
184-
int endgame_dependency_needed_stm(Piece *p, int num_pieces, int stm) {
185-
assert(stm==0 || stm==1);
186-
for (int i=0; i<num_pieces; i++) {
187-
if (p[i] == 0) {
188-
--num_pieces;
189-
for (int j=i; j<num_pieces; j++) {
190-
p[j] = p[j+1];
191-
assert(p[j] != 0);
192-
}
193-
break;
194-
}
195-
}
196-
197-
bool symmetric = true;
198-
for (int i=0; i<(num_pieces>>1); i++)
199-
if (p[i] != p[i + (num_pieces>>1)]) {
200-
symmetric = false;
201-
break;
202-
}
203-
204-
vector<PiecePos> pp(num_pieces);
205-
for (int i=0; i<num_pieces; i++)
206-
pp[i].piece = p[i];
207-
208-
return !stm ^ swap_piece_pos(pp, stm && symmetric);
209-
}
210-
211-
14+
#include "endgame_piece_pos.hxx"
21215

21316
EndgameFunctionality::
21417
EndgameFunctionality(int (*compress_table_index)(vector<PiecePos> &),

src/endgames/endgame_indexing.hxx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
#include <vector>
55

66
#include "../compression/binary_decision_diagram.hxx"
7+
#include "../piece_pos.hxx"
8+
#include "../compression/bdd_index.hxx"
79

810
// Todo:
911
// All the assert(0) statements have been inserted because now a

0 commit comments

Comments
 (0)