1pub const TB_CASTLING_K: u32 = 1;
2pub const TB_CASTLING_Q: u32 = 2;
3#[allow(non_upper_case_globals)]
4pub const TB_CASTLING_k: u32 = 4;
5#[allow(non_upper_case_globals)]
6pub const TB_CASTLING_q: u32 = 8;
7
8pub const TB_LOSS: u32 = 0;
9pub const TB_BLESSED_LOSS: u32 = 1;
10pub const TB_DRAW: u32 = 2;
11pub const TB_CURSED_WIN: u32 = 3;
12pub const TB_WIN: u32 = 4;
13
14pub const TB_PROMOTES_NONE: u32 = 0;
15pub const TB_PROMOTES_QUEEN: u32 = 1;
16pub const TB_PROMOTES_ROOK: u32 = 2;
17pub const TB_PROMOTES_BISHOP: u32 = 3;
18pub const TB_PROMOTES_KNIGHT: u32 = 4;
19
20pub const TB_RESULT_WDL_MASK: u32 = 0x0000000F;
21pub const TB_RESULT_TO_MASK: u32 = 0x000003F0;
22pub const TB_RESULT_FROM_MASK: u32 = 0x0000FC00;
23pub const TB_RESULT_PROMOTES_MASK: u32 = 0x00080000;
24pub const TB_RESULT_EP_MASK: u32 = 0x00070000;
25pub const TB_RESULT_DTZ_MASK: u32 = 0xFFF00000;
26pub const TB_RESULT_WDL_SHIFT: u32 = 0;
27pub const TB_RESULT_TO_SHIFT: u32 = 4;
28pub const TB_RESULT_FROM_SHIFT: u32 = 10;
29pub const TB_RESULT_PROMOTES_SHIFT: u32 = 16;
30pub const TB_RESULT_EP_SHIFT: u32 = 19;
31pub const TB_RESULT_DTZ_SHIFT: u32 = 20;
32
33pub const TB_RESULT_CHECKMATE: u32 = 0x00000004;
34pub const TB_RESULT_STALEMATE: u32 = 0x00000002;
35pub const TB_RESULT_FAILED: u32 = 0xFFFFFFFF;
36
37#[allow(clippy::missing_safety_doc, clippy::too_many_arguments)]
40pub unsafe fn tb_probe_wdl(
41 white: u64,
42 black: u64,
43 kings: u64,
44 queens: u64,
45 rooks: u64,
46 bishops: u64,
47 knights: u64,
48 pawns: u64,
49 rule50: u32,
50 castling: u32,
51 ep: u32,
52 turn: u8,
53) -> u32 {
54 if castling != 0 {
55 return TB_RESULT_FAILED;
56 }
57
58 if rule50 != 0 {
59 return TB_RESULT_FAILED;
60 }
61
62 tb_probe_wdl_impl(
63 white, black, kings, queens, rooks, bishops, knights, pawns, ep, turn,
64 )
65}
66
67#[allow(clippy::missing_safety_doc, clippy::too_many_arguments)]
70pub unsafe fn tb_probe_root(
71 white: u64,
72 black: u64,
73 kings: u64,
74 queens: u64,
75 rooks: u64,
76 bishops: u64,
77 knights: u64,
78 pawns: u64,
79 rule50: u32,
80 castling: u32,
81 ep: u32,
82 turn: u8,
83 results: *mut u32,
84) -> u32 {
85 if castling != 0 {
86 return TB_RESULT_FAILED;
87 }
88
89 tb_probe_root_impl(
90 white, black, kings, queens, rooks, bishops, knights, pawns, rule50, ep, turn, results,
91 )
92}
93
94extern "C" {
95 pub static TB_LARGEST: u32;
96
97 pub fn tb_init(filename: *const i8) -> bool;
98
99 pub fn tb_free();
100
101 fn tb_probe_wdl_impl(
102 white: u64,
103 black: u64,
104 kings: u64,
105 queens: u64,
106 rooks: u64,
107 bishops: u64,
108 knights: u64,
109 pawns: u64,
110 ep: u32,
111 turn: u8,
112 ) -> u32;
113
114 fn tb_probe_root_impl(
115 white: u64,
116 black: u64,
117 kings: u64,
118 queens: u64,
119 rooks: u64,
120 bishops: u64,
121 knights: u64,
122 pawns: u64,
123 rule50: u32,
124 ep: u32,
125 turn: u8,
126 results: *mut u32,
127 ) -> u32;
128}