use crate::{IntoIter, Iter, Stack};
use std::marker::PhantomData;
impl<V: Copy, const N: usize> Iterator for IntoIter<V, N> {
type Item = V;
#[inline]
#[must_use]
fn next(&mut self) -> Option<Self::Item> {
if self.pos >= self.next {
None
} else {
let v = unsafe { self.items.add(self.pos).read() };
self.pos += 1;
Some(v)
}
}
}
impl<'a, V: Copy + 'a, const N: usize> Stack<V, N> {
#[inline]
pub const fn into_iter(&self) -> IntoIter<V, N> {
IntoIter {
pos: 0,
next: self.next,
items: self.items.as_ptr(),
}
}
}
impl<'a, V: Copy, const N: usize> Iterator for Iter<'a, V, N> {
type Item = &'a V;
#[inline]
#[must_use]
fn next(&mut self) -> Option<Self::Item> {
if self.pos >= self.next {
None
} else {
unsafe {
let v = self.items.add(self.pos);
self.pos += 1;
v.as_ref()
}
}
}
}
impl<'a, V: Copy + 'a, const N: usize> Stack<V, N> {
#[inline]
pub const fn iter(&self) -> Iter<V, N> {
Iter {
pos: 0,
next: self.next,
items: self.items.as_ptr(),
_marker: PhantomData,
}
}
}
#[test]
fn push_and_iterate() {
let mut p: Stack<u64, 16> = Stack::new();
unsafe { p.push_unchecked(1) };
unsafe { p.push_unchecked(2) };
unsafe { p.push_unchecked(3) };
let mut sum = 0;
for x in p.iter() {
sum += x;
}
assert_eq!(6, sum);
}
#[test]
fn push_and_into_iterate() {
let mut p: Stack<u64, 16> = Stack::new();
unsafe { p.push_unchecked(1) };
unsafe { p.push_unchecked(2) };
let mut sum = 0;
for x in p.into_iter() {
sum += x;
}
assert_eq!(3, sum);
}