mod range;
use std::{cell::UnsafeCell, mem::ManuallyDrop, ops::Range, ptr::NonNull};
pub use range::range;
pub fn transpose_unsafecell_slice<T>(
slice: &[UnsafeCell<T>],
) -> &UnsafeCell<[T]> {
unsafe { &*(slice as *const [UnsafeCell<T>] as *const UnsafeCell<[T]>) }
}
pub fn overlaps(r1: &Range<usize>, r2: &Range<usize>) -> bool {
r1.end > r2.start && r1.start < r2.end
}
pub fn wrap_unsafecell_array<T, const N: usize>(
array: [T; N],
) -> [UnsafeCell<T>; N] {
unsafe {
let array = ManuallyDrop::new(array);
std::mem::transmute_copy(&array)
}
}
pub fn unwrap_unsafecell_array<T, const N: usize>(
array: [UnsafeCell<T>; N],
) -> [T; N] {
unsafe {
let array = ManuallyDrop::new(array);
std::mem::transmute_copy(&array)
}
}
pub fn wrap_unsafecell_slice<T>(
slice: &mut [T],
) -> &mut [UnsafeCell<T>] {
unsafe { &mut *(slice as *mut [T] as *mut [UnsafeCell<T>]) }
}
pub fn unwrap_unsafecell_slice<T>(
slice: &mut [UnsafeCell<T>],
) -> &mut [T] {
unsafe { &mut *(slice as *mut [UnsafeCell<T>] as *mut [T]) }
}
pub fn wrap_unsafecell_vec<T>(vec: Vec<T>) -> Vec<UnsafeCell<T>> {
let mut vec = ManuallyDrop::new(vec);
let length = vec.len();
let capacity = vec.capacity();
let ptr = vec.as_mut_ptr();
unsafe { Vec::from_raw_parts(ptr.cast(), length, capacity) }
}
pub fn unwrap_unsafecell_vec<T>(vec: Vec<UnsafeCell<T>>) -> Vec<T> {
let mut vec = ManuallyDrop::new(vec);
let length = vec.len();
let capacity = vec.capacity();
let ptr = vec.as_mut_ptr();
unsafe { Vec::from_raw_parts(ptr.cast(), length, capacity) }
}
pub unsafe fn split_slice_at<T>(
slice: NonNull<[T]>,
mid: usize,
) -> (NonNull<[T]>, NonNull<[T]>) {
debug_assert!(mid <= slice.len());
let head_ptr = slice.as_ptr() as *mut T;
let head_len = mid;
let tail_ptr = unsafe { head_ptr.add(mid) };
let tail_len = slice.len() - mid;
(
NonNull::new(std::ptr::slice_from_raw_parts_mut(head_ptr, head_len))
.unwrap(),
NonNull::new(std::ptr::slice_from_raw_parts_mut(tail_ptr, tail_len))
.unwrap(),
)
}