1use core::cmp;
12
13use crate::io::{self, Error, ErrorKind, Initializer, SeekFrom, prelude::*};
14
15#[derive(Clone, Debug)]
82pub struct Cursor<T> {
83 inner: T,
84 pos: u64,
85}
86
87impl<T> Cursor<T> {
88 pub fn new(inner: T) -> Cursor<T> {
104 Cursor { pos: 0, inner }
105 }
106
107 pub fn into_inner(self) -> T {
121 self.inner
122 }
123
124 pub fn get_ref(&self) -> &T {
138 &self.inner
139 }
140
141 pub fn get_mut(&mut self) -> &mut T {
158 &mut self.inner
159 }
160
161 pub fn position(&self) -> u64 {
181 self.pos
182 }
183
184 pub fn set_position(&mut self, pos: u64) {
202 self.pos = pos;
203 }
204}
205
206impl<T> io::Seek for Cursor<T>
207where
208 T: AsRef<[u8]>,
209{
210 fn seek(&mut self, style: SeekFrom) -> io::Result<u64> {
211 let (base_pos, offset) = match style {
212 SeekFrom::Start(n) => {
213 self.pos = n;
214 return Ok(n);
215 }
216 SeekFrom::End(n) => (self.inner.as_ref().len() as u64, n),
217 SeekFrom::Current(n) => (self.pos, n),
218 };
219 let new_pos = if offset >= 0 {
220 base_pos.checked_add(offset as u64)
221 } else {
222 base_pos.checked_sub((offset.wrapping_neg()) as u64)
223 };
224 match new_pos {
225 Some(n) => {
226 self.pos = n;
227 Ok(self.pos)
228 }
229 None => Err(Error::new(
230 ErrorKind::InvalidInput,
231 "invalid seek to a negative or overflowing position",
232 )),
233 }
234 }
235}
236
237impl<T> Read for Cursor<T>
238where
239 T: AsRef<[u8]>,
240{
241 fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
242 let n = Read::read(&mut self.get_buf()?, buf)?;
243 self.pos += n as u64;
244 Ok(n)
245 }
246
247 fn read_exact(&mut self, buf: &mut [u8]) -> io::Result<()> {
248 let n = buf.len();
249 Read::read_exact(&mut self.get_buf()?, buf)?;
250 self.pos += n as u64;
251 Ok(())
252 }
253
254 #[inline]
255 unsafe fn initializer(&self) -> Initializer {
256 unsafe { Initializer::nop() }
257 }
258}
259
260impl<T> Cursor<T>
261where
262 T: AsRef<[u8]>,
263{
264 fn get_buf(&mut self) -> io::Result<&[u8]> {
265 let amt = cmp::min(self.pos, self.inner.as_ref().len() as u64);
266 Ok(&self.inner.as_ref()[(amt as usize)..])
267 }
268}
269
270impl<T> BufRead for Cursor<T>
271where
272 T: AsRef<[u8]>,
273{
274 fn fill_buf(&mut self) -> io::Result<&[u8]> {
275 self.get_buf()
276 }
277 fn consume(&mut self, amt: usize) {
278 self.pos += amt as u64;
279 }
280}
281
282fn slice_write(pos_mut: &mut u64, slice: &mut [u8], buf: &[u8]) -> io::Result<usize> {
284 let pos = cmp::min(*pos_mut, slice.len() as u64);
285 let amt = (&mut slice[(pos as usize)..]).write(buf)?;
286 *pos_mut += amt as u64;
287 Ok(amt)
288}
289
290fn vec_write(pos_mut: &mut u64, vec: &mut Vec<u8>, buf: &[u8]) -> io::Result<usize> {
292 let pos: usize = (*pos_mut).try_into().map_err(|_| {
293 Error::new(
294 ErrorKind::InvalidInput,
295 "cursor position exceeds maximum possible vector length",
296 )
297 })?;
298 let len = vec.len();
301 if len < pos {
302 vec.resize(pos, 0);
304 }
305 {
308 let space = vec.len() - pos;
309 let (left, right) = buf.split_at(cmp::min(space, buf.len()));
310 vec[pos..pos + left.len()].copy_from_slice(left);
311 vec.extend_from_slice(right);
312 }
313
314 *pos_mut = (pos + buf.len()) as u64;
316 Ok(buf.len())
317}
318
319impl Write for Cursor<&mut [u8]> {
320 #[inline]
321 fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
322 slice_write(&mut self.pos, self.inner, buf)
323 }
324 fn flush(&mut self) -> io::Result<()> {
325 Ok(())
326 }
327}
328
329impl Write for Cursor<&mut Vec<u8>> {
330 fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
331 vec_write(&mut self.pos, self.inner, buf)
332 }
333 fn flush(&mut self) -> io::Result<()> {
334 Ok(())
335 }
336}
337
338impl Write for Cursor<Vec<u8>> {
339 fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
340 vec_write(&mut self.pos, &mut self.inner, buf)
341 }
342 fn flush(&mut self) -> io::Result<()> {
343 Ok(())
344 }
345}
346
347impl Write for Cursor<::alloc::boxed::Box<[u8]>> {
348 #[inline]
349 fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
350 slice_write(&mut self.pos, &mut self.inner, buf)
351 }
352 fn flush(&mut self) -> io::Result<()> {
353 Ok(())
354 }
355}
356
357#[cfg(test)]
358mod tests {
359 use crate::io::{Cursor, SeekFrom, prelude::*};
360
361 #[test]
362 fn test_vec_writer() {
363 let mut writer = Vec::new();
364 assert_eq!(writer.write(&[0]).unwrap(), 1);
365 assert_eq!(writer.write(&[1, 2, 3]).unwrap(), 3);
366 assert_eq!(writer.write(&[4, 5, 6, 7]).unwrap(), 4);
367 let b: &[_] = &[0, 1, 2, 3, 4, 5, 6, 7];
368 assert_eq!(writer, b);
369 }
370
371 #[test]
372 fn test_mem_writer() {
373 let mut writer = Cursor::new(Vec::new());
374 assert_eq!(writer.write(&[0]).unwrap(), 1);
375 assert_eq!(writer.write(&[1, 2, 3]).unwrap(), 3);
376 assert_eq!(writer.write(&[4, 5, 6, 7]).unwrap(), 4);
377 let b: &[_] = &[0, 1, 2, 3, 4, 5, 6, 7];
378 assert_eq!(writer.get_ref().as_slice(), b);
379 }
380
381 #[test]
382 fn test_mem_mut_writer() {
383 let mut vec = Vec::new();
384 let mut writer = Cursor::new(&mut vec);
385 assert_eq!(writer.write(&[0]).unwrap(), 1);
386 assert_eq!(writer.write(&[1, 2, 3]).unwrap(), 3);
387 assert_eq!(writer.write(&[4, 5, 6, 7]).unwrap(), 4);
388 let b: &[_] = &[0, 1, 2, 3, 4, 5, 6, 7];
389 assert_eq!(writer.get_ref().as_slice(), b);
390 }
391
392 #[test]
393 fn test_box_slice_writer() {
394 let mut writer = Cursor::new(vec![0u8; 9].into_boxed_slice());
395 assert_eq!(writer.position(), 0);
396 assert_eq!(writer.write(&[0]).unwrap(), 1);
397 assert_eq!(writer.position(), 1);
398 assert_eq!(writer.write(&[1, 2, 3]).unwrap(), 3);
399 assert_eq!(writer.write(&[4, 5, 6, 7]).unwrap(), 4);
400 assert_eq!(writer.position(), 8);
401 assert_eq!(writer.write(&[]).unwrap(), 0);
402 assert_eq!(writer.position(), 8);
403
404 assert_eq!(writer.write(&[8, 9]).unwrap(), 1);
405 assert_eq!(writer.write(&[10]).unwrap(), 0);
406 let b: &[_] = &[0, 1, 2, 3, 4, 5, 6, 7, 8];
407 assert_eq!(&**writer.get_ref(), b);
408 }
409
410 #[test]
411 fn test_buf_writer() {
412 let mut buf = [0u8; 9];
413 {
414 let mut writer = Cursor::new(buf.as_mut_slice());
415 assert_eq!(writer.position(), 0);
416 assert_eq!(writer.write(&[0]).unwrap(), 1);
417 assert_eq!(writer.position(), 1);
418 assert_eq!(writer.write(&[1, 2, 3]).unwrap(), 3);
419 assert_eq!(writer.write(&[4, 5, 6, 7]).unwrap(), 4);
420 assert_eq!(writer.position(), 8);
421 assert_eq!(writer.write(&[]).unwrap(), 0);
422 assert_eq!(writer.position(), 8);
423
424 assert_eq!(writer.write(&[8, 9]).unwrap(), 1);
425 assert_eq!(writer.write(&[10]).unwrap(), 0);
426 }
427 let b: &[_] = &[0, 1, 2, 3, 4, 5, 6, 7, 8];
428 assert_eq!(buf, b);
429 }
430
431 #[test]
432 fn test_buf_writer_seek() {
433 let mut buf = [0u8; 8];
434 {
435 let mut writer = Cursor::new(buf.as_mut_slice());
436 assert_eq!(writer.position(), 0);
437 assert_eq!(writer.write(&[1]).unwrap(), 1);
438 assert_eq!(writer.position(), 1);
439
440 assert_eq!(writer.seek(SeekFrom::Start(2)).unwrap(), 2);
441 assert_eq!(writer.position(), 2);
442 assert_eq!(writer.write(&[2]).unwrap(), 1);
443 assert_eq!(writer.position(), 3);
444
445 assert_eq!(writer.seek(SeekFrom::Current(-2)).unwrap(), 1);
446 assert_eq!(writer.position(), 1);
447 assert_eq!(writer.write(&[3]).unwrap(), 1);
448 assert_eq!(writer.position(), 2);
449
450 assert_eq!(writer.seek(SeekFrom::End(-1)).unwrap(), 7);
451 assert_eq!(writer.position(), 7);
452 assert_eq!(writer.write(&[4]).unwrap(), 1);
453 assert_eq!(writer.position(), 8);
454 }
455 let b: &[_] = &[1, 3, 2, 0, 0, 0, 0, 4];
456 assert_eq!(buf, b);
457 }
458
459 #[test]
460 fn test_buf_writer_error() {
461 let mut buf = [0u8; 2];
462 let mut writer = Cursor::new(buf.as_mut_slice());
463 assert_eq!(writer.write(&[0]).unwrap(), 1);
464 assert_eq!(writer.write(&[0, 0]).unwrap(), 1);
465 assert_eq!(writer.write(&[0, 0]).unwrap(), 0);
466 }
467
468 #[test]
469 fn test_mem_reader() {
470 let mut reader = Cursor::new(vec![0, 1, 2, 3, 4, 5, 6, 7]);
471 let mut buf = [];
472 assert_eq!(reader.read(&mut buf).unwrap(), 0);
473 assert_eq!(reader.position(), 0);
474 let mut buf = [0];
475 assert_eq!(reader.read(&mut buf).unwrap(), 1);
476 assert_eq!(reader.position(), 1);
477 let b: &[_] = &[0];
478 assert_eq!(buf, b);
479 let mut buf = [0; 4];
480 assert_eq!(reader.read(&mut buf).unwrap(), 4);
481 assert_eq!(reader.position(), 5);
482 let b: &[_] = &[1, 2, 3, 4];
483 assert_eq!(buf, b);
484 assert_eq!(reader.read(&mut buf).unwrap(), 3);
485 let b: &[_] = &[5, 6, 7];
486 assert_eq!(&buf[..3], b);
487 assert_eq!(reader.read(&mut buf).unwrap(), 0);
488 }
489
490 #[test]
491 fn test_boxed_slice_reader() {
492 let mut reader = Cursor::new(vec![0, 1, 2, 3, 4, 5, 6, 7].into_boxed_slice());
493 let mut buf = [];
494 assert_eq!(reader.read(&mut buf).unwrap(), 0);
495 assert_eq!(reader.position(), 0);
496 let mut buf = [0];
497 assert_eq!(reader.read(&mut buf).unwrap(), 1);
498 assert_eq!(reader.position(), 1);
499 let b: &[_] = &[0];
500 assert_eq!(buf, b);
501 let mut buf = [0; 4];
502 assert_eq!(reader.read(&mut buf).unwrap(), 4);
503 assert_eq!(reader.position(), 5);
504 let b: &[_] = &[1, 2, 3, 4];
505 assert_eq!(buf, b);
506 assert_eq!(reader.read(&mut buf).unwrap(), 3);
507 let b: &[_] = &[5, 6, 7];
508 assert_eq!(&buf[..3], b);
509 assert_eq!(reader.read(&mut buf).unwrap(), 0);
510 }
511
512 #[test]
513 fn read_to_end() {
514 let mut reader = Cursor::new(vec![0, 1, 2, 3, 4, 5, 6, 7]);
515 let mut v = Vec::new();
516 reader.read_to_end(&mut v).unwrap();
517 assert_eq!(v, [0, 1, 2, 3, 4, 5, 6, 7]);
518 }
519
520 #[test]
521 fn test_slice_reader() {
522 let in_buf = [0, 1, 2, 3, 4, 5, 6, 7];
523 let reader = &mut in_buf.as_slice();
524 let mut buf = [];
525 assert_eq!(reader.read(&mut buf).unwrap(), 0);
526 let mut buf = [0];
527 assert_eq!(reader.read(&mut buf).unwrap(), 1);
528 assert_eq!(reader.len(), 7);
529 let b: &[_] = &[0];
530 assert_eq!(&buf, b);
531 let mut buf = [0; 4];
532 assert_eq!(reader.read(&mut buf).unwrap(), 4);
533 assert_eq!(reader.len(), 3);
534 let b: &[_] = &[1, 2, 3, 4];
535 assert_eq!(&buf, b);
536 assert_eq!(reader.read(&mut buf).unwrap(), 3);
537 let b: &[_] = &[5, 6, 7];
538 assert_eq!(&buf[..3], b);
539 assert_eq!(reader.read(&mut buf).unwrap(), 0);
540 }
541
542 #[test]
543 fn test_read_exact() {
544 let in_buf = [0, 1, 2, 3, 4, 5, 6, 7];
545 let reader = &mut in_buf.as_slice();
546 let mut buf = [];
547 assert!(reader.read_exact(&mut buf).is_ok());
548 let mut buf = [8];
549 assert!(reader.read_exact(&mut buf).is_ok());
550 assert_eq!(buf[0], 0);
551 assert_eq!(reader.len(), 7);
552 let mut buf = [0, 0, 0, 0, 0, 0, 0];
553 assert!(reader.read_exact(&mut buf).is_ok());
554 assert_eq!(buf, [1, 2, 3, 4, 5, 6, 7]);
555 assert_eq!(reader.len(), 0);
556 let mut buf = [0];
557 assert!(reader.read_exact(&mut buf).is_err());
558 }
559
560 #[test]
561 fn test_buf_reader() {
562 let in_buf = [0, 1, 2, 3, 4, 5, 6, 7];
563 let mut reader = Cursor::new(&in_buf);
564 let mut buf = [];
565 assert_eq!(reader.read(&mut buf).unwrap(), 0);
566 assert_eq!(reader.position(), 0);
567 let mut buf = [0];
568 assert_eq!(reader.read(&mut buf).unwrap(), 1);
569 assert_eq!(reader.position(), 1);
570 let b: &[_] = &[0];
571 assert_eq!(buf, b);
572 let mut buf = [0; 4];
573 assert_eq!(reader.read(&mut buf).unwrap(), 4);
574 assert_eq!(reader.position(), 5);
575 let b: &[_] = &[1, 2, 3, 4];
576 assert_eq!(buf, b);
577 assert_eq!(reader.read(&mut buf).unwrap(), 3);
578 let b: &[_] = &[5, 6, 7];
579 assert_eq!(&buf[..3], b);
580 assert_eq!(reader.read(&mut buf).unwrap(), 0);
581 }
582
583 #[test]
584 fn seek_past_end() {
585 let buf = [0xff];
586 let mut r = Cursor::new(&buf);
587 assert_eq!(r.seek(SeekFrom::Start(10)).unwrap(), 10);
588 assert_eq!(r.read(&mut [0]).unwrap(), 0);
589
590 let mut r = Cursor::new(vec![10]);
591 assert_eq!(r.seek(SeekFrom::Start(10)).unwrap(), 10);
592 assert_eq!(r.read(&mut [0]).unwrap(), 0);
593
594 let mut buf = [0];
595 let mut r = Cursor::new(buf.as_mut_slice());
596 assert_eq!(r.seek(SeekFrom::Start(10)).unwrap(), 10);
597 assert_eq!(r.write(&[3]).unwrap(), 0);
598
599 let mut r = Cursor::new(vec![10].into_boxed_slice());
600 assert_eq!(r.seek(SeekFrom::Start(10)).unwrap(), 10);
601 assert_eq!(r.write(&[3]).unwrap(), 0);
602 }
603
604 #[test]
605 fn seek_past_i64() {
606 let buf = [0xff];
607 let mut r = Cursor::new(&buf);
608 assert_eq!(r.seek(SeekFrom::Start(6)).unwrap(), 6);
609 assert_eq!(
610 r.seek(SeekFrom::Current(0x7ffffffffffffff0)).unwrap(),
611 0x7ffffffffffffff6
612 );
613 assert_eq!(r.seek(SeekFrom::Current(0x10)).unwrap(), 0x8000000000000006);
614 assert_eq!(r.seek(SeekFrom::Current(0)).unwrap(), 0x8000000000000006);
615 assert!(r.seek(SeekFrom::Current(0x7ffffffffffffffd)).is_err());
616 assert_eq!(r.seek(SeekFrom::Current(-0x8000000000000000)).unwrap(), 6);
617
618 let mut r = Cursor::new(vec![10]);
619 assert_eq!(r.seek(SeekFrom::Start(6)).unwrap(), 6);
620 assert_eq!(
621 r.seek(SeekFrom::Current(0x7ffffffffffffff0)).unwrap(),
622 0x7ffffffffffffff6
623 );
624 assert_eq!(r.seek(SeekFrom::Current(0x10)).unwrap(), 0x8000000000000006);
625 assert_eq!(r.seek(SeekFrom::Current(0)).unwrap(), 0x8000000000000006);
626 assert!(r.seek(SeekFrom::Current(0x7ffffffffffffffd)).is_err());
627 assert_eq!(r.seek(SeekFrom::Current(-0x8000000000000000)).unwrap(), 6);
628
629 let mut buf = [0];
630 let mut r = Cursor::new(&mut buf);
631 assert_eq!(r.seek(SeekFrom::Start(6)).unwrap(), 6);
632 assert_eq!(
633 r.seek(SeekFrom::Current(0x7ffffffffffffff0)).unwrap(),
634 0x7ffffffffffffff6
635 );
636 assert_eq!(r.seek(SeekFrom::Current(0x10)).unwrap(), 0x8000000000000006);
637 assert_eq!(r.seek(SeekFrom::Current(0)).unwrap(), 0x8000000000000006);
638 assert!(r.seek(SeekFrom::Current(0x7ffffffffffffffd)).is_err());
639 assert_eq!(r.seek(SeekFrom::Current(-0x8000000000000000)).unwrap(), 6);
640
641 let mut r = Cursor::new(vec![10].into_boxed_slice());
642 assert_eq!(r.seek(SeekFrom::Start(6)).unwrap(), 6);
643 assert_eq!(
644 r.seek(SeekFrom::Current(0x7ffffffffffffff0)).unwrap(),
645 0x7ffffffffffffff6
646 );
647 assert_eq!(r.seek(SeekFrom::Current(0x10)).unwrap(), 0x8000000000000006);
648 assert_eq!(r.seek(SeekFrom::Current(0)).unwrap(), 0x8000000000000006);
649 assert!(r.seek(SeekFrom::Current(0x7ffffffffffffffd)).is_err());
650 assert_eq!(r.seek(SeekFrom::Current(-0x8000000000000000)).unwrap(), 6);
651 }
652
653 #[test]
654 fn seek_before_0() {
655 let buf = [0xff];
656 let mut r = Cursor::new(&buf);
657 assert!(r.seek(SeekFrom::End(-2)).is_err());
658
659 let mut r = Cursor::new(vec![10]);
660 assert!(r.seek(SeekFrom::End(-2)).is_err());
661
662 let mut buf = [0];
663 let mut r = Cursor::new(&mut buf);
664 assert!(r.seek(SeekFrom::End(-2)).is_err());
665
666 let mut r = Cursor::new(vec![10].into_boxed_slice());
667 assert!(r.seek(SeekFrom::End(-2)).is_err());
668 }
669
670 #[test]
671 fn test_seekable_mem_writer() {
672 let mut writer = Cursor::new(Vec::<u8>::new());
673 assert_eq!(writer.position(), 0);
674 assert_eq!(writer.write(&[0]).unwrap(), 1);
675 assert_eq!(writer.position(), 1);
676 assert_eq!(writer.write(&[1, 2, 3]).unwrap(), 3);
677 assert_eq!(writer.write(&[4, 5, 6, 7]).unwrap(), 4);
678 assert_eq!(writer.position(), 8);
679 let b: &[_] = &[0, 1, 2, 3, 4, 5, 6, 7];
680 assert_eq!(writer.get_ref().as_slice(), b);
681
682 assert_eq!(writer.seek(SeekFrom::Start(0)).unwrap(), 0);
683 assert_eq!(writer.position(), 0);
684 assert_eq!(writer.write(&[3, 4]).unwrap(), 2);
685 let b: &[_] = &[3, 4, 2, 3, 4, 5, 6, 7];
686 assert_eq!(writer.get_ref().as_slice(), b);
687
688 assert_eq!(writer.seek(SeekFrom::Current(1)).unwrap(), 3);
689 assert_eq!(writer.write(&[0, 1]).unwrap(), 2);
690 let b: &[_] = &[3, 4, 2, 0, 1, 5, 6, 7];
691 assert_eq!(writer.get_ref().as_slice(), b);
692
693 assert_eq!(writer.seek(SeekFrom::End(-1)).unwrap(), 7);
694 assert_eq!(writer.write(&[1, 2]).unwrap(), 2);
695 let b: &[_] = &[3, 4, 2, 0, 1, 5, 6, 1, 2];
696 assert_eq!(writer.get_ref().as_slice(), b);
697
698 assert_eq!(writer.seek(SeekFrom::End(1)).unwrap(), 10);
699 assert_eq!(writer.write(&[1]).unwrap(), 1);
700 let b: &[_] = &[3, 4, 2, 0, 1, 5, 6, 1, 2, 0, 1];
701 assert_eq!(writer.get_ref().as_slice(), b);
702 }
703
704 #[test]
705 fn vec_seek_past_end() {
706 let mut r = Cursor::new(Vec::new());
707 assert_eq!(r.seek(SeekFrom::Start(10)).unwrap(), 10);
708 assert_eq!(r.write(&[3]).unwrap(), 1);
709 }
710
711 #[test]
712 fn vec_seek_before_0() {
713 let mut r = Cursor::new(Vec::new());
714 assert!(r.seek(SeekFrom::End(-2)).is_err());
715 }
716
717 #[test]
718 #[cfg(target_pointer_width = "32")]
719 fn vec_seek_and_write_past_usize_max() {
720 let mut c = Cursor::new(Vec::new());
721 c.set_position(<usize>::max_value() as u64 + 1);
722 assert!(c.write_all(&[1, 2, 3]).is_err());
723 }
724}