#![allow(unused_unsafe)]
#[macro_use]
mod macros;
use core::fmt;
use core::iter::FusedIterator;
use core::slice::{from_raw_parts, from_raw_parts_mut};
use crate::alloc::SizedTypeProperties;
use crate::hint::assume;
use crate::ptr::{self, invalid, invalid_mut, NonNull};
#[must_use = "iterators are lazy and do nothing unless consumed"]
pub struct RawIter<T> {
ptr: NonNull<T>,
end_or_len: *const T,
}
impl<T: fmt::Debug> fmt::Debug for RawIter<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_tuple("Iter").finish()
}
}
unsafe impl<T: Sync> Sync for RawIter<T> {}
unsafe impl<T: Sync> Send for RawIter<T> {}
impl<T> RawIter<T> {
#[inline]
pub(crate) fn new(slice: &[T]) -> Self {
let ptr = slice.as_ptr();
unsafe {
let end_or_len = if T::IS_ZST {
invalid(slice.len())
} else {
ptr.add(slice.len())
};
Self {
ptr: NonNull::new_unchecked(ptr as *mut T),
end_or_len,
}
}
}
#[must_use]
#[inline]
pub unsafe fn as_slice<'a>(&self) -> &'a [T] {
self.make_slice()
}
}
iterator! {struct RawIter -> *const T, *const T, const, {}, as_ref, {}}
impl<T> Clone for RawIter<T> {
#[inline]
fn clone(&self) -> Self {
RawIter {
ptr: self.ptr,
end_or_len: self.end_or_len,
}
}
}
#[must_use = "iterators are lazy and do nothing unless consumed"]
pub struct RawIterMut<T> {
ptr: NonNull<T>,
end_or_len: *mut T,
}
impl<T: fmt::Debug> fmt::Debug for RawIterMut<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_tuple("IterMut").finish()
}
}
unsafe impl<T: Sync> Sync for RawIterMut<T> {}
unsafe impl<T: Send> Send for RawIterMut<T> {}
impl<T> RawIterMut<T> {
#[inline]
pub(crate) fn new(slice: &mut [T]) -> Self {
let ptr = slice.as_mut_ptr();
unsafe {
let end_or_len = if T::IS_ZST {
invalid_mut(slice.len())
} else {
ptr.add(slice.len())
};
Self {
ptr: NonNull::new_unchecked(ptr),
end_or_len,
}
}
}
#[must_use]
#[inline]
pub unsafe fn as_slice<'a>(&self) -> &'a [T] {
self.make_slice()
}
#[must_use]
pub unsafe fn as_mut_slice<'a>(&mut self) -> &'a mut [T] {
from_raw_parts_mut(self.ptr.as_ptr(), len!(self))
}
}
iterator! {struct RawIterMut -> *mut T, *mut T, mut, {mut}, as_mut, {}}