use crate::Position;
#[derive(Debug, Copy, Clone, Default)]
pub struct MoveEntry {
pub column: usize,
pub score: u8,
}
pub struct MoveSorter {
size: usize,
entries: [MoveEntry; Position::WIDTH],
}
impl MoveSorter {
pub fn new() -> MoveSorter {
Self::default()
}
#[inline(always)]
pub fn add(&mut self, column: usize, score: u8) {
let mut pos = self.size;
while pos > 0 && self.entries[pos - 1].score > score {
self.entries[pos] = self.entries[pos - 1];
pos -= 1;
}
self.entries[pos].column = column;
self.entries[pos].score = score;
self.size += 1;
}
}
impl Iterator for MoveSorter {
type Item = usize;
#[inline(always)]
fn next(&mut self) -> Option<usize> {
if self.size == 0 {
None
} else {
self.size -= 1;
Some(self.entries[self.size].column)
}
}
}
impl Default for MoveSorter {
fn default() -> MoveSorter {
MoveSorter {
size: 0,
entries: [MoveEntry::default(); Position::WIDTH],
}
}
}