use crate::domain::layout::Layout;
#[inline]
pub(super) fn dense_block_range<const N: usize>(
layout: &Layout<N>,
) -> Option<core::ops::Range<usize>> {
let start = layout.offset();
let end = start.checked_add(layout.checked_size().ok()?)?;
Some(start..end)
}
pub(super) const SHARED_WINDOW_ACCESS_MESSAGE: &str =
"window is shared with sibling lane/axis views; a whole-window \
slice would alias their elements (use per-element access instead)";
#[inline]
pub(super) fn checked_block_range<const N: usize>(
layout: &Layout<N>,
len: usize,
) -> Option<core::ops::Range<usize>> {
let range = dense_block_range(layout)?;
(range.end <= len).then_some(range)
}
#[inline]
pub(super) fn assert_exclusive_window(window_shared: bool) {
assert!(!window_shared, "{SHARED_WINDOW_ACCESS_MESSAGE}");
}
#[inline]
pub(super) unsafe fn raw_slice_from_ptr<'a, T>(ptr: std::ptr::NonNull<T>, len: usize) -> &'a [T] {
unsafe { std::slice::from_raw_parts(ptr.as_ptr(), len) }
}
#[inline]
pub(super) unsafe fn raw_slice_from_ptr_mut<'a, T>(
ptr: std::ptr::NonNull<T>,
len: usize,
) -> &'a mut [T] {
unsafe { std::slice::from_raw_parts_mut(ptr.as_ptr(), len) }
}
#[inline]
pub(super) unsafe fn raw_range_from_ptr<'a, T>(
ptr: std::ptr::NonNull<T>,
range: core::ops::Range<usize>,
) -> &'a [T] {
unsafe { std::slice::from_raw_parts(ptr.as_ptr().add(range.start), range.len()) }
}
#[inline]
pub(super) unsafe fn raw_range_from_ptr_mut<'a, T>(
ptr: std::ptr::NonNull<T>,
range: core::ops::Range<usize>,
) -> &'a mut [T] {
unsafe { std::slice::from_raw_parts_mut(ptr.as_ptr().add(range.start), range.len()) }
}
#[inline]
pub(super) unsafe fn raw_ref_from_ptr<'a, T>(ptr: std::ptr::NonNull<T>, offset: usize) -> &'a T {
unsafe { &*ptr.as_ptr().add(offset) }
}
#[inline]
pub(super) unsafe fn raw_mut_from_ptr<'a, T>(
ptr: std::ptr::NonNull<T>,
offset: usize,
) -> &'a mut T {
unsafe { &mut *ptr.as_ptr().add(offset) }
}