1#![allow(unsafe_code)]
14
15use crate::error::DecodeError;
16
17pub trait Reader {
19 fn read(
25 &mut self,
26 bytes: &mut [u8],
27 ) -> Result<(), DecodeError>;
28
29 #[inline(always)]
35 fn read_u8(&mut self) -> Result<u8, DecodeError> {
36 let mut byte = [0u8; 1];
37 self.read(&mut byte)?;
38 Ok(byte[0])
39 }
40
41 #[inline(always)]
47 fn read_u16(&mut self) -> Result<u16, DecodeError> {
48 let mut bytes = [0u8; 2];
49 self.read(&mut bytes)?;
50 Ok(u16::from_ne_bytes(bytes))
51 }
52
53 #[inline(always)]
59 fn read_u32(&mut self) -> Result<u32, DecodeError> {
60 let mut bytes = [0u8; 4];
61 self.read(&mut bytes)?;
62 Ok(u32::from_ne_bytes(bytes))
63 }
64
65 #[inline(always)]
71 fn read_u64(&mut self) -> Result<u64, DecodeError> {
72 let mut bytes = [0u8; 8];
73 self.read(&mut bytes)?;
74 Ok(u64::from_ne_bytes(bytes))
75 }
76
77 #[inline(always)]
83 fn read_u128(&mut self) -> Result<u128, DecodeError> {
84 let mut bytes = [0u8; 16];
85 self.read(&mut bytes)?;
86 Ok(u128::from_ne_bytes(bytes))
87 }
88
89 #[inline(always)]
92 fn peek_read(
93 &mut self,
94 _: usize,
95 ) -> Option<&[u8]> {
96 None
97 }
98
99 #[inline(always)]
102 fn consume(
103 &mut self,
104 _: usize,
105 ) {
106 }
107
108 #[inline(always)]
110 fn peek_u8(&mut self) -> Option<u8> {
111 self.peek_read(1).map(|b| b[0])
112 }
113}
114
115impl<T> Reader for &mut T
116where
117 T: Reader,
118{
119 #[inline(always)]
120 fn read(
121 &mut self,
122 bytes: &mut [u8],
123 ) -> Result<(), DecodeError> {
124 (**self).read(bytes)
125 }
126
127 #[inline(always)]
128 fn peek_read(
129 &mut self,
130 n: usize,
131 ) -> Option<&[u8]> {
132 (**self).peek_read(n)
133 }
134
135 #[inline(always)]
136 fn consume(
137 &mut self,
138 n: usize,
139 ) {
140 (*self).consume(n);
141 }
142
143 #[inline(always)]
144 fn read_u16(&mut self) -> Result<u16, DecodeError> {
145 (**self).read_u16()
146 }
147
148 #[inline(always)]
149 fn read_u32(&mut self) -> Result<u32, DecodeError> {
150 (**self).read_u32()
151 }
152
153 #[inline(always)]
154 fn read_u64(&mut self) -> Result<u64, DecodeError> {
155 (**self).read_u64()
156 }
157
158 #[inline(always)]
159 fn read_u128(&mut self) -> Result<u128, DecodeError> {
160 (**self).read_u128()
161 }
162}
163
164pub trait BorrowReader<'storage>: Reader {
166 fn take_bytes(
174 &mut self,
175 length: usize,
176 ) -> Result<&'storage [u8], DecodeError>;
177}
178
179pub struct SliceReader<'storage> {
181 pub(crate) slice: &'storage [u8],
182}
183
184impl<'storage> SliceReader<'storage> {
185 #[must_use]
187 pub const fn new(bytes: &'storage [u8]) -> Self {
188 Self { slice: bytes }
189 }
190}
191
192impl<'storage> Reader for SliceReader<'storage> {
193 #[inline(always)]
194 fn read(
195 &mut self,
196 bytes: &mut [u8],
197 ) -> Result<(), DecodeError> {
198 if bytes.len() > self.slice.len() {
199 return crate::error::cold_decode_error_unexpected_end(bytes.len() - self.slice.len());
200 }
201 unsafe {
205 core::ptr::copy_nonoverlapping(self.slice.as_ptr(), bytes.as_mut_ptr(), bytes.len());
206 self.slice = self.slice.get_unchecked(bytes.len()..);
207 }
208
209 Ok(())
210 }
211
212 #[inline(always)]
213 fn peek_read(
214 &mut self,
215 n: usize,
216 ) -> Option<&'storage [u8]> {
217 self.slice.get(..n)
218 }
219
220 #[inline(always)]
221 fn consume(
222 &mut self,
223 n: usize,
224 ) {
225 if n >= self.slice.len() {
226 self.slice = &[];
227 } else {
228 self.slice = unsafe { self.slice.get_unchecked(n..) };
229 }
230 }
231
232 #[inline(always)]
233 fn peek_u8(&mut self) -> Option<u8> {
234 self.slice.first().copied()
235 }
236
237 #[inline(always)]
238 fn read_u8(&mut self) -> Result<u8, DecodeError> {
239 if self.slice.is_empty() {
240 return crate::error::cold_decode_error_unexpected_end(1);
241 }
242 let byte = unsafe { *self.slice.get_unchecked(0) };
243 self.slice = unsafe { self.slice.get_unchecked(1..) };
244 Ok(byte)
245 }
246
247 #[inline(always)]
248 fn read_u16(&mut self) -> Result<u16, DecodeError> {
249 if self.slice.len() < 2 {
250 return crate::error::cold_decode_error_unexpected_end(2 - self.slice.len());
251 }
252 let val = unsafe { core::ptr::read_unaligned(self.slice.as_ptr().cast::<u16>()) };
253 self.slice = unsafe { self.slice.get_unchecked(2..) };
254 Ok(val)
255 }
256
257 #[inline(always)]
258 fn read_u32(&mut self) -> Result<u32, DecodeError> {
259 if self.slice.len() < 4 {
260 return crate::error::cold_decode_error_unexpected_end(4 - self.slice.len());
261 }
262 let val = unsafe { core::ptr::read_unaligned(self.slice.as_ptr().cast::<u32>()) };
263 self.slice = unsafe { self.slice.get_unchecked(4..) };
264 Ok(val)
265 }
266
267 #[inline(always)]
268 fn read_u64(&mut self) -> Result<u64, DecodeError> {
269 if self.slice.len() < 8 {
270 return crate::error::cold_decode_error_unexpected_end(8 - self.slice.len());
271 }
272 let val = unsafe { core::ptr::read_unaligned(self.slice.as_ptr().cast::<u64>()) };
273 self.slice = unsafe { self.slice.get_unchecked(8..) };
274 Ok(val)
275 }
276
277 #[inline(always)]
278 fn read_u128(&mut self) -> Result<u128, DecodeError> {
279 if self.slice.len() < 16 {
280 return crate::error::cold_decode_error_unexpected_end(16 - self.slice.len());
281 }
282 let val = unsafe { core::ptr::read_unaligned(self.slice.as_ptr().cast::<u128>()) };
283 self.slice = unsafe { self.slice.get_unchecked(16..) };
284 Ok(val)
285 }
286}
287
288impl<'storage> BorrowReader<'storage> for SliceReader<'storage> {
289 #[inline(always)]
290 fn take_bytes(
291 &mut self,
292 length: usize,
293 ) -> Result<&'storage [u8], DecodeError> {
294 if length > self.slice.len() {
295 return crate::error::cold_decode_error_unexpected_end(length - self.slice.len());
296 }
297 unsafe {
300 let read_slice = self.slice.get_unchecked(..length);
301 self.slice = self.slice.get_unchecked(length..);
302 Ok(read_slice)
303 }
304 }
305}