use core::marker::PhantomData;
use hopper_runtime::{Ref, RefMut};
use hopper_runtime::ProgramError;
use super::{Pod, FixedLayout, pod_from_bytes};
pub struct VerifiedAccount<'a, T: Pod + FixedLayout> {
data: Ref<'a, [u8]>,
_marker: PhantomData<T>,
}
impl<'a, T: Pod + FixedLayout> VerifiedAccount<'a, T> {
#[doc(hidden)]
#[inline(always)]
pub fn new(data: Ref<'a, [u8]>) -> Result<Self, ProgramError> {
let _ = pod_from_bytes::<T>(&data)?;
Ok(Self {
data,
_marker: PhantomData,
})
}
#[inline(always)]
pub fn get(&self) -> &T {
unsafe { &*(self.data.as_ptr() as *const T) }
}
#[inline(always)]
pub fn data(&self) -> &[u8] {
&self.data
}
}
pub struct VerifiedAccountMut<'a, T: Pod + FixedLayout> {
data: RefMut<'a, [u8]>,
_marker: PhantomData<T>,
}
impl<'a, T: Pod + FixedLayout> VerifiedAccountMut<'a, T> {
#[doc(hidden)]
#[inline(always)]
pub fn new(data: RefMut<'a, [u8]>) -> Result<Self, ProgramError> {
let _ = pod_from_bytes::<T>(&data)?;
Ok(Self {
data,
_marker: PhantomData,
})
}
#[inline(always)]
pub fn get(&self) -> &T {
unsafe { &*(self.data.as_ptr() as *const T) }
}
#[inline(always)]
pub fn get_mut(&mut self) -> &mut T {
unsafe { &mut *(self.data.as_mut_ptr() as *mut T) }
}
#[inline(always)]
pub fn data(&self) -> &[u8] {
&self.data
}
#[inline(always)]
pub fn data_mut(&mut self) -> &mut [u8] {
&mut self.data
}
}