array_iterator 0.2.0

Owning iterators based on arrays.
Documentation
#[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> { }

// https://github.com/rust-lang/rust/issues/37572
// unsafe impl<T, A: Array<T>> std::iter::TrustedLen for ArrayIterator<T, A> { }

impl<T, A: Array<T>> Drop for ArrayIterator<T, A> {
	fn drop(&mut self) {
		// We don't actually drop the array itself, just everything inside of it.
		// Hopefully this is fine.
		for _ in self {
		}
	}
}

// TODO: Use FixedSizeArray https://github.com/rust-lang/rust/issues/27778
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 } }