use std::{
marker::PhantomData,
num::NonZeroUsize,
ptr,
};
#[derive(Default, Copy, Clone)]
pub struct DefaultIter<T: Default>(PhantomData<fn() -> T>);
impl<T: Default> Iterator for DefaultIter<T> {
type Item = T;
#[inline(always)]
fn next(&mut self) -> Option<Self::Item> {
Some(T::default())
}
}
#[inline(always)]
pub fn can_try_alloc(alloc_size: usize) -> bool {
alloc_size <= isize::MAX as usize
}
pub fn new_capacity_at_least_double(old_capacity: usize) -> Option<NonZeroUsize> {
let leading_zeros = (old_capacity - 1).leading_zeros() - 1;
if leading_zeros == 0 {
None
} else {
NonZeroUsize::new(
1usize.rotate_right(leading_zeros)
)
}
}
pub trait PtrCopy {
unsafe fn copy(src: *const u8, dst: *mut u8, count: usize);
}
pub enum CopyFn {}
impl PtrCopy for CopyFn {
#[inline(always)]
unsafe fn copy(src: *const u8, dst: *mut u8, count: usize) {
ptr::copy(src, dst, count);
}
}
pub enum CopyNonoverlappingFn {}
impl PtrCopy for CopyNonoverlappingFn {
#[inline(always)]
unsafe fn copy(src: *const u8, dst: *mut u8, count: usize) {
ptr::copy_nonoverlapping(src, dst, count);
}
}