mango-v4/programs/mango-v4/src/state/orderbook/ob_utils.rs

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))
}))
}