fathom_syzygy_sys/
lib.rs

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// The original function is declared static inline and therefore unaccessible from Rust code. We
38// reimplement it here, because it is just a thin wrapper around another function anyway.
39#[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// The original function is declared static inline and therefore unaccessible from Rust code. We
68// reimplement it here, because it is just a thin wrapper around another function anyway.
69#[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}