1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#![allow(unused_variables)]
use std::usize;
use scoped_threadpool::Pool;
use position::Position;
mod uci;
pub use self::uci::Uci;
pub struct Engine {
pool: Pool,
engine: EngineInner,
}
struct EngineInner {
position: Position,
options: Options,
}
impl Default for Engine {
#[inline]
fn default() -> Engine { Engine::new() }
}
impl Engine {
#[inline]
pub fn builder() -> EngineBuilder {
EngineBuilder { num_threads: 0 }
}
#[inline]
pub fn new() -> Engine {
Engine::builder().build()
}
#[inline]
pub fn uci(&mut self) -> Uci {
Uci::from(self)
}
}
#[derive(Copy, Clone, Debug)]
pub struct EngineBuilder {
num_threads: u32,
}
impl EngineBuilder {
pub fn build(self) -> Engine {
let num_threads = match self.num_threads {
0 => ::num_cpus::get() as u32,
n => n,
};
Engine {
pool: Pool::new(num_threads),
engine: EngineInner {
position: Position::default(),
options: Options { num_threads },
},
}
}
#[inline]
pub fn num_threads(mut self, n: u32) -> EngineBuilder {
self.num_threads = n;
self
}
}
struct Options {
num_threads: u32,
}
impl Options {
fn set(&mut self, name: &str, value: &str) -> bool {
let match_option = |opt: &str| {
if name.len() == opt.len() {
let a = name.as_bytes().iter();
let b = opt.as_bytes().iter();
for (&a, &b) in a.zip(b) {
if a | 32 != b {
return false;
}
}
true
} else {
false
}
};
if match_option("threads") {
panic!("Cannot currently set number of threads");
} else {
false
}
}
fn report(&self) {
println!(
"\noption name Threads type spin default {} min 1 max {}",
::num_cpus::get(),
usize::MAX,
);
}
}