sol_parser_sdk/instr/
inner_common.rs1#[inline(always)]
11pub unsafe fn read_u8_unchecked(data: &[u8], offset: usize) -> u8 {
12 *data.get_unchecked(offset)
13}
14
15#[inline(always)]
21pub unsafe fn read_u16_unchecked(data: &[u8], offset: usize) -> u16 {
22 let ptr = data.as_ptr().add(offset) as *const u16;
23 u16::from_le(ptr.read_unaligned())
24}
25
26#[inline(always)]
32pub unsafe fn read_u32_unchecked(data: &[u8], offset: usize) -> u32 {
33 let ptr = data.as_ptr().add(offset) as *const u32;
34 u32::from_le(ptr.read_unaligned())
35}
36
37#[inline(always)]
43pub unsafe fn read_u64_unchecked(data: &[u8], offset: usize) -> u64 {
44 let ptr = data.as_ptr().add(offset) as *const u64;
45 u64::from_le(ptr.read_unaligned())
46}
47
48#[inline(always)]
54pub unsafe fn read_u128_unchecked(data: &[u8], offset: usize) -> u128 {
55 let ptr = data.as_ptr().add(offset) as *const u128;
56 u128::from_le(ptr.read_unaligned())
57}
58
59#[inline(always)]
65pub unsafe fn read_i32_unchecked(data: &[u8], offset: usize) -> i32 {
66 let ptr = data.as_ptr().add(offset) as *const i32;
67 i32::from_le(ptr.read_unaligned())
68}
69
70#[inline(always)]
76pub unsafe fn read_i64_unchecked(data: &[u8], offset: usize) -> i64 {
77 let ptr = data.as_ptr().add(offset) as *const i64;
78 i64::from_le(ptr.read_unaligned())
79}
80
81#[inline(always)]
87pub unsafe fn read_i128_unchecked(data: &[u8], offset: usize) -> i128 {
88 let ptr = data.as_ptr().add(offset) as *const i128;
89 i128::from_le(ptr.read_unaligned())
90}
91
92#[inline(always)]
98pub unsafe fn read_bool_unchecked(data: &[u8], offset: usize) -> bool {
99 *data.get_unchecked(offset) == 1
100}
101
102#[inline(always)]
108pub unsafe fn read_pubkey_unchecked(data: &[u8], offset: usize) -> solana_sdk::pubkey::Pubkey {
109 use solana_sdk::pubkey::Pubkey;
110 let ptr = data.as_ptr().add(offset);
111 let mut bytes = [0u8; 32];
112 std::ptr::copy_nonoverlapping(ptr, bytes.as_mut_ptr(), 32);
113 Pubkey::new_from_array(bytes)
114}
115
116#[inline(always)]
122pub unsafe fn read_string_unchecked(data: &[u8], offset: usize) -> Option<(String, usize)> {
123 if data.len() < offset + 4 {
124 return None;
125 }
126
127 let len = read_u32_unchecked(data, offset) as usize;
128 if data.len() < offset + 4 + len {
129 return None;
130 }
131
132 let string_bytes = &data[offset + 4..offset + 4 + len];
133 let s = std::str::from_utf8_unchecked(string_bytes);
134 Some((s.to_string(), 4 + len))
135}
136
137#[inline(always)]
139pub fn check_length(data: &[u8], required: usize) -> bool {
140 data.len() >= required
141}