use crate::pmut::PMut;
use itertools::Itertools;
use alloc::vec::Vec;
unsafe impl<T> core::marker::Send for PreVecMut<T> {}
unsafe impl<T> core::marker::Sync for PreVecMut<T> {}
#[derive(Default)]
pub struct PreVecMut<T> {
vec: Vec<core::ptr::NonNull<T>>,
}
impl<T> PreVecMut<T> {
#[inline(always)]
pub fn new() -> PreVecMut<T> {
debug_assert_eq!(
core::mem::size_of::<core::ptr::NonNull<T>>(),
core::mem::size_of::<&mut T>()
);
PreVecMut { vec: Vec::new() }
}
#[inline(always)]
pub fn get_empty_vec_mut<'a, 'b: 'a>(&'a mut self) -> &'a mut Vec<PMut<'b, T>> {
self.vec.clear();
let v: &mut Vec<_> = &mut self.vec;
unsafe { &mut *(v as *mut _ as *mut Vec<_>) }
}
}
pub struct SliceSplitMut<'a, T, F> {
arr: Option<&'a mut [T]>,
func: F,
}
impl<'a, T, F: FnMut(&T, &T) -> bool> SliceSplitMut<'a, T, F> {
pub fn new(arr: &'a mut [T], func: F) -> SliceSplitMut<'a, T, F> {
SliceSplitMut {
arr: Some(arr),
func,
}
}
}
impl<'a, T, F: FnMut(&T, &T) -> bool> Iterator for SliceSplitMut<'a, T, F> {
type Item = &'a mut [T];
fn next(&mut self) -> Option<Self::Item> {
let (last, arr) = {
let arr = self.arr.take()?;
let i = arr.get(0)?;
let count = arr.iter().peeking_take_while(|a| (self.func)(a, i)).count();
(count, arr)
};
let (first, rest) = arr.split_at_mut(last);
self.arr = Some(rest);
Some(first)
}
}
pub struct SliceSplit<'a, T, F> {
arr: Option<&'a [T]>,
func: F,
}
impl<'a, T, F: FnMut(&T, &T) -> bool> SliceSplit<'a, T, F> {
pub fn new(arr: &'a [T], func: F) -> SliceSplit<'a, T, F> {
SliceSplit {
arr: Some(arr),
func,
}
}
}
impl<'a, T, F: FnMut(&T, &T) -> bool> Iterator for SliceSplit<'a, T, F> {
type Item = &'a [T];
fn next(&mut self) -> Option<Self::Item> {
let (last, arr) = {
let arr = self.arr.take()?;
let i = arr.get(0)?;
let count = arr.iter().peeking_take_while(|a| (self.func)(a, i)).count();
(count, arr)
};
let (first, rest) = arr.split_at(last);
self.arr = Some(rest);
Some(first)
}
}