1 use crate::io
::prelude
::*;
4 use crate::io
::{self, Error, ErrorKind, Initializer, IoSlice, IoSliceMut, SeekFrom}
;
6 use core
::convert
::TryInto
;
8 /// A `Cursor` wraps an in-memory buffer and provides it with a
9 /// [`Seek`] implementation.
11 /// `Cursor`s are used with in-memory buffers, anything implementing
12 /// [`AsRef`]`<[u8]>`, to allow them to implement [`Read`] and/or [`Write`],
13 /// allowing these buffers to be used anywhere you might use a reader or writer
14 /// that does actual I/O.
16 /// The standard library implements some I/O traits on various types which
17 /// are commonly used as a buffer, like `Cursor<`[`Vec`]`<u8>>` and
18 /// `Cursor<`[`&[u8]`][bytes]`>`.
22 /// We may want to write bytes to a [`File`] in our production
23 /// code, but use an in-memory buffer in our tests. We can do this with
26 /// [bytes]: crate::slice
27 /// [`File`]: crate::fs::File
30 /// use std::io::prelude::*;
31 /// use std::io::{self, SeekFrom};
32 /// use std::fs::File;
34 /// // a library function we've written
35 /// fn write_ten_bytes_at_end<W: Write + Seek>(writer: &mut W) -> io::Result<()> {
36 /// writer.seek(SeekFrom::End(-10))?;
39 /// writer.write(&[i])?;
46 /// # fn foo() -> io::Result<()> {
47 /// // Here's some code that uses this library function.
49 /// // We might want to use a BufReader here for efficiency, but let's
50 /// // keep this example focused.
51 /// let mut file = File::create("foo.txt")?;
53 /// write_ten_bytes_at_end(&mut file)?;
57 /// // now let's write a test
59 /// fn test_writes_bytes() {
60 /// // setting up a real File is much slower than an in-memory buffer,
61 /// // let's use a cursor instead
62 /// use std::io::Cursor;
63 /// let mut buff = Cursor::new(vec![0; 15]);
65 /// write_ten_bytes_at_end(&mut buff).unwrap();
67 /// assert_eq!(&buff.get_ref()[5..15], &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
70 #[stable(feature = "rust1", since = "1.0.0")]
71 #[derive(Clone, Debug, Default, Eq, PartialEq)]
72 pub struct Cursor
<T
> {
78 /// Creates a new cursor wrapping the provided underlying in-memory buffer.
80 /// Cursor initial position is `0` even if underlying buffer (e.g., [`Vec`])
81 /// is not empty. So writing to cursor starts with overwriting [`Vec`]
82 /// content, not with appending to it.
87 /// use std::io::Cursor;
89 /// let buff = Cursor::new(Vec::new());
90 /// # fn force_inference(_: &Cursor<Vec<u8>>) {}
91 /// # force_inference(&buff);
93 #[stable(feature = "rust1", since = "1.0.0")]
94 pub fn new(inner
: T
) -> Cursor
<T
> {
95 Cursor { pos: 0, inner }
98 /// Consumes this cursor, returning the underlying value.
103 /// use std::io::Cursor;
105 /// let buff = Cursor::new(Vec::new());
106 /// # fn force_inference(_: &Cursor<Vec<u8>>) {}
107 /// # force_inference(&buff);
109 /// let vec = buff.into_inner();
111 #[stable(feature = "rust1", since = "1.0.0")]
112 pub fn into_inner(self) -> T
{
116 /// Gets a reference to the underlying value in this cursor.
121 /// use std::io::Cursor;
123 /// let buff = Cursor::new(Vec::new());
124 /// # fn force_inference(_: &Cursor<Vec<u8>>) {}
125 /// # force_inference(&buff);
127 /// let reference = buff.get_ref();
129 #[stable(feature = "rust1", since = "1.0.0")]
130 pub fn get_ref(&self) -> &T
{
134 /// Gets a mutable reference to the underlying value in this cursor.
136 /// Care should be taken to avoid modifying the internal I/O state of the
137 /// underlying value as it may corrupt this cursor's position.
142 /// use std::io::Cursor;
144 /// let mut buff = Cursor::new(Vec::new());
145 /// # fn force_inference(_: &Cursor<Vec<u8>>) {}
146 /// # force_inference(&buff);
148 /// let reference = buff.get_mut();
150 #[stable(feature = "rust1", since = "1.0.0")]
151 pub fn get_mut(&mut self) -> &mut T
{
155 /// Returns the current position of this cursor.
160 /// use std::io::Cursor;
161 /// use std::io::prelude::*;
162 /// use std::io::SeekFrom;
164 /// let mut buff = Cursor::new(vec![1, 2, 3, 4, 5]);
166 /// assert_eq!(buff.position(), 0);
168 /// buff.seek(SeekFrom::Current(2)).unwrap();
169 /// assert_eq!(buff.position(), 2);
171 /// buff.seek(SeekFrom::Current(-1)).unwrap();
172 /// assert_eq!(buff.position(), 1);
174 #[stable(feature = "rust1", since = "1.0.0")]
175 pub fn position(&self) -> u64 {
179 /// Sets the position of this cursor.
184 /// use std::io::Cursor;
186 /// let mut buff = Cursor::new(vec![1, 2, 3, 4, 5]);
188 /// assert_eq!(buff.position(), 0);
190 /// buff.set_position(2);
191 /// assert_eq!(buff.position(), 2);
193 /// buff.set_position(4);
194 /// assert_eq!(buff.position(), 4);
196 #[stable(feature = "rust1", since = "1.0.0")]
197 pub fn set_position(&mut self, pos
: u64) {
202 #[stable(feature = "rust1", since = "1.0.0")]
203 impl<T
> io
::Seek
for Cursor
<T
>
207 fn seek(&mut self, style
: SeekFrom
) -> io
::Result
<u64> {
208 let (base_pos
, offset
) = match style
{
209 SeekFrom
::Start(n
) => {
213 SeekFrom
::End(n
) => (self.inner
.as_ref().len() as u64, n
),
214 SeekFrom
::Current(n
) => (self.pos
, n
),
216 let new_pos
= if offset
>= 0 {
217 base_pos
.checked_add(offset
as u64)
219 base_pos
.checked_sub((offset
.wrapping_neg()) as u64)
226 None
=> Err(Error
::new(
227 ErrorKind
::InvalidInput
,
228 "invalid seek to a negative or overflowing position",
233 fn stream_len(&mut self) -> io
::Result
<u64> {
234 Ok(self.inner
.as_ref().len() as u64)
237 fn stream_position(&mut self) -> io
::Result
<u64> {
242 #[stable(feature = "rust1", since = "1.0.0")]
243 impl<T
> Read
for Cursor
<T
>
247 fn read(&mut self, buf
: &mut [u8]) -> io
::Result
<usize> {
248 let n
= Read
::read(&mut self.fill_buf()?
, buf
)?
;
249 self.pos
+= n
as u64;
253 fn read_vectored(&mut self, bufs
: &mut [IoSliceMut
<'_
>]) -> io
::Result
<usize> {
256 let n
= self.read(buf
)?
;
265 fn is_read_vectored(&self) -> bool
{
269 fn read_exact(&mut self, buf
: &mut [u8]) -> io
::Result
<()> {
271 Read
::read_exact(&mut self.fill_buf()?
, buf
)?
;
272 self.pos
+= n
as u64;
277 unsafe fn initializer(&self) -> Initializer
{
282 #[stable(feature = "rust1", since = "1.0.0")]
283 impl<T
> BufRead
for Cursor
<T
>
287 fn fill_buf(&mut self) -> io
::Result
<&[u8]> {
288 let amt
= cmp
::min(self.pos
, self.inner
.as_ref().len() as u64);
289 Ok(&self.inner
.as_ref()[(amt
as usize)..])
291 fn consume(&mut self, amt
: usize) {
292 self.pos
+= amt
as u64;
296 // Non-resizing write implementation
298 fn slice_write(pos_mut
: &mut u64, slice
: &mut [u8], buf
: &[u8]) -> io
::Result
<usize> {
299 let pos
= cmp
::min(*pos_mut
, slice
.len() as u64);
300 let amt
= (&mut slice
[(pos
as usize)..]).write(buf
)?
;
301 *pos_mut
+= amt
as u64;
306 fn slice_write_vectored(
309 bufs
: &[IoSlice
<'_
>],
310 ) -> io
::Result
<usize> {
311 let mut nwritten
= 0;
313 let n
= slice_write(pos_mut
, slice
, buf
)?
;
322 // Resizing write implementation
323 fn vec_write(pos_mut
: &mut u64, vec
: &mut Vec
<u8>, buf
: &[u8]) -> io
::Result
<usize> {
324 let pos
: usize = (*pos_mut
).try_into().map_err(|_
| {
326 ErrorKind
::InvalidInput
,
327 "cursor position exceeds maximum possible vector length",
330 // Make sure the internal buffer is as least as big as where we
334 // use `resize` so that the zero filling is as efficient as possible
337 // Figure out what bytes will be used to overwrite what's currently
338 // there (left), and what will be appended on the end (right)
340 let space
= vec
.len() - pos
;
341 let (left
, right
) = buf
.split_at(cmp
::min(space
, buf
.len()));
342 vec
[pos
..pos
+ left
.len()].copy_from_slice(left
);
343 vec
.extend_from_slice(right
);
347 *pos_mut
= (pos
+ buf
.len()) as u64;
351 fn vec_write_vectored(
354 bufs
: &[IoSlice
<'_
>],
355 ) -> io
::Result
<usize> {
356 let mut nwritten
= 0;
358 nwritten
+= vec_write(pos_mut
, vec
, buf
)?
;
363 #[stable(feature = "rust1", since = "1.0.0")]
364 impl Write
for Cursor
<&mut [u8]> {
366 fn write(&mut self, buf
: &[u8]) -> io
::Result
<usize> {
367 slice_write(&mut self.pos
, self.inner
, buf
)
371 fn write_vectored(&mut self, bufs
: &[IoSlice
<'_
>]) -> io
::Result
<usize> {
372 slice_write_vectored(&mut self.pos
, self.inner
, bufs
)
376 fn is_write_vectored(&self) -> bool
{
381 fn flush(&mut self) -> io
::Result
<()> {
386 #[stable(feature = "cursor_mut_vec", since = "1.25.0")]
387 impl Write
for Cursor
<&mut Vec
<u8>> {
388 fn write(&mut self, buf
: &[u8]) -> io
::Result
<usize> {
389 vec_write(&mut self.pos
, self.inner
, buf
)
392 fn write_vectored(&mut self, bufs
: &[IoSlice
<'_
>]) -> io
::Result
<usize> {
393 vec_write_vectored(&mut self.pos
, self.inner
, bufs
)
397 fn is_write_vectored(&self) -> bool
{
402 fn flush(&mut self) -> io
::Result
<()> {
407 #[stable(feature = "rust1", since = "1.0.0")]
408 impl Write
for Cursor
<Vec
<u8>> {
409 fn write(&mut self, buf
: &[u8]) -> io
::Result
<usize> {
410 vec_write(&mut self.pos
, &mut self.inner
, buf
)
413 fn write_vectored(&mut self, bufs
: &[IoSlice
<'_
>]) -> io
::Result
<usize> {
414 vec_write_vectored(&mut self.pos
, &mut self.inner
, bufs
)
418 fn is_write_vectored(&self) -> bool
{
423 fn flush(&mut self) -> io
::Result
<()> {
428 #[stable(feature = "cursor_box_slice", since = "1.5.0")]
429 impl Write
for Cursor
<Box
<[u8]>> {
431 fn write(&mut self, buf
: &[u8]) -> io
::Result
<usize> {
432 slice_write(&mut self.pos
, &mut self.inner
, buf
)
436 fn write_vectored(&mut self, bufs
: &[IoSlice
<'_
>]) -> io
::Result
<usize> {
437 slice_write_vectored(&mut self.pos
, &mut self.inner
, bufs
)
441 fn is_write_vectored(&self) -> bool
{
446 fn flush(&mut self) -> io
::Result
<()> {
453 use crate::io
::prelude
::*;
454 use crate::io
::{Cursor, IoSlice, IoSliceMut, SeekFrom}
;
457 fn test_vec_writer() {
458 let mut writer
= Vec
::new();
459 assert_eq
!(writer
.write(&[0]).unwrap(), 1);
460 assert_eq
!(writer
.write(&[1, 2, 3]).unwrap(), 3);
461 assert_eq
!(writer
.write(&[4, 5, 6, 7]).unwrap(), 4);
464 .write_vectored(&[IoSlice
::new(&[]), IoSlice
::new(&[8, 9]), IoSlice
::new(&[10])],)
468 let b
: &[_
] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
469 assert_eq
!(writer
, b
);
473 fn test_mem_writer() {
474 let mut writer
= Cursor
::new(Vec
::new());
475 assert_eq
!(writer
.write(&[0]).unwrap(), 1);
476 assert_eq
!(writer
.write(&[1, 2, 3]).unwrap(), 3);
477 assert_eq
!(writer
.write(&[4, 5, 6, 7]).unwrap(), 4);
480 .write_vectored(&[IoSlice
::new(&[]), IoSlice
::new(&[8, 9]), IoSlice
::new(&[10])],)
484 let b
: &[_
] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
485 assert_eq
!(&writer
.get_ref()[..], b
);
489 fn test_mem_mut_writer() {
490 let mut vec
= Vec
::new();
491 let mut writer
= Cursor
::new(&mut vec
);
492 assert_eq
!(writer
.write(&[0]).unwrap(), 1);
493 assert_eq
!(writer
.write(&[1, 2, 3]).unwrap(), 3);
494 assert_eq
!(writer
.write(&[4, 5, 6, 7]).unwrap(), 4);
497 .write_vectored(&[IoSlice
::new(&[]), IoSlice
::new(&[8, 9]), IoSlice
::new(&[10])],)
501 let b
: &[_
] = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
502 assert_eq
!(&writer
.get_ref()[..], b
);
506 fn test_box_slice_writer() {
507 let mut writer
= Cursor
::new(vec
![0u8; 9].into_boxed_slice());
508 assert_eq
!(writer
.position(), 0);
509 assert_eq
!(writer
.write(&[0]).unwrap(), 1);
510 assert_eq
!(writer
.position(), 1);
511 assert_eq
!(writer
.write(&[1, 2, 3]).unwrap(), 3);
512 assert_eq
!(writer
.write(&[4, 5, 6, 7]).unwrap(), 4);
513 assert_eq
!(writer
.position(), 8);
514 assert_eq
!(writer
.write(&[]).unwrap(), 0);
515 assert_eq
!(writer
.position(), 8);
517 assert_eq
!(writer
.write(&[8, 9]).unwrap(), 1);
518 assert_eq
!(writer
.write(&[10]).unwrap(), 0);
519 let b
: &[_
] = &[0, 1, 2, 3, 4, 5, 6, 7, 8];
520 assert_eq
!(&**writer
.get_ref(), b
);
524 fn test_box_slice_writer_vectored() {
525 let mut writer
= Cursor
::new(vec
![0u8; 9].into_boxed_slice());
526 assert_eq
!(writer
.position(), 0);
527 assert_eq
!(writer
.write_vectored(&[IoSlice
::new(&[0])]).unwrap(), 1);
528 assert_eq
!(writer
.position(), 1);
531 .write_vectored(&[IoSlice
::new(&[1, 2, 3]), IoSlice
::new(&[4, 5, 6, 7]),])
535 assert_eq
!(writer
.position(), 8);
536 assert_eq
!(writer
.write_vectored(&[]).unwrap(), 0);
537 assert_eq
!(writer
.position(), 8);
539 assert_eq
!(writer
.write_vectored(&[IoSlice
::new(&[8, 9])]).unwrap(), 1);
540 assert_eq
!(writer
.write_vectored(&[IoSlice
::new(&[10])]).unwrap(), 0);
541 let b
: &[_
] = &[0, 1, 2, 3, 4, 5, 6, 7, 8];
542 assert_eq
!(&**writer
.get_ref(), b
);
546 fn test_buf_writer() {
547 let mut buf
= [0 as u8; 9];
549 let mut writer
= Cursor
::new(&mut buf
[..]);
550 assert_eq
!(writer
.position(), 0);
551 assert_eq
!(writer
.write(&[0]).unwrap(), 1);
552 assert_eq
!(writer
.position(), 1);
553 assert_eq
!(writer
.write(&[1, 2, 3]).unwrap(), 3);
554 assert_eq
!(writer
.write(&[4, 5, 6, 7]).unwrap(), 4);
555 assert_eq
!(writer
.position(), 8);
556 assert_eq
!(writer
.write(&[]).unwrap(), 0);
557 assert_eq
!(writer
.position(), 8);
559 assert_eq
!(writer
.write(&[8, 9]).unwrap(), 1);
560 assert_eq
!(writer
.write(&[10]).unwrap(), 0);
562 let b
: &[_
] = &[0, 1, 2, 3, 4, 5, 6, 7, 8];
567 fn test_buf_writer_vectored() {
568 let mut buf
= [0 as u8; 9];
570 let mut writer
= Cursor
::new(&mut buf
[..]);
571 assert_eq
!(writer
.position(), 0);
572 assert_eq
!(writer
.write_vectored(&[IoSlice
::new(&[0])]).unwrap(), 1);
573 assert_eq
!(writer
.position(), 1);
576 .write_vectored(&[IoSlice
::new(&[1, 2, 3]), IoSlice
::new(&[4, 5, 6, 7])],)
580 assert_eq
!(writer
.position(), 8);
581 assert_eq
!(writer
.write_vectored(&[]).unwrap(), 0);
582 assert_eq
!(writer
.position(), 8);
584 assert_eq
!(writer
.write_vectored(&[IoSlice
::new(&[8, 9])]).unwrap(), 1);
585 assert_eq
!(writer
.write_vectored(&[IoSlice
::new(&[10])]).unwrap(), 0);
587 let b
: &[_
] = &[0, 1, 2, 3, 4, 5, 6, 7, 8];
592 fn test_buf_writer_seek() {
593 let mut buf
= [0 as u8; 8];
595 let mut writer
= Cursor
::new(&mut buf
[..]);
596 assert_eq
!(writer
.position(), 0);
597 assert_eq
!(writer
.write(&[1]).unwrap(), 1);
598 assert_eq
!(writer
.position(), 1);
600 assert_eq
!(writer
.seek(SeekFrom
::Start(2)).unwrap(), 2);
601 assert_eq
!(writer
.position(), 2);
602 assert_eq
!(writer
.write(&[2]).unwrap(), 1);
603 assert_eq
!(writer
.position(), 3);
605 assert_eq
!(writer
.seek(SeekFrom
::Current(-2)).unwrap(), 1);
606 assert_eq
!(writer
.position(), 1);
607 assert_eq
!(writer
.write(&[3]).unwrap(), 1);
608 assert_eq
!(writer
.position(), 2);
610 assert_eq
!(writer
.seek(SeekFrom
::End(-1)).unwrap(), 7);
611 assert_eq
!(writer
.position(), 7);
612 assert_eq
!(writer
.write(&[4]).unwrap(), 1);
613 assert_eq
!(writer
.position(), 8);
615 let b
: &[_
] = &[1, 3, 2, 0, 0, 0, 0, 4];
620 fn test_buf_writer_error() {
621 let mut buf
= [0 as u8; 2];
622 let mut writer
= Cursor
::new(&mut buf
[..]);
623 assert_eq
!(writer
.write(&[0]).unwrap(), 1);
624 assert_eq
!(writer
.write(&[0, 0]).unwrap(), 1);
625 assert_eq
!(writer
.write(&[0, 0]).unwrap(), 0);
629 fn test_mem_reader() {
630 let mut reader
= Cursor
::new(vec
![0, 1, 2, 3, 4, 5, 6, 7]);
632 assert_eq
!(reader
.read(&mut buf
).unwrap(), 0);
633 assert_eq
!(reader
.position(), 0);
635 assert_eq
!(reader
.read(&mut buf
).unwrap(), 1);
636 assert_eq
!(reader
.position(), 1);
639 let mut buf
= [0; 4];
640 assert_eq
!(reader
.read(&mut buf
).unwrap(), 4);
641 assert_eq
!(reader
.position(), 5);
642 let b
: &[_
] = &[1, 2, 3, 4];
644 assert_eq
!(reader
.read(&mut buf
).unwrap(), 3);
645 let b
: &[_
] = &[5, 6, 7];
646 assert_eq
!(&buf
[..3], b
);
647 assert_eq
!(reader
.read(&mut buf
).unwrap(), 0);
651 fn test_mem_reader_vectored() {
652 let mut reader
= Cursor
::new(vec
![0, 1, 2, 3, 4, 5, 6, 7]);
654 assert_eq
!(reader
.read_vectored(&mut [IoSliceMut
::new(&mut buf
)]).unwrap(), 0);
655 assert_eq
!(reader
.position(), 0);
659 .read_vectored(&mut [IoSliceMut
::new(&mut []), IoSliceMut
::new(&mut buf
),])
663 assert_eq
!(reader
.position(), 1);
666 let mut buf1
= [0; 4];
667 let mut buf2
= [0; 4];
670 .read_vectored(&mut [IoSliceMut
::new(&mut buf1
), IoSliceMut
::new(&mut buf2
),])
674 let b1
: &[_
] = &[1, 2, 3, 4];
675 let b2
: &[_
] = &[5, 6, 7];
676 assert_eq
!(buf1
, b1
);
677 assert_eq
!(&buf2
[..3], b2
);
678 assert_eq
!(reader
.read(&mut buf
).unwrap(), 0);
682 fn test_boxed_slice_reader() {
683 let mut reader
= Cursor
::new(vec
![0, 1, 2, 3, 4, 5, 6, 7].into_boxed_slice());
685 assert_eq
!(reader
.read(&mut buf
).unwrap(), 0);
686 assert_eq
!(reader
.position(), 0);
688 assert_eq
!(reader
.read(&mut buf
).unwrap(), 1);
689 assert_eq
!(reader
.position(), 1);
692 let mut buf
= [0; 4];
693 assert_eq
!(reader
.read(&mut buf
).unwrap(), 4);
694 assert_eq
!(reader
.position(), 5);
695 let b
: &[_
] = &[1, 2, 3, 4];
697 assert_eq
!(reader
.read(&mut buf
).unwrap(), 3);
698 let b
: &[_
] = &[5, 6, 7];
699 assert_eq
!(&buf
[..3], b
);
700 assert_eq
!(reader
.read(&mut buf
).unwrap(), 0);
704 fn test_boxed_slice_reader_vectored() {
705 let mut reader
= Cursor
::new(vec
![0, 1, 2, 3, 4, 5, 6, 7].into_boxed_slice());
707 assert_eq
!(reader
.read_vectored(&mut [IoSliceMut
::new(&mut buf
)]).unwrap(), 0);
708 assert_eq
!(reader
.position(), 0);
712 .read_vectored(&mut [IoSliceMut
::new(&mut []), IoSliceMut
::new(&mut buf
),])
716 assert_eq
!(reader
.position(), 1);
719 let mut buf1
= [0; 4];
720 let mut buf2
= [0; 4];
723 .read_vectored(&mut [IoSliceMut
::new(&mut buf1
), IoSliceMut
::new(&mut buf2
)],)
727 let b1
: &[_
] = &[1, 2, 3, 4];
728 let b2
: &[_
] = &[5, 6, 7];
729 assert_eq
!(buf1
, b1
);
730 assert_eq
!(&buf2
[..3], b2
);
731 assert_eq
!(reader
.read(&mut buf
).unwrap(), 0);
736 let mut reader
= Cursor
::new(vec
![0, 1, 2, 3, 4, 5, 6, 7]);
737 let mut v
= Vec
::new();
738 reader
.read_to_end(&mut v
).unwrap();
739 assert_eq
!(v
, [0, 1, 2, 3, 4, 5, 6, 7]);
743 fn test_slice_reader() {
744 let in_buf
= vec
![0, 1, 2, 3, 4, 5, 6, 7];
745 let reader
= &mut &in_buf
[..];
747 assert_eq
!(reader
.read(&mut buf
).unwrap(), 0);
749 assert_eq
!(reader
.read(&mut buf
).unwrap(), 1);
750 assert_eq
!(reader
.len(), 7);
752 assert_eq
!(&buf
[..], b
);
753 let mut buf
= [0; 4];
754 assert_eq
!(reader
.read(&mut buf
).unwrap(), 4);
755 assert_eq
!(reader
.len(), 3);
756 let b
: &[_
] = &[1, 2, 3, 4];
757 assert_eq
!(&buf
[..], b
);
758 assert_eq
!(reader
.read(&mut buf
).unwrap(), 3);
759 let b
: &[_
] = &[5, 6, 7];
760 assert_eq
!(&buf
[..3], b
);
761 assert_eq
!(reader
.read(&mut buf
).unwrap(), 0);
765 fn test_slice_reader_vectored() {
766 let in_buf
= vec
![0, 1, 2, 3, 4, 5, 6, 7];
767 let reader
= &mut &in_buf
[..];
769 assert_eq
!(reader
.read_vectored(&mut [IoSliceMut
::new(&mut buf
)]).unwrap(), 0);
773 .read_vectored(&mut [IoSliceMut
::new(&mut []), IoSliceMut
::new(&mut buf
),])
777 assert_eq
!(reader
.len(), 7);
780 let mut buf1
= [0; 4];
781 let mut buf2
= [0; 4];
784 .read_vectored(&mut [IoSliceMut
::new(&mut buf1
), IoSliceMut
::new(&mut buf2
)],)
788 let b1
: &[_
] = &[1, 2, 3, 4];
789 let b2
: &[_
] = &[5, 6, 7];
790 assert_eq
!(buf1
, b1
);
791 assert_eq
!(&buf2
[..3], b2
);
792 assert_eq
!(reader
.read(&mut buf
).unwrap(), 0);
796 fn test_read_exact() {
797 let in_buf
= vec
![0, 1, 2, 3, 4, 5, 6, 7];
798 let reader
= &mut &in_buf
[..];
800 assert
!(reader
.read_exact(&mut buf
).is_ok());
802 assert
!(reader
.read_exact(&mut buf
).is_ok());
803 assert_eq
!(buf
[0], 0);
804 assert_eq
!(reader
.len(), 7);
805 let mut buf
= [0, 0, 0, 0, 0, 0, 0];
806 assert
!(reader
.read_exact(&mut buf
).is_ok());
807 assert_eq
!(buf
, [1, 2, 3, 4, 5, 6, 7]);
808 assert_eq
!(reader
.len(), 0);
810 assert
!(reader
.read_exact(&mut buf
).is_err());
814 fn test_buf_reader() {
815 let in_buf
= vec
![0, 1, 2, 3, 4, 5, 6, 7];
816 let mut reader
= Cursor
::new(&in_buf
[..]);
818 assert_eq
!(reader
.read(&mut buf
).unwrap(), 0);
819 assert_eq
!(reader
.position(), 0);
821 assert_eq
!(reader
.read(&mut buf
).unwrap(), 1);
822 assert_eq
!(reader
.position(), 1);
825 let mut buf
= [0; 4];
826 assert_eq
!(reader
.read(&mut buf
).unwrap(), 4);
827 assert_eq
!(reader
.position(), 5);
828 let b
: &[_
] = &[1, 2, 3, 4];
830 assert_eq
!(reader
.read(&mut buf
).unwrap(), 3);
831 let b
: &[_
] = &[5, 6, 7];
832 assert_eq
!(&buf
[..3], b
);
833 assert_eq
!(reader
.read(&mut buf
).unwrap(), 0);
839 let mut r
= Cursor
::new(&buf
[..]);
840 assert_eq
!(r
.seek(SeekFrom
::Start(10)).unwrap(), 10);
841 assert_eq
!(r
.read(&mut [0]).unwrap(), 0);
843 let mut r
= Cursor
::new(vec
![10]);
844 assert_eq
!(r
.seek(SeekFrom
::Start(10)).unwrap(), 10);
845 assert_eq
!(r
.read(&mut [0]).unwrap(), 0);
848 let mut r
= Cursor
::new(&mut buf
[..]);
849 assert_eq
!(r
.seek(SeekFrom
::Start(10)).unwrap(), 10);
850 assert_eq
!(r
.write(&[3]).unwrap(), 0);
852 let mut r
= Cursor
::new(vec
![10].into_boxed_slice());
853 assert_eq
!(r
.seek(SeekFrom
::Start(10)).unwrap(), 10);
854 assert_eq
!(r
.write(&[3]).unwrap(), 0);
860 let mut r
= Cursor
::new(&buf
[..]);
861 assert_eq
!(r
.seek(SeekFrom
::Start(6)).unwrap(), 6);
862 assert_eq
!(r
.seek(SeekFrom
::Current(0x7ffffffffffffff0)).unwrap(), 0x7ffffffffffffff6);
863 assert_eq
!(r
.seek(SeekFrom
::Current(0x10)).unwrap(), 0x8000000000000006);
864 assert_eq
!(r
.seek(SeekFrom
::Current(0)).unwrap(), 0x8000000000000006);
865 assert
!(r
.seek(SeekFrom
::Current(0x7ffffffffffffffd)).is_err());
866 assert_eq
!(r
.seek(SeekFrom
::Current(-0x8000000000000000)).unwrap(), 6);
868 let mut r
= Cursor
::new(vec
![10]);
869 assert_eq
!(r
.seek(SeekFrom
::Start(6)).unwrap(), 6);
870 assert_eq
!(r
.seek(SeekFrom
::Current(0x7ffffffffffffff0)).unwrap(), 0x7ffffffffffffff6);
871 assert_eq
!(r
.seek(SeekFrom
::Current(0x10)).unwrap(), 0x8000000000000006);
872 assert_eq
!(r
.seek(SeekFrom
::Current(0)).unwrap(), 0x8000000000000006);
873 assert
!(r
.seek(SeekFrom
::Current(0x7ffffffffffffffd)).is_err());
874 assert_eq
!(r
.seek(SeekFrom
::Current(-0x8000000000000000)).unwrap(), 6);
877 let mut r
= Cursor
::new(&mut buf
[..]);
878 assert_eq
!(r
.seek(SeekFrom
::Start(6)).unwrap(), 6);
879 assert_eq
!(r
.seek(SeekFrom
::Current(0x7ffffffffffffff0)).unwrap(), 0x7ffffffffffffff6);
880 assert_eq
!(r
.seek(SeekFrom
::Current(0x10)).unwrap(), 0x8000000000000006);
881 assert_eq
!(r
.seek(SeekFrom
::Current(0)).unwrap(), 0x8000000000000006);
882 assert
!(r
.seek(SeekFrom
::Current(0x7ffffffffffffffd)).is_err());
883 assert_eq
!(r
.seek(SeekFrom
::Current(-0x8000000000000000)).unwrap(), 6);
885 let mut r
= Cursor
::new(vec
![10].into_boxed_slice());
886 assert_eq
!(r
.seek(SeekFrom
::Start(6)).unwrap(), 6);
887 assert_eq
!(r
.seek(SeekFrom
::Current(0x7ffffffffffffff0)).unwrap(), 0x7ffffffffffffff6);
888 assert_eq
!(r
.seek(SeekFrom
::Current(0x10)).unwrap(), 0x8000000000000006);
889 assert_eq
!(r
.seek(SeekFrom
::Current(0)).unwrap(), 0x8000000000000006);
890 assert
!(r
.seek(SeekFrom
::Current(0x7ffffffffffffffd)).is_err());
891 assert_eq
!(r
.seek(SeekFrom
::Current(-0x8000000000000000)).unwrap(), 6);
897 let mut r
= Cursor
::new(&buf
[..]);
898 assert
!(r
.seek(SeekFrom
::End(-2)).is_err());
900 let mut r
= Cursor
::new(vec
![10]);
901 assert
!(r
.seek(SeekFrom
::End(-2)).is_err());
904 let mut r
= Cursor
::new(&mut buf
[..]);
905 assert
!(r
.seek(SeekFrom
::End(-2)).is_err());
907 let mut r
= Cursor
::new(vec
![10].into_boxed_slice());
908 assert
!(r
.seek(SeekFrom
::End(-2)).is_err());
912 fn test_seekable_mem_writer() {
913 let mut writer
= Cursor
::new(Vec
::<u8>::new());
914 assert_eq
!(writer
.position(), 0);
915 assert_eq
!(writer
.write(&[0]).unwrap(), 1);
916 assert_eq
!(writer
.position(), 1);
917 assert_eq
!(writer
.write(&[1, 2, 3]).unwrap(), 3);
918 assert_eq
!(writer
.write(&[4, 5, 6, 7]).unwrap(), 4);
919 assert_eq
!(writer
.position(), 8);
920 let b
: &[_
] = &[0, 1, 2, 3, 4, 5, 6, 7];
921 assert_eq
!(&writer
.get_ref()[..], b
);
923 assert_eq
!(writer
.seek(SeekFrom
::Start(0)).unwrap(), 0);
924 assert_eq
!(writer
.position(), 0);
925 assert_eq
!(writer
.write(&[3, 4]).unwrap(), 2);
926 let b
: &[_
] = &[3, 4, 2, 3, 4, 5, 6, 7];
927 assert_eq
!(&writer
.get_ref()[..], b
);
929 assert_eq
!(writer
.seek(SeekFrom
::Current(1)).unwrap(), 3);
930 assert_eq
!(writer
.write(&[0, 1]).unwrap(), 2);
931 let b
: &[_
] = &[3, 4, 2, 0, 1, 5, 6, 7];
932 assert_eq
!(&writer
.get_ref()[..], b
);
934 assert_eq
!(writer
.seek(SeekFrom
::End(-1)).unwrap(), 7);
935 assert_eq
!(writer
.write(&[1, 2]).unwrap(), 2);
936 let b
: &[_
] = &[3, 4, 2, 0, 1, 5, 6, 1, 2];
937 assert_eq
!(&writer
.get_ref()[..], b
);
939 assert_eq
!(writer
.seek(SeekFrom
::End(1)).unwrap(), 10);
940 assert_eq
!(writer
.write(&[1]).unwrap(), 1);
941 let b
: &[_
] = &[3, 4, 2, 0, 1, 5, 6, 1, 2, 0, 1];
942 assert_eq
!(&writer
.get_ref()[..], b
);
946 fn vec_seek_past_end() {
947 let mut r
= Cursor
::new(Vec
::new());
948 assert_eq
!(r
.seek(SeekFrom
::Start(10)).unwrap(), 10);
949 assert_eq
!(r
.write(&[3]).unwrap(), 1);
953 fn vec_seek_before_0() {
954 let mut r
= Cursor
::new(Vec
::new());
955 assert
!(r
.seek(SeekFrom
::End(-2)).is_err());
959 #[cfg(target_pointer_width = "32")]
960 fn vec_seek_and_write_past_usize_max() {
961 let mut c
= Cursor
::new(Vec
::new());
962 c
.set_position(usize::MAX
as u64 + 1);
963 assert
!(c
.write_all(&[1, 2, 3]).is_err());
967 fn test_partial_eq() {
968 assert_eq
!(Cursor
::new(Vec
::<u8>::new()), Cursor
::new(Vec
::<u8>::new()));
973 struct AssertEq
<T
: Eq
>(pub T
);
975 let _
: AssertEq
<Cursor
<Vec
<u8>>> = AssertEq(Cursor
::new(Vec
::new()));