simbelmyne_chess/movegen/
move_array.rs

1use std::ops::Deref;
2use std::ops::DerefMut;
3
4use super::moves::Move;
5
6#[derive(Debug, Copy, Clone)]
7pub struct MoveArray {
8  moves: [Move; Self::SIZE],
9  len: usize,
10}
11
12impl MoveArray {
13  pub const SIZE: usize = 218;
14
15  pub fn new() -> Self {
16    Self::default()
17  }
18
19  pub fn push(&mut self, mv: Move) {
20    self.moves[self.len] = mv;
21    self.len += 1;
22  }
23
24  pub fn clear(&mut self) {
25    self.len = 0;
26  }
27
28  pub fn len(&self) -> usize {
29    self.len
30  }
31}
32
33impl Default for MoveArray {
34  fn default() -> Self {
35    Self {
36      moves: [Move::default(); Self::SIZE],
37      len: 0,
38    }
39  }
40}
41
42impl IntoIterator for MoveArray {
43  type Item = Move;
44
45  type IntoIter = IntoIter;
46
47  fn into_iter(self) -> Self::IntoIter {
48    Self::IntoIter {
49      inner: self,
50      idx: 0,
51    }
52  }
53}
54
55impl Deref for MoveArray {
56  type Target = [Move];
57
58  fn deref(&self) -> &Self::Target {
59    &self.moves
60  }
61}
62
63impl DerefMut for MoveArray {
64  fn deref_mut(&mut self) -> &mut Self::Target {
65    &mut self.moves
66  }
67}
68
69pub struct IntoIter {
70  inner: MoveArray,
71  idx: usize,
72}
73
74impl Iterator for IntoIter {
75  type Item = Move;
76
77  fn next(&mut self) -> Option<Self::Item> {
78    if self.idx < self.inner.len {
79      let mv = self.inner[self.idx];
80      self.idx += 1;
81      Some(mv)
82    } else {
83      None
84    }
85  }
86}