use crate::IteratorFixed;
use core::{array, iter, slice};
pub unsafe trait IntoIteratorFixed<const N: usize> {
type Item;
type IntoIter: Iterator<Item = Self::Item>;
fn into_iter_fixed(self) -> IteratorFixed<Self::IntoIter, N>;
}
unsafe impl<I: Iterator, const N: usize> IntoIteratorFixed<N> for IteratorFixed<I, N>
where
Self: IntoIterator,
{
type Item = I::Item;
type IntoIter = I;
#[inline]
fn into_iter_fixed(self) -> IteratorFixed<Self::IntoIter, N> {
self
}
}
unsafe impl<T, const N: usize> IntoIteratorFixed<N> for [T; N] {
type Item = T;
type IntoIter = array::IntoIter<T, N>;
#[inline]
fn into_iter_fixed(self) -> IteratorFixed<array::IntoIter<T, N>, N> {
unsafe { IteratorFixed::from_iter(<[T; N] as IntoIterator>::into_iter(self)) }
}
}
unsafe impl<'a, T, const N: usize> IntoIteratorFixed<N> for &'a [T; N] {
type Item = &'a T;
type IntoIter = slice::Iter<'a, T>;
#[inline]
fn into_iter_fixed(self) -> IteratorFixed<Self::IntoIter, N> {
unsafe { IteratorFixed::from_iter(self.iter()) }
}
}
unsafe impl<'a, T, const N: usize> IntoIteratorFixed<N> for &'a mut [T; N] {
type Item = &'a mut T;
type IntoIter = slice::IterMut<'a, T>;
#[inline]
fn into_iter_fixed(self) -> IteratorFixed<Self::IntoIter, N> {
unsafe { IteratorFixed::from_iter(self.iter_mut()) }
}
}
unsafe impl<T: Clone, const N: usize> IntoIteratorFixed<N> for iter::Repeat<T> {
type Item = T;
type IntoIter = iter::Take<Self>;
#[inline]
fn into_iter_fixed(self) -> IteratorFixed<iter::Take<Self>, N> {
unsafe { IteratorFixed::from_iter(self.take(N)) }
}
}