use super::move10::Move10;
#[derive(Clone, Debug)]
pub struct MovePlanes {
pub planes: [u128; 10],
}
impl MovePlanes {
pub fn new() -> MovePlanes {
MovePlanes { planes: [0u128; 10] }
}
pub fn clear_all(&mut self) {
for i in 0..10 {
self.planes[i] = 0;
}
}
pub fn write_ply(&mut self, k: usize, mv: Option<Move10>) {
debug_assert!(k < 128, "ply index must be < 128");
if let Some(mv10) = mv {
let raw = mv10.bits() as u32;
for bit_i in 0..10 {
let bit_val = ((raw >> bit_i) & 1) as u128;
if bit_val == 1 {
self.planes[bit_i] |= 1u128 << k;
} else {
self.planes[bit_i] &= !(1u128 << k);
}
}
} else {
for i in 0..10 {
self.planes[i] &= !(1u128 << k);
}
}
}
pub fn read_ply(&self, k: usize) -> Move10 {
debug_assert!(k < 128, "ply index must be < 128");
let mut raw: u16 = 0;
for bit_i in 0..10 {
let bit_val = ((self.planes[bit_i] >> k) & 1) as u16;
raw |= bit_val << bit_i;
}
Move10::from_raw(raw)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::core::move10::Move10;
#[test]
fn write_read_planes() {
let mut planes = MovePlanes::new();
let codes = [
Move10::new(3, 10),
Move10::new(15, 63),
Move10::new(0, 0),
Move10::new(7, 31),
];
for (i, &mv) in codes.iter().enumerate() {
planes.write_ply(i, Some(mv));
}
for (i, &mv) in codes.iter().enumerate() {
let got = planes.read_ply(i);
assert_eq!(got, mv);
}
planes.write_ply(2, None);
let cleared = planes.read_ply(2);
assert_eq!(cleared.bits(), 0);
}
}