use crate::error::ProgramError;
#[inline(always)]
pub unsafe fn memcpy(dst: *mut u8, src: *const u8, n: usize) {
#[cfg(target_os = "solana")]
unsafe {
crate::syscalls::sol_memcpy_(dst, src, n as u64);
}
#[cfg(not(target_os = "solana"))]
unsafe {
core::ptr::copy_nonoverlapping(src, dst, n);
}
}
#[inline(always)]
pub unsafe fn memmove(dst: *mut u8, src: *const u8, n: usize) {
#[cfg(target_os = "solana")]
unsafe {
crate::syscalls::sol_memmove_(dst, src, n as u64);
}
#[cfg(not(target_os = "solana"))]
unsafe {
core::ptr::copy(src, dst, n);
}
}
#[inline(always)]
pub unsafe fn memset(dst: *mut u8, byte: u8, n: usize) {
#[cfg(target_os = "solana")]
unsafe {
crate::syscalls::sol_memset_(dst, byte, n as u64);
}
#[cfg(not(target_os = "solana"))]
unsafe {
core::ptr::write_bytes(dst, byte, n);
}
}
#[inline(always)]
pub unsafe fn memcmp(a: *const u8, b: *const u8, n: usize) -> core::cmp::Ordering {
#[cfg(target_os = "solana")]
{
let mut result: i32 = 0;
unsafe {
crate::syscalls::sol_memcmp_(a, b, n as u64, &mut result as *mut i32);
}
match result {
0 => core::cmp::Ordering::Equal,
x if x < 0 => core::cmp::Ordering::Less,
_ => core::cmp::Ordering::Greater,
}
}
#[cfg(not(target_os = "solana"))]
{
let a_slice = unsafe { core::slice::from_raw_parts(a, n) };
let b_slice = unsafe { core::slice::from_raw_parts(b, n) };
a_slice.cmp(b_slice)
}
}
#[inline(always)]
pub fn zero_fill(buf: &mut [u8]) {
if buf.is_empty() {
return;
}
unsafe {
memset(buf.as_mut_ptr(), 0, buf.len());
}
}
#[inline]
pub fn copy_bytes(dst: &mut [u8], src: &[u8]) -> Result<(), ProgramError> {
if dst.len() < src.len() {
return Err(ProgramError::InvalidArgument);
}
unsafe {
memcpy(dst.as_mut_ptr(), src.as_ptr(), src.len());
}
Ok(())
}
#[inline]
pub fn bytes_eq(a: &[u8], b: &[u8]) -> bool {
if a.len() != b.len() {
return false;
}
if a.is_empty() {
return true;
}
unsafe { memcmp(a.as_ptr(), b.as_ptr(), a.len()) == core::cmp::Ordering::Equal }
}
#[inline]
pub fn zero_account_data(account: &crate::account_view::AccountView) {
let len = account.data_len();
if len == 0 {
return;
}
unsafe {
memset(account.data_ptr_unchecked(), 0, len);
}
}