#[inline(always)]
pub unsafe fn read_u8_unchecked(data: &[u8], offset: usize) -> u8 {
*data.get_unchecked(offset)
}
#[inline(always)]
pub unsafe fn read_u16_unchecked(data: &[u8], offset: usize) -> u16 {
let ptr = data.as_ptr().add(offset) as *const u16;
u16::from_le(ptr.read_unaligned())
}
#[inline(always)]
pub unsafe fn read_u32_unchecked(data: &[u8], offset: usize) -> u32 {
let ptr = data.as_ptr().add(offset) as *const u32;
u32::from_le(ptr.read_unaligned())
}
#[inline(always)]
pub unsafe fn read_u64_unchecked(data: &[u8], offset: usize) -> u64 {
let ptr = data.as_ptr().add(offset) as *const u64;
u64::from_le(ptr.read_unaligned())
}
#[inline(always)]
pub unsafe fn read_u128_unchecked(data: &[u8], offset: usize) -> u128 {
let ptr = data.as_ptr().add(offset) as *const u128;
u128::from_le(ptr.read_unaligned())
}
#[inline(always)]
pub unsafe fn read_i32_unchecked(data: &[u8], offset: usize) -> i32 {
let ptr = data.as_ptr().add(offset) as *const i32;
i32::from_le(ptr.read_unaligned())
}
#[inline(always)]
pub unsafe fn read_i64_unchecked(data: &[u8], offset: usize) -> i64 {
let ptr = data.as_ptr().add(offset) as *const i64;
i64::from_le(ptr.read_unaligned())
}
#[inline(always)]
pub unsafe fn read_i128_unchecked(data: &[u8], offset: usize) -> i128 {
let ptr = data.as_ptr().add(offset) as *const i128;
i128::from_le(ptr.read_unaligned())
}
#[inline(always)]
pub unsafe fn read_bool_unchecked(data: &[u8], offset: usize) -> bool {
*data.get_unchecked(offset) == 1
}
#[inline(always)]
pub unsafe fn read_pubkey_unchecked(data: &[u8], offset: usize) -> solana_sdk::pubkey::Pubkey {
use solana_sdk::pubkey::Pubkey;
let ptr = data.as_ptr().add(offset);
let mut bytes = [0u8; 32];
std::ptr::copy_nonoverlapping(ptr, bytes.as_mut_ptr(), 32);
Pubkey::new_from_array(bytes)
}
#[inline(always)]
pub unsafe fn read_string_unchecked(data: &[u8], offset: usize) -> Option<(String, usize)> {
if data.len() < offset + 4 {
return None;
}
let len = read_u32_unchecked(data, offset) as usize;
if data.len() < offset + 4 + len {
return None;
}
let string_bytes = &data[offset + 4..offset + 4 + len];
let s = std::str::from_utf8_unchecked(string_bytes);
Some((s.to_string(), 4 + len))
}
#[inline(always)]
pub fn check_length(data: &[u8], required: usize) -> bool {
data.len() >= required
}