use core::{marker::PhantomData, ptr::NonNull};
use crate::SoACursor;
pub struct ColumnCursor<'a, T> {
front: NonNull<T>,
back: NonNull<T>,
_marker: PhantomData<&'a [T]>,
}
impl<'a, T> ColumnCursor<'a, T> {
#[inline]
pub fn new(slice: &'a [T]) -> Self {
let front = NonNull::from(slice).cast::<T>();
let back =
unsafe { NonNull::new_unchecked(front.as_ptr().add(slice.len())) };
ColumnCursor {
front,
back,
_marker: PhantomData,
}
}
}
impl<'a, T> SoACursor for ColumnCursor<'a, T> {
type Item = &'a T;
#[inline(always)]
unsafe fn cursor_next(&mut self) -> &'a T {
let current = self.front.as_ptr();
self.front = unsafe { NonNull::new_unchecked(current.add(1)) };
unsafe { &*current }
}
#[inline(always)]
unsafe fn cursor_next_back(&mut self) -> &'a T {
let current = unsafe { self.back.as_ptr().sub(1) };
self.back = unsafe { NonNull::new_unchecked(current) };
unsafe { &*current }
}
}
impl<T> Clone for ColumnCursor<'_, T> {
#[inline]
fn clone(&self) -> Self {
ColumnCursor {
front: self.front,
back: self.back,
_marker: PhantomData,
}
}
}
unsafe impl<T: Sync> Send for ColumnCursor<'_, T> {}
unsafe impl<T: Sync> Sync for ColumnCursor<'_, T> {}
pub struct ColumnCursorMut<'a, T> {
front: NonNull<T>,
back: NonNull<T>,
_marker: PhantomData<&'a mut [T]>,
}
impl<'a, T> ColumnCursorMut<'a, T> {
#[inline]
pub fn new(slice: &'a mut [T]) -> Self {
let len = slice.len();
let front = NonNull::from(slice).cast::<T>();
let back = unsafe { NonNull::new_unchecked(front.as_ptr().add(len)) };
ColumnCursorMut {
front,
back,
_marker: PhantomData,
}
}
}
impl<'a, T> SoACursor for ColumnCursorMut<'a, T> {
type Item = &'a mut T;
#[inline(always)]
unsafe fn cursor_next(&mut self) -> &'a mut T {
let current = self.front.as_ptr();
self.front = unsafe { NonNull::new_unchecked(current.add(1)) };
unsafe { &mut *current }
}
#[inline(always)]
unsafe fn cursor_next_back(&mut self) -> &'a mut T {
let current = unsafe { self.back.as_ptr().sub(1) };
self.back = unsafe { NonNull::new_unchecked(current) };
unsafe { &mut *current }
}
}
unsafe impl<T: Send> Send for ColumnCursorMut<'_, T> {}
unsafe impl<T: Sync> Sync for ColumnCursorMut<'_, T> {}