pub use iter::Iter;
pub use itermut::IterMut;
pub use into_iter::IntoIter;
mod iter {
use std::marker::PhantomData;
use crate::array::Array;
#[must_use = "iterators are lazy and do nothing unless consumed"]
pub struct Iter<'a, T> {
marker: PhantomData<&'a T>,
ptr: *const T,
end: *const T,
}
impl<'a, T> Iter<'a, T> {
#[inline]
pub(crate) fn new(array: &'a Array<T>) -> Self {
let ptr = array.pointer;
Self {
marker: PhantomData,
ptr,
end: unsafe { ptr.add(array.size()) }
}
}
}
impl<'a, T> Iterator for Iter<'a, T> {
type Item = &'a T;
#[inline]
fn next(&mut self) -> Option<Self::Item> {
if self.ptr == self.end {
None
} else {
unsafe {
let p = self.ptr;
self.ptr = self.ptr.add(1);
Some(&*p)
}
}
}
}
}
mod itermut {
use std::marker::PhantomData;
use crate::array::Array;
#[must_use = "iterators are lazy and do nothing unless consumed"]
pub struct IterMut<'a, T> {
marker: PhantomData<&'a T>,
ptr: *mut T,
end: *mut T,
}
impl<'a, T> IterMut<'a, T> {
#[inline]
pub(crate) fn new(array: &'a mut Array<T>) -> Self {
let ptr = array.pointer;
let size = array.size();
Self {
marker: PhantomData,
ptr,
end: unsafe { ptr.add(size) }
}
}
}
impl<'a, T> Iterator for IterMut<'a, T> {
type Item = &'a mut T;
#[inline]
fn next(&mut self) -> Option<Self::Item> {
if self.ptr == self.end {
None
} else {
unsafe {
let p = self.ptr;
self.ptr = self.ptr.add(1);
Some(&mut *p)
}
}
}
}
}
mod into_iter {
use std::marker::PhantomData;
use crate::array::Array;
pub struct IntoIter<T> {
array: Array<T>,
ptr: *const T,
end: *const T,
}
impl<T> IntoIter<T> {
#[inline]
pub(crate) fn new(array: Array<T>) -> Self {
let end = unsafe { array.pointer.add(array.size()) };
let ptr = array.pointer.as_const();
Self { array, ptr, end }
}
}
impl<T> Iterator for IntoIter<T> {
type Item = T;
#[inline]
fn next(&mut self) -> Option<Self::Item> {
if self.ptr == self.end {
None
} else {
unsafe {
let p = self.ptr;
self.ptr = self.ptr.add(1);
Some(std::ptr::read(p))
}
}
}
}
}