simbelmyne_chess/movegen/
move_array.rs1use 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}