use std::ptr::NonNull;
use std::{cmp, slice};
#[repr(transparent)]
#[derive(Clone, Copy)]
pub(crate) struct U64Le(u64);
impl U64Le {
#[allow(clippy::inline_always)]
#[inline(always)]
pub const fn get(self) -> u64 {
u64::from_le(self.0)
}
}
pub(crate) fn split(buffer: &[u8]) -> (&[u8], &[U64Le], &[u8]) {
let (start, mid) = {
let split_index = {
let addr = buffer.as_ptr() as usize;
let aligned_addr = (addr + 7) & (!7);
let next_i = aligned_addr - addr;
cmp::min(next_i, buffer.len())
};
buffer.split_at(split_index)
};
let (mid, end) = {
let split_index = mid.len() & (!7);
mid.split_at(split_index)
};
let mid = unsafe {
let length = mid.len() / 8;
let ptr = if length == 0 {
NonNull::<U64Le>::dangling().as_ptr()
} else {
#[allow(clippy::cast_ptr_alignment)]
mid.as_ptr().cast::<U64Le>()
};
slice::from_raw_parts(ptr, length)
};
(start, mid, end)
}