1use crate::{ErrorKind, Result};
6
7#[derive(Clone, Debug, Eq, PartialEq, PartialOrd, Ord)]
9pub(crate) struct ArrayVec<T, const N: usize> {
10 elements: [Option<T>; N],
12
13 length: usize,
15}
16
17impl<T, const N: usize> ArrayVec<T, N> {
18 pub fn new() -> Self {
20 Self {
21 elements: [(); N].map(|_| None),
22 length: 0,
23 }
24 }
25
26 pub fn add(&mut self, element: T) -> Result<()> {
31 match self.length.checked_add(1) {
32 Some(n) if n < N => {
33 self.elements[self.length] = Some(element);
34 self.length = n;
35 Ok(())
36 }
37 _ => Err(ErrorKind::Overlength.into()),
38 }
39 }
40
41 pub fn get(&self, index: usize) -> Option<&T> {
43 match self.elements.get(index) {
44 Some(Some(ref item)) => Some(item),
45 _ => None,
46 }
47 }
48
49 pub fn iter(&self) -> Iter<'_, T> {
51 Iter::new(&self.elements)
52 }
53
54 pub fn is_empty(&self) -> bool {
56 self.length == 0
57 }
58
59 pub fn len(&self) -> usize {
61 self.length
62 }
63
64 pub fn last(&self) -> Option<&T> {
66 self.length.checked_sub(1).and_then(|n| self.get(n))
67 }
68
69 pub fn try_into_array(self) -> Result<[T; N]> {
73 if self.length != N {
74 return Err(ErrorKind::Incomplete {
75 expected_len: N.try_into()?,
76 actual_len: self.length.try_into()?,
77 }
78 .into());
79 }
80
81 Ok(self.elements.map(|elem| match elem {
82 Some(e) => e,
83 None => unreachable!(),
84 }))
85 }
86}
87
88impl<T, const N: usize> Default for ArrayVec<T, N> {
89 fn default() -> Self {
90 Self::new()
91 }
92}
93
94#[derive(Clone, Debug)]
96pub struct Iter<'a, T> {
97 elements: &'a [Option<T>],
99
100 position: usize,
102}
103
104impl<'a, T> Iter<'a, T> {
105 pub(crate) fn new(elements: &'a [Option<T>]) -> Self {
106 Self {
107 elements,
108 position: 0,
109 }
110 }
111}
112
113impl<'a, T> Iterator for Iter<'a, T> {
114 type Item = &'a T;
115
116 fn next(&mut self) -> Option<&'a T> {
117 if let Some(Some(res)) = self.elements.get(self.position) {
118 self.position = self.position.checked_add(1)?;
119 Some(res)
120 } else {
121 None
122 }
123 }
124}