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(bytes: &mut [u8]) -> &mut [T] { let slop = bytes.len() % size_of::(); 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::()); (from_bytes_mut(header_bytes), remove_slop_mut(inner_bytes)) })) }