1use {bytemuck::Pod, solana_program_error::ProgramError};
4
5pub const fn pod_get_packed_len<T: Pod>() -> usize {
7 std::mem::size_of::<T>()
8}
9
10pub fn pod_bytes_of<T: Pod>(t: &T) -> &[u8] {
12 bytemuck::bytes_of(t)
13}
14
15pub fn pod_from_bytes<T: Pod>(bytes: &[u8]) -> Result<&T, ProgramError> {
17 bytemuck::try_from_bytes(bytes).map_err(|_| ProgramError::InvalidArgument)
18}
19
20pub fn pod_maybe_from_bytes<T: Pod>(bytes: &[u8]) -> Result<Option<&T>, ProgramError> {
26 if bytes.is_empty() {
27 Ok(None)
28 } else {
29 bytemuck::try_from_bytes(bytes)
30 .map(Some)
31 .map_err(|_| ProgramError::InvalidArgument)
32 }
33}
34
35pub fn pod_from_bytes_mut<T: Pod>(bytes: &mut [u8]) -> Result<&mut T, ProgramError> {
37 bytemuck::try_from_bytes_mut(bytes).map_err(|_| ProgramError::InvalidArgument)
38}
39
40pub fn pod_slice_from_bytes<T: Pod>(bytes: &[u8]) -> Result<&[T], ProgramError> {
42 bytemuck::try_cast_slice(bytes).map_err(|_| ProgramError::InvalidArgument)
43}
44
45pub fn pod_slice_from_bytes_mut<T: Pod>(bytes: &mut [u8]) -> Result<&mut [T], ProgramError> {
47 bytemuck::try_cast_slice_mut(bytes).map_err(|_| ProgramError::InvalidArgument)
48}
49
50pub fn pod_slice_to_bytes<T: Pod>(slice: &[T]) -> &[u8] {
52 bytemuck::cast_slice(slice)
53}