#[cfg(test)] mod tests;
#[derive(Clone)]
pub struct ArrayIterator<T, A: Array<T>> {
array: std::mem::ManuallyDrop<A>,
current: usize,
_item: std::marker::PhantomData<T>,
}
impl<T, A: Array<T>> ArrayIterator<T, A> {
pub fn new(array: A) -> Self {
ArrayIterator {
array: std::mem::ManuallyDrop::new(array),
current: 0,
_item: std::marker::PhantomData,
}
}
}
impl <T, A: Array<T>> Iterator for ArrayIterator<T, A> {
type Item = T;
fn next(&mut self) -> Option<T> {
let data = self.array.slice_mut();
if self.current >= data.len() {
return None
}
let u = unsafe { std::mem::uninitialized() };
let item = std::mem::replace(&mut data[self.current], u);
self.current += 1;
Some(item)
}
fn size_hint(&self) -> (usize, Option<usize>) {
(self.len(), Some(self.len()))
}
}
impl<T, A: Array<T>> std::iter::ExactSizeIterator for ArrayIterator<T, A> {
fn len(&self) -> usize {
self.array.slice().len() - self.current
}
}
impl<T, A: Array<T>> std::iter::FusedIterator for ArrayIterator<T, A> { }
impl<T, A: Array<T>> Drop for ArrayIterator<T, A> {
fn drop(&mut self) {
for _ in self {
}
}
}
pub trait Array<T> {
fn slice(&self) -> &[T];
fn slice_mut(&mut self) -> &mut [T];
}
impl<T> Array<T> for [T; 0] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 1] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 2] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 3] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 4] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 5] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 6] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 7] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 8] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 9] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 10] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 11] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 12] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 13] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 14] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 15] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 16] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 17] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 18] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 19] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 20] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 21] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 22] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 23] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 24] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 25] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 26] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 27] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 28] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 29] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 30] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 31] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 32] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 33] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 34] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 35] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 36] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 37] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 38] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 39] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 40] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 41] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 42] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 43] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 44] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 45] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 46] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 47] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 48] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 49] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 50] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 51] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 52] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 53] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 54] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 55] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 56] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 57] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 58] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 59] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 60] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 61] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 62] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 63] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }
impl<T> Array<T> for [T; 64] { fn slice(&self) -> &[T] { self } fn slice_mut(&mut self) -> &mut [T] { self } }