#![allow(clippy::host_endian_bytes)]
use core::num::NonZeroUsize;
#[inline]
const fn repeat_u8(x: u8) -> usize {
usize::from_ne_bytes([x; size_of::<usize>()])
}
const LO_USIZE: usize = repeat_u8(0x01);
const HI_USIZE: usize = repeat_u8(0x80);
const USIZE_BYTES: usize = size_of::<usize>();
#[inline]
const fn find_last_nul(num: NonZeroUsize) -> usize {
#[cfg(target_endian = "big")]
{
USIZE_BYTES - 1 - ((num.trailing_zeros()) >> 3) as usize
}
#[cfg(target_endian = "little")]
{
USIZE_BYTES - 1 - ((num.leading_zeros()) >> 3) as usize
}
}
#[inline]
const unsafe fn rposition_byte_len(base: *const u8, len: usize, needle: u8) -> Option<usize> {
let mut i = len;
while i != 0 {
i -= 1;
if unsafe { base.add(i).read() } == needle {
return Some(i);
}
}
None
}
#[inline]
#[allow(unused)] #[must_use]
const fn contains_zero_byte_borrow_fix(input: usize) -> Option<NonZeroUsize> {
let mut classic = input.wrapping_sub(LO_USIZE) & !input & HI_USIZE;
if classic == 0 {
return None;
}
classic &= !input << 7;
Some(unsafe { NonZeroUsize::new_unchecked(classic) })
}
#[inline]
#[cfg(target_endian = "big")]
const fn contains_zero_byte(input: usize) -> Option<NonZeroUsize> {
NonZeroUsize::new(input.wrapping_sub(LO_USIZE) & (!input) & HI_USIZE)
}
#[must_use]
#[inline]
#[expect(clippy::cast_ptr_alignment, reason = "alignment guaranteed")]
pub fn memrchr(x: u8, text: &[u8]) -> Option<usize> {
let len = text.len();
let ptr = text.as_ptr();
let (min_aligned_offset, max_aligned_offset) = {
let (prefix, _, suffix) = unsafe { text.align_to::<(usize, usize)>() };
(prefix.len(), len - suffix.len())
};
let mut offset = max_aligned_offset;
let start = text.as_ptr();
let tail_len = len - offset; if let Some(i) = unsafe { rposition_byte_len(start.add(offset), tail_len, x) } {
return Some(offset + i);
}
let repeated_x = repeat_u8(x);
while offset > min_aligned_offset {
let lower = unsafe { ptr.add(offset - 2 * USIZE_BYTES).cast::<usize>().read() };
let upper = unsafe { ptr.add(offset - USIZE_BYTES).cast::<usize>().read() };
#[cfg(target_endian = "big")]
let maybe_match_upper = contains_zero_byte(upper ^ repeated_x);
#[cfg(target_endian = "little")]
let maybe_match_upper = contains_zero_byte_borrow_fix(upper ^ repeated_x);
if let Some(num) = maybe_match_upper {
let zero_byte_pos = find_last_nul(num);
return Some(offset - USIZE_BYTES + zero_byte_pos);
}
#[cfg(target_endian = "big")]
let maybe_match_lower = contains_zero_byte(lower ^ repeated_x);
#[cfg(target_endian = "little")]
let maybe_match_lower = contains_zero_byte_borrow_fix(lower ^ repeated_x);
if let Some(num) = maybe_match_lower {
let zero_byte_pos = find_last_nul(num);
return Some(offset - 2 * USIZE_BYTES + zero_byte_pos);
}
offset -= 2 * USIZE_BYTES;
}
unsafe { rposition_byte_len(start, offset, x) }
}