use super::Array;
use core::{
mem::{
MaybeUninit,
forget
},
slice::{
Iter,
IterMut
}
};
pub struct Iterable<Type, const N: usize> {
index: usize,
length: usize,
data: MaybeUninit<[Type; N]>
}
impl<Type, const N: usize> Iterator for Iterable<Type, N> {
type Item = Type;
fn next(&mut self) -> Option<Self::Item> {
return if self.index >= self.length {None} else {
let value = unsafe {(self.data.as_ptr() as *const Type).add(self.index).read()};
self.index += 1;
return Some(value);
}
}
}
impl<Type, const N: usize> FromIterator<Type> for Array<Type, N> {
fn from_iter<T: IntoIterator<Item = Type>>(iter: T) -> Self {
let mut array = Self::new();
array.extend(iter);
return array;
}
}
impl<Type, const N: usize> IntoIterator for Array<Type, N> {
type Item = Type;
type IntoIter = Iterable<Type, N>;
fn into_iter(self) -> Self::IntoIter {
let iterator = Self::IntoIter {
index: 0,
length: self.length,
data: unsafe {MaybeUninit::new(self.data.as_ptr().read())}
};
forget(self);
return iterator;
}
}
impl<'valid, Type, const N: usize> IntoIterator for &'valid Array<Type, N> {
type Item = &'valid Type;
type IntoIter = Iter<'valid, Type>;
fn into_iter(self) -> Self::IntoIter {self.as_ref().iter()}
}
impl<'valid, Type, const N: usize> IntoIterator for &'valid mut Array<Type, N> {
type Item = &'valid mut Type;
type IntoIter = IterMut<'valid, Type>;
fn into_iter(self) -> Self::IntoIter {self.as_mut().iter_mut()}
}
impl<Type, const N: usize> Array<Type, N> {
#[inline]
pub fn iter<'valid>(&'valid self) -> Iter<'valid, Type> {return self.as_ref().into_iter()}
#[inline]
pub fn iter_mut<'valid>(&'valid mut self) -> IterMut<'valid, Type> {return self.as_mut().into_iter()}
}