25 lines
841 B
Rust
25 lines
841 B
Rust
use anchor_lang::prelude::Error;
|
|
use bytemuck::{bytes_of, cast_slice_mut, from_bytes_mut, Contiguous, Pod};
|
|
|
|
use solana_program::account_info::AccountInfo;
|
|
use solana_program::program_error::ProgramError;
|
|
use solana_program::pubkey::Pubkey;
|
|
use std::cell::RefMut;
|
|
use std::mem::size_of;
|
|
|
|
#[inline]
|
|
pub fn remove_slop_mut<T: Pod>(bytes: &mut [u8]) -> &mut [T] {
|
|
let slop = bytes.len() % size_of::<T>();
|
|
let new_len = bytes.len() - slop;
|
|
cast_slice_mut(&mut bytes[..new_len])
|
|
}
|
|
|
|
pub fn strip_header_mut<'a, H: Pod, D: Pod>(
|
|
account: &'a AccountInfo,
|
|
) -> Result<(RefMut<'a, H>, RefMut<'a, [D]>), Error> {
|
|
Ok(RefMut::map_split(account.try_borrow_mut_data()?, |data| {
|
|
let (header_bytes, inner_bytes) = data.split_at_mut(size_of::<H>());
|
|
(from_bytes_mut(header_bytes), remove_slop_mut(inner_bytes))
|
|
}))
|
|
}
|