1use crate::macros::{buf_get_do, buf_read_do};
2use std::io::{self, Write};
3
4#[derive(Debug)]
43pub struct BufViewMut<'a> {
44 buf: &'a mut [u8],
45 reader_index: usize,
46 writer_index: usize,
47}
48
49impl<'a> BufViewMut<'a> {
50 pub fn wrap(buf: &'a mut [u8]) -> Self {
53 BufViewMut::wrap_with(buf, 0, 0)
54 }
55
56 pub fn wrap_with(buf: &'a mut [u8], reader_index: usize, writer_index: usize) -> Self {
69 assert!(reader_index <= writer_index && buf.len() >= writer_index);
70 BufViewMut {
71 buf,
72 reader_index,
73 writer_index,
74 }
75 }
76
77 pub fn read_u8(&mut self) -> u8 {
78 assert!(self.remaining() >= 1);
79 let val = self.buf[self.reader_index];
80 self.reader_index += 1;
81 val
82 }
83
84 pub fn read_i8(&mut self) -> i8 {
85 self.read_u8() as i8
86 }
87
88 pub fn read_u16(&mut self) -> u16 {
89 buf_read_do!(self, u16, be);
90 }
91
92 pub fn read_u16_le(&mut self) -> u16 {
93 buf_read_do!(self, u16, le);
94 }
95
96 pub fn read_i16(&mut self) -> i16 {
97 buf_read_do!(self, i16, be);
98 }
99
100 pub fn read_i16_le(&mut self) -> i16 {
101 buf_read_do!(self, i16, le);
102 }
103
104 pub fn read_u32(&mut self) -> u32 {
105 buf_read_do!(self, u32, be);
106 }
107
108 pub fn read_u32_le(&mut self) -> u32 {
109 buf_read_do!(self, u32, le);
110 }
111
112 pub fn read_i32(&mut self) -> i32 {
113 buf_read_do!(self, i32, be);
114 }
115
116 pub fn read_i32_le(&mut self) -> i32 {
117 buf_read_do!(self, i32, le);
118 }
119
120 pub fn read_u64(&mut self) -> u64 {
121 buf_read_do!(self, u64, be);
122 }
123
124 pub fn read_u64_le(&mut self) -> u64 {
125 buf_read_do!(self, u64, le);
126 }
127
128 pub fn read_i64(&mut self) -> i64 {
129 buf_read_do!(self, i64, be);
130 }
131
132 pub fn read_i64_le(&mut self) -> i64 {
133 buf_read_do!(self, i64, le);
134 }
135
136 pub fn read_u128(&mut self) -> u128 {
137 buf_read_do!(self, u128, be);
138 }
139
140 pub fn read_u128_le(&mut self) -> u128 {
141 buf_read_do!(self, u128, le);
142 }
143
144 pub fn read_i128(&mut self) -> i128 {
145 buf_read_do!(self, i128, be);
146 }
147
148 pub fn read_i128_le(&mut self) -> i128 {
149 buf_read_do!(self, i128, le);
150 }
151
152 pub fn read_f32(&mut self) -> f32 {
153 buf_read_do!(self, f32, be);
154 }
155
156 pub fn read_f32_le(&mut self) -> f32 {
157 buf_read_do!(self, f32, le);
158 }
159
160 pub fn read_f64(&mut self) -> f64 {
161 buf_read_do!(self, f64, be);
162 }
163
164 pub fn read_f64_le(&mut self) -> f64 {
165 buf_read_do!(self, f64, le);
166 }
167
168 pub fn read_bytes(&mut self, dest: &mut [u8]) -> usize {
169 let left = self.remaining();
170 assert!(left >= dest.len());
171 let copy_len = if dest.len() < left { dest.len() } else { left };
172 let end = self.reader_index + copy_len;
173 dest[..copy_len].copy_from_slice(&self.buf[self.reader_index..end]);
174 self.reader_index = end;
175 copy_len
176 }
177
178 pub fn get_u8(&mut self, index: usize) -> u8 {
179 assert!(self.buf.len() > index);
180 self.buf[index]
181 }
182
183 pub fn get_i8(&mut self, index: usize) -> i8 {
184 self.get_u8(index) as i8
185 }
186
187 pub fn get_u16(&mut self, index: usize) -> u16 {
188 buf_get_do!(self, index, u16, be);
189 }
190
191 pub fn get_u16_le(&mut self, index: usize) -> u16 {
192 buf_get_do!(self, index, u16, le);
193 }
194
195 pub fn get_i16(&mut self, index: usize) -> i16 {
196 buf_get_do!(self, index, i16, be);
197 }
198
199 pub fn get_i16_le(&mut self, index: usize) -> i16 {
200 buf_get_do!(self, index, i16, le);
201 }
202
203 pub fn get_u32(&mut self, index: usize) -> u32 {
204 buf_get_do!(self, index, u32, be);
205 }
206
207 pub fn get_u32_le(&mut self, index: usize) -> u32 {
208 buf_get_do!(self, index, u32, le);
209 }
210
211 pub fn get_i32(&mut self, index: usize) -> i32 {
212 buf_get_do!(self, index, i32, be);
213 }
214
215 pub fn get_i32_le(&mut self, index: usize) -> i32 {
216 buf_get_do!(self, index, i32, le);
217 }
218
219 pub fn get_u64(&mut self, index: usize) -> u64 {
220 buf_get_do!(self, index, u64, be);
221 }
222
223 pub fn get_u64_le(&mut self, index: usize) -> u64 {
224 buf_get_do!(self, index, u64, le);
225 }
226
227 pub fn get_i64(&mut self, index: usize) -> i64 {
228 buf_get_do!(self, index, i64, be);
229 }
230
231 pub fn get_i64_le(&mut self, index: usize) -> i64 {
232 buf_get_do!(self, index, i64, le);
233 }
234
235 pub fn get_u128(&mut self, index: usize) -> u128 {
236 buf_get_do!(self, index, u128, be);
237 }
238
239 pub fn get_u128_le(&mut self, index: usize) -> u128 {
240 buf_get_do!(self, index, u128, le);
241 }
242
243 pub fn get_i128(&mut self, index: usize) -> i128 {
244 buf_get_do!(self, index, i128, be);
245 }
246
247 pub fn get_i128_le(&mut self, index: usize) -> i128 {
248 buf_get_do!(self, index, i128, le);
249 }
250
251 pub fn get_f32(&mut self, index: usize) -> f32 {
252 buf_get_do!(self, index, f32, be);
253 }
254
255 pub fn get_f32_le(&mut self, index: usize) -> f32 {
256 buf_get_do!(self, index, f32, le);
257 }
258
259 pub fn get_f64(&mut self, index: usize) -> f64 {
260 buf_get_do!(self, index, f64, be);
261 }
262
263 pub fn get_f64_le(&mut self, index: usize) -> f64 {
264 buf_get_do!(self, index, f64, le);
265 }
266
267 pub fn get_bytes(&mut self, index: usize, dest: &mut [u8]) -> usize {
268 assert!(self.buf.len() > index);
269 let copy_len = if (index + dest.len()) <= self.buf.len() {
270 dest.len()
271 } else {
272 self.buf.len() - index
273 };
274 dest[..copy_len].copy_from_slice(&self.buf[index..(index + copy_len)]);
275 copy_len
276 }
277
278 pub fn write_u8(&mut self, val: u8) {
279 assert!(self.buf.len() >= (self.writer_index + 1));
280 self.buf[self.writer_index] = val;
281 self.writer_index += 1;
282 }
283
284 pub fn write_u16(&mut self, val: u16) {
285 self.write_bytes(&val.to_be_bytes());
286 }
287
288 pub fn write_u16_le(&mut self, val: u16) {
289 self.write_bytes(&val.to_le_bytes());
290 }
291
292 pub fn write_i16(&mut self, val: i16) {
293 self.write_bytes(&val.to_be_bytes());
294 }
295
296 pub fn write_i16_le(&mut self, val: i16) {
297 self.write_bytes(&val.to_le_bytes());
298 }
299
300 pub fn write_u32(&mut self, val: u32) {
301 self.write_bytes(&val.to_be_bytes());
302 }
303
304 pub fn write_u32_le(&mut self, val: u32) {
305 self.write_bytes(&val.to_le_bytes());
306 }
307
308 pub fn write_i32(&mut self, val: i32) {
309 self.write_bytes(&val.to_be_bytes());
310 }
311
312 pub fn write_i32_le(&mut self, val: i32) {
313 self.write_bytes(&val.to_le_bytes());
314 }
315
316 pub fn write_u64(&mut self, val: u64) {
317 self.write_bytes(&val.to_be_bytes());
318 }
319
320 pub fn write_u64_le(&mut self, val: u64) {
321 self.write_bytes(&val.to_le_bytes());
322 }
323
324 pub fn write_i64(&mut self, val: i64) {
325 self.write_bytes(&val.to_be_bytes());
326 }
327
328 pub fn write_i64_le(&mut self, val: i64) {
329 self.write_bytes(&val.to_le_bytes());
330 }
331
332 pub fn write_u128(&mut self, val: u128) {
333 self.write_bytes(&val.to_be_bytes());
334 }
335
336 pub fn write_u128_le(&mut self, val: u128) {
337 self.write_bytes(&val.to_le_bytes());
338 }
339
340 pub fn write_i128(&mut self, val: i128) {
341 self.write_bytes(&val.to_be_bytes());
342 }
343
344 pub fn write_i128_le(&mut self, val: i128) {
345 self.write_bytes(&val.to_le_bytes());
346 }
347
348 pub fn write_f32(&mut self, val: f32) {
349 self.write_bytes(&val.to_be_bytes());
350 }
351
352 pub fn write_f32_le(&mut self, val: f32) {
353 self.write_bytes(&val.to_le_bytes());
354 }
355
356 pub fn write_f64(&mut self, val: f64) {
357 self.write_bytes(&val.to_be_bytes());
358 }
359
360 pub fn write_f64_le(&mut self, val: f64) {
361 self.write_bytes(&val.to_le_bytes());
362 }
363
364 pub fn write_bytes(&mut self, src: &[u8]) {
365 let end = self.writer_index + src.len();
366 assert!(self.buf.len() >= end);
367 self.buf[self.writer_index..end].copy_from_slice(src);
368 self.writer_index = end;
369 }
370
371 pub fn write_bytes_uncheck(&mut self, src: &[u8]) -> usize {
372 let copy_len = if (self.writer_index + src.len()) > self.buf.len() {
373 self.buf.len() - self.writer_index
374 } else {
375 src.len()
376 };
377 self.buf[self.writer_index..].copy_from_slice(&src[..copy_len]);
378 copy_len
379 }
380
381 pub fn set_u8(&mut self, index: usize, val: u8) {
382 assert!(self.buf.len() > index);
383 self.buf[index] = val;
384 }
385
386 pub fn set_u16(&mut self, index: usize, val: u16) {
387 self.set_bytes(index, &val.to_be_bytes());
388 }
389
390 pub fn set_u16_le(&mut self, index: usize, val: u16) {
391 self.set_bytes(index, &val.to_le_bytes());
392 }
393
394 pub fn set_i16(&mut self, index: usize, val: i16) {
395 self.set_bytes(index, &val.to_be_bytes());
396 }
397
398 pub fn set_i16_le(&mut self, index: usize, val: i16) {
399 self.set_bytes(index, &val.to_le_bytes());
400 }
401
402 pub fn set_u32(&mut self, index: usize, val: u32) {
403 self.set_bytes(index, &val.to_be_bytes());
404 }
405
406 pub fn set_u32_le(&mut self, index: usize, val: u32) {
407 self.set_bytes(index, &val.to_le_bytes());
408 }
409
410 pub fn set_i32(&mut self, index: usize, val: i32) {
411 self.set_bytes(index, &val.to_be_bytes());
412 }
413
414 pub fn set_i32_le(&mut self, index: usize, val: i32) {
415 self.set_bytes(index, &val.to_le_bytes());
416 }
417
418 pub fn set_u64(&mut self, index: usize, val: u64) {
419 self.set_bytes(index, &val.to_be_bytes());
420 }
421
422 pub fn set_u64_le(&mut self, index: usize, val: u64) {
423 self.set_bytes(index, &val.to_le_bytes());
424 }
425
426 pub fn set_i64(&mut self, index: usize, val: i64) {
427 self.set_bytes(index, &val.to_be_bytes());
428 }
429
430 pub fn set_i64_le(&mut self, index: usize, val: i64) {
431 self.set_bytes(index, &val.to_le_bytes());
432 }
433
434 pub fn set_u128(&mut self, index: usize, val: u128) {
435 self.set_bytes(index, &val.to_be_bytes());
436 }
437
438 pub fn set_u128_le(&mut self, index: usize, val: u128) {
439 self.set_bytes(index, &val.to_le_bytes());
440 }
441
442 pub fn set_i128(&mut self, index: usize, val: i128) {
443 self.set_bytes(index, &val.to_be_bytes());
444 }
445
446 pub fn set_i128_le(&mut self, index: usize, val: i128) {
447 self.set_bytes(index, &val.to_le_bytes());
448 }
449
450 pub fn set_f32(&mut self, index: usize, val: f32) {
451 self.set_bytes(index, &val.to_be_bytes());
452 }
453
454 pub fn set_f32_le(&mut self, index: usize, val: f32) {
455 self.set_bytes(index, &val.to_le_bytes());
456 }
457
458 pub fn set_f64(&mut self, index: usize, val: f64) {
459 self.set_bytes(index, &val.to_be_bytes());
460 }
461
462 pub fn set_f64_le(&mut self, index: usize, val: f64) {
463 self.set_bytes(index, &val.to_le_bytes());
464 }
465
466 pub fn set_bytes(&mut self, index: usize, src: &[u8]) {
467 let end = index + src.len();
468 assert!(self.buf.len() >= end);
469 self.buf[index..end].copy_from_slice(src);
470 }
471
472 pub fn set_reader_index(&mut self, index: usize) {
473 assert!(self.buf.len() >= index && index <= self.writer_index);
474 self.reader_index = index;
475 }
476
477 pub fn reader_index(&self) -> usize {
478 self.reader_index
479 }
480
481 pub fn set_writer_index(&mut self, index: usize) {
482 assert!(self.buf.len() >= index && index >= self.reader_index);
483 self.writer_index = index;
484 }
485
486 pub fn writer_index(&self) -> usize {
487 self.writer_index
488 }
489
490 pub fn set_index(&mut self, reader_index: usize, writer_index: usize) {
491 assert!(reader_index <= writer_index && self.buf.len() >= writer_index);
492 self.reader_index = reader_index;
493 self.writer_index = writer_index;
494 }
495
496 pub fn clear(&mut self) {
497 self.reader_index = 0;
498 self.writer_index = 0;
499 }
500
501 pub fn remaining(&self) -> usize {
502 self.writer_index - self.reader_index
503 }
504
505 pub fn capacity(&self) -> usize {
506 self.buf.len()
507 }
508
509 pub fn as_slice(&mut self) -> &mut [u8] {
510 &mut self.buf[self.reader_index..self.writer_index]
511 }
512
513 pub fn as_raw_slice(&mut self) -> &mut [u8] {
514 self.buf
515 }
516}
517
518impl std::fmt::Display for BufViewMut<'_> {
519 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
520 write!(
521 f,
522 "reader_index: {}, writer_index: {}, capacity: {}",
523 self.reader_index(),
524 self.writer_index(),
525 self.capacity()
526 )
527 }
528}
529
530impl<'a> Write for BufViewMut<'a> {
531 fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
532 let len = self.write_bytes_uncheck(buf);
533 Ok(len)
534 }
535
536 fn flush(&mut self) -> io::Result<()> {
537 Ok(())
538 }
539}