use crate::Position;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::error::Error;
use std::fs::File;
use std::io::{BufReader, BufWriter};
use std::path::Path;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OpeningBook {
pub map: HashMap<u64, i8>,
}
impl OpeningBook {
pub fn new() -> OpeningBook {
Self::default()
}
pub fn from_static_bytes(bytes: &'static [u8]) -> Result<OpeningBook, bincode::Error> {
bincode::deserialize(bytes)
}
#[inline(always)]
pub fn get(&self, position: &Position) -> Option<i8> {
self.map.get(&position.get_key()).copied()
}
pub fn save(&self, path: &Path) -> Result<(), Box<dyn Error>> {
let file = File::create(path)?;
let writer = BufWriter::new(file);
bincode::serialize_into(writer, &self.map)?;
Ok(())
}
pub fn load(path: &Path) -> Result<OpeningBook, Box<dyn Error>> {
let file = File::open(path)?;
let reader = BufReader::new(file);
let map = bincode::deserialize_from(reader)?;
Ok(OpeningBook { map })
}
}
impl Default for OpeningBook {
fn default() -> OpeningBook {
OpeningBook { map: HashMap::new() }
}
}