#![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,
);
}
}