Skip to main content

relibc/io/
cursor.rs

1// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
2// file at the top-level directory of this distribution and at
3// http://rust-lang.org/COPYRIGHT.
4//
5// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8// option. This file may not be copied, modified, or distributed
9// except according to those terms.
10
11use core::cmp;
12
13use crate::io::{self, Error, ErrorKind, Initializer, SeekFrom, prelude::*};
14
15/// A `Cursor` wraps an in-memory buffer and provides it with a
16/// [`Seek`] implementation.
17///
18/// `Cursor`s are used with in-memory buffers, anything implementing
19/// `AsRef<[u8]>`, to allow them to implement [`Read`] and/or [`Write`],
20/// allowing these buffers to be used anywhere you might use a reader or writer
21/// that does actual I/O.
22///
23/// The standard library implements some I/O traits on various types which
24/// are commonly used as a buffer, like `Cursor<`[`Vec`]`<u8>>` and
25/// `Cursor<`[`&[u8]`][bytes]`>`.
26///
27/// # Examples
28///
29/// We may want to write bytes to a [`File`] in our production
30/// code, but use an in-memory buffer in our tests. We can do this with
31/// `Cursor`:
32///
33/// [`Seek`]: trait.Seek.html
34/// [`Read`]: ../../std/io/trait.Read.html
35/// [`Write`]: ../../std/io/trait.Write.html
36/// [`Vec`]: ../../std/vec/struct.Vec.html
37/// [bytes]: ../../std/primitive.slice.html
38/// [`File`]: ../fs/struct.File.html
39///
40/// ```no_run
41/// use std::io::prelude::*;
42/// use std::io::{self, SeekFrom};
43/// use std::fs::File;
44///
45/// // a library function we've written
46/// fn write_ten_bytes_at_end<W: Write + Seek>(writer: &mut W) -> io::Result<()> {
47///     writer.seek(SeekFrom::End(-10))?;
48///
49///     for i in 0..10 {
50///         writer.write(&[i])?;
51///     }
52///
53///     // all went well
54///     Ok(())
55/// }
56///
57/// # fn foo() -> io::Result<()> {
58/// // Here's some code that uses this library function.
59/// //
60/// // We might want to use a BufReader here for efficiency, but let's
61/// // keep this example focused.
62/// let mut file = File::create("foo.txt")?;
63///
64/// write_ten_bytes_at_end(&mut file)?;
65/// # Ok(())
66/// # }
67///
68/// // now let's write a test
69/// #[test]
70/// fn test_writes_bytes() {
71///     // setting up a real File is much slower than an in-memory buffer,
72///     // let's use a cursor instead
73///     use std::io::Cursor;
74///     let mut buff = Cursor::new(vec![0; 15]);
75///
76///     write_ten_bytes_at_end(&mut buff).unwrap();
77///
78///     assert_eq!(&buff.get_ref()[5..15], &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
79/// }
80/// ```
81#[derive(Clone, Debug)]
82pub struct Cursor<T> {
83    inner: T,
84    pos: u64,
85}
86
87impl<T> Cursor<T> {
88    /// Creates a new cursor wrapping the provided underlying in-memory buffer.
89    ///
90    /// Cursor initial position is `0` even if underlying buffer (e.g. `Vec`)
91    /// is not empty. So writing to cursor starts with overwriting `Vec`
92    /// content, not with appending to it.
93    ///
94    /// # Examples
95    ///
96    /// ```
97    /// use std::io::Cursor;
98    ///
99    /// let buff = Cursor::new(Vec::new());
100    /// # fn force_inference(_: &Cursor<Vec<u8>>) {}
101    /// # force_inference(&buff);
102    /// ```
103    pub fn new(inner: T) -> Cursor<T> {
104        Cursor { pos: 0, inner }
105    }
106
107    /// Consumes this cursor, returning the underlying value.
108    ///
109    /// # Examples
110    ///
111    /// ```
112    /// use std::io::Cursor;
113    ///
114    /// let buff = Cursor::new(Vec::new());
115    /// # fn force_inference(_: &Cursor<Vec<u8>>) {}
116    /// # force_inference(&buff);
117    ///
118    /// let vec = buff.into_inner();
119    /// ```
120    pub fn into_inner(self) -> T {
121        self.inner
122    }
123
124    /// Gets a reference to the underlying value in this cursor.
125    ///
126    /// # Examples
127    ///
128    /// ```
129    /// use std::io::Cursor;
130    ///
131    /// let buff = Cursor::new(Vec::new());
132    /// # fn force_inference(_: &Cursor<Vec<u8>>) {}
133    /// # force_inference(&buff);
134    ///
135    /// let reference = buff.get_ref();
136    /// ```
137    pub fn get_ref(&self) -> &T {
138        &self.inner
139    }
140
141    /// Gets a mutable reference to the underlying value in this cursor.
142    ///
143    /// Care should be taken to avoid modifying the internal I/O state of the
144    /// underlying value as it may corrupt this cursor's position.
145    ///
146    /// # Examples
147    ///
148    /// ```
149    /// use std::io::Cursor;
150    ///
151    /// let mut buff = Cursor::new(Vec::new());
152    /// # fn force_inference(_: &Cursor<Vec<u8>>) {}
153    /// # force_inference(&buff);
154    ///
155    /// let reference = buff.get_mut();
156    /// ```
157    pub fn get_mut(&mut self) -> &mut T {
158        &mut self.inner
159    }
160
161    /// Returns the current position of this cursor.
162    ///
163    /// # Examples
164    ///
165    /// ```
166    /// use std::io::Cursor;
167    /// use std::io::prelude::*;
168    /// use std::io::SeekFrom;
169    ///
170    /// let mut buff = Cursor::new(vec![1, 2, 3, 4, 5]);
171    ///
172    /// assert_eq!(buff.position(), 0);
173    ///
174    /// buff.seek(SeekFrom::Current(2)).unwrap();
175    /// assert_eq!(buff.position(), 2);
176    ///
177    /// buff.seek(SeekFrom::Current(-1)).unwrap();
178    /// assert_eq!(buff.position(), 1);
179    /// ```
180    pub fn position(&self) -> u64 {
181        self.pos
182    }
183
184    /// Sets the position of this cursor.
185    ///
186    /// # Examples
187    ///
188    /// ```
189    /// use std::io::Cursor;
190    ///
191    /// let mut buff = Cursor::new(vec![1, 2, 3, 4, 5]);
192    ///
193    /// assert_eq!(buff.position(), 0);
194    ///
195    /// buff.set_position(2);
196    /// assert_eq!(buff.position(), 2);
197    ///
198    /// buff.set_position(4);
199    /// assert_eq!(buff.position(), 4);
200    /// ```
201    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
282// Non-resizing write implementation
283fn 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
290// Resizing write implementation
291fn 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    // Make sure the internal buffer is as least as big as where we
299    // currently are
300    let len = vec.len();
301    if len < pos {
302        // use `resize` so that the zero filling is as efficient as possible
303        vec.resize(pos, 0);
304    }
305    // Figure out what bytes will be used to overwrite what's currently
306    // there (left), and what will be appended on the end (right)
307    {
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    // Bump us forward
315    *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}