use std::mem;
use std::ops::{Index,IndexMut};
use pleco::core::masks::*;
use pleco::{SQ,Piece};
use super::{StatBoard,NumStatCube};
pub struct PieceToHistory {
a: [[i16; SQ_CNT]; PIECE_CNT]
}
#[allow(non_camel_case_types)]
type PTH_idx = (Piece, SQ);
impl Index<PTH_idx> for PieceToHistory {
type Output = i16;
#[inline(always)]
fn index(&self, idx: PTH_idx) -> &Self::Output {
unsafe {
self.a.get_unchecked(idx.0 as usize) .get_unchecked((idx.1).0 as usize) }
}
}
impl IndexMut<PTH_idx> for PieceToHistory {
#[inline(always)]
fn index_mut(&mut self, idx: PTH_idx) -> &mut Self::Output {
unsafe {
self.a.get_unchecked_mut(idx.0 as usize) .get_unchecked_mut((idx.1).0 as usize) }
}
}
impl StatBoard<i16, PTH_idx> for PieceToHistory {
const FILL: i16 = 0;
}
impl NumStatCube<PTH_idx> for PieceToHistory {
const D: i32 = 936;
const W: i32 = 32;
}
pub struct ContinuationHistory {
a: [[PieceToHistory; SQ_CNT]; PIECE_CNT]
}
impl ContinuationHistory {
pub fn new() -> Self {
unsafe {mem::zeroed()}
}
pub fn clear(&mut self) {
*self = unsafe {mem::zeroed()};
}
}
#[allow(non_camel_case_types)]
type CH_idx = (Piece, SQ);
impl Index<CH_idx> for ContinuationHistory {
type Output = PieceToHistory;
#[inline(always)]
fn index(&self, idx: CH_idx) -> &Self::Output {
unsafe {
self.a.get_unchecked(idx.0 as usize) .get_unchecked((idx.1).0 as usize) }
}
}
impl IndexMut<CH_idx> for ContinuationHistory {
#[inline(always)]
fn index_mut(&mut self, idx: CH_idx) -> &mut Self::Output {
unsafe {
self.a.get_unchecked_mut(idx.0 as usize) .get_unchecked_mut((idx.1).0 as usize) }
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::mem;
#[test]
fn size() {
println!("{}", mem::size_of::<ContinuationHistory>());
}
}