cursor.rs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570
  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. use core::prelude::v1::*;
  11. use io::prelude::*;
  12. use core::cmp;
  13. use io::{self, SeekFrom, Error, ErrorKind};
  14. /// A `Cursor` wraps another type and provides it with a
  15. /// [`Seek`](trait.Seek.html) implementation.
  16. ///
  17. /// Cursors are typically used with in-memory buffers to allow them to
  18. /// implement `Read` and/or `Write`, allowing these buffers to be used
  19. /// anywhere you might use a reader or writer that does actual I/O.
  20. ///
  21. /// The standard library implements some I/O traits on various types which
  22. /// are commonly used as a buffer, like `Cursor<Vec<u8>>` and `Cursor<&[u8]>`.
  23. ///
  24. /// # Examples
  25. ///
  26. /// We may want to write bytes to a [`File`][file] in our production
  27. /// code, but use an in-memory buffer in our tests. We can do this with
  28. /// `Cursor`:
  29. ///
  30. /// [file]: ../fs/struct.File.html
  31. ///
  32. /// ```no_run
  33. /// use std::io::prelude::*;
  34. /// use std::io::{self, SeekFrom};
  35. /// use std::fs::File;
  36. ///
  37. /// // a library function we've written
  38. /// fn write_ten_bytes_at_end<W: Write + Seek>(writer: &mut W) -> io::Result<()> {
  39. /// try!(writer.seek(SeekFrom::End(-10)));
  40. ///
  41. /// for i in 0..10 {
  42. /// try!(writer.write(&[i]));
  43. /// }
  44. ///
  45. /// // all went well
  46. /// Ok(())
  47. /// }
  48. ///
  49. /// # fn foo() -> io::Result<()> {
  50. /// // Here's some code that uses this library function.
  51. /// //
  52. /// // We might want to use a BufReader here for efficiency, but let's
  53. /// // keep this example focused.
  54. /// let mut file = try!(File::create("foo.txt"));
  55. ///
  56. /// try!(write_ten_bytes_at_end(&mut file));
  57. /// # Ok(())
  58. /// # }
  59. ///
  60. /// // now let's write a test
  61. /// #[test]
  62. /// fn test_writes_bytes() {
  63. /// // setting up a real File is much more slow than an in-memory buffer,
  64. /// // let's use a cursor instead
  65. /// use std::io::Cursor;
  66. /// let mut buff = Cursor::new(vec![0; 15]);
  67. ///
  68. /// write_ten_bytes_at_end(&mut buff).unwrap();
  69. ///
  70. /// assert_eq!(&buff.get_ref()[5..15], &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
  71. /// }
  72. /// ```
  73. #[derive(Clone, Debug)]
  74. pub struct Cursor<T> {
  75. inner: T,
  76. pos: u64,
  77. }
  78. impl<T> Cursor<T> {
  79. /// Creates a new cursor wrapping the provided underlying I/O object.
  80. ///
  81. /// # Examples
  82. ///
  83. /// ```
  84. /// use std::io::Cursor;
  85. ///
  86. /// let buff = Cursor::new(Vec::new());
  87. /// # fn force_inference(_: &Cursor<Vec<u8>>) {}
  88. /// # force_inference(&buff);
  89. /// ```
  90. pub fn new(inner: T) -> Cursor<T> {
  91. Cursor { pos: 0, inner: inner }
  92. }
  93. /// Consumes this cursor, returning the underlying value.
  94. ///
  95. /// # Examples
  96. ///
  97. /// ```
  98. /// use std::io::Cursor;
  99. ///
  100. /// let buff = Cursor::new(Vec::new());
  101. /// # fn force_inference(_: &Cursor<Vec<u8>>) {}
  102. /// # force_inference(&buff);
  103. ///
  104. /// let vec = buff.into_inner();
  105. /// ```
  106. pub fn into_inner(self) -> T { self.inner }
  107. /// Gets a reference to the underlying value in this cursor.
  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 reference = buff.get_ref();
  119. /// ```
  120. pub fn get_ref(&self) -> &T { &self.inner }
  121. /// Gets a mutable reference to the underlying value in this cursor.
  122. ///
  123. /// Care should be taken to avoid modifying the internal I/O state of the
  124. /// underlying value as it may corrupt this cursor's position.
  125. ///
  126. /// # Examples
  127. ///
  128. /// ```
  129. /// use std::io::Cursor;
  130. ///
  131. /// let mut buff = Cursor::new(Vec::new());
  132. /// # fn force_inference(_: &Cursor<Vec<u8>>) {}
  133. /// # force_inference(&buff);
  134. ///
  135. /// let reference = buff.get_mut();
  136. /// ```
  137. pub fn get_mut(&mut self) -> &mut T { &mut self.inner }
  138. /// Returns the current position of this cursor.
  139. ///
  140. /// # Examples
  141. ///
  142. /// ```
  143. /// use std::io::Cursor;
  144. /// use std::io::prelude::*;
  145. /// use std::io::SeekFrom;
  146. ///
  147. /// let mut buff = Cursor::new(vec![1, 2, 3, 4, 5]);
  148. ///
  149. /// assert_eq!(buff.position(), 0);
  150. ///
  151. /// buff.seek(SeekFrom::Current(2)).unwrap();
  152. /// assert_eq!(buff.position(), 2);
  153. ///
  154. /// buff.seek(SeekFrom::Current(-1)).unwrap();
  155. /// assert_eq!(buff.position(), 1);
  156. /// ```
  157. pub fn position(&self) -> u64 { self.pos }
  158. /// Sets the position of this cursor.
  159. ///
  160. /// # Examples
  161. ///
  162. /// ```
  163. /// use std::io::Cursor;
  164. ///
  165. /// let mut buff = Cursor::new(vec![1, 2, 3, 4, 5]);
  166. ///
  167. /// assert_eq!(buff.position(), 0);
  168. ///
  169. /// buff.set_position(2);
  170. /// assert_eq!(buff.position(), 2);
  171. ///
  172. /// buff.set_position(4);
  173. /// assert_eq!(buff.position(), 4);
  174. /// ```
  175. pub fn set_position(&mut self, pos: u64) { self.pos = pos; }
  176. }
  177. impl<T> io::Seek for Cursor<T> where T: AsRef<[u8]> {
  178. fn seek(&mut self, style: SeekFrom) -> io::Result<u64> {
  179. let pos = match style {
  180. SeekFrom::Start(n) => { self.pos = n; return Ok(n) }
  181. SeekFrom::End(n) => self.inner.as_ref().len() as i64 + n,
  182. SeekFrom::Current(n) => self.pos as i64 + n,
  183. };
  184. if pos < 0 {
  185. Err(Error::new(ErrorKind::InvalidInput,
  186. "invalid seek to a negative position"))
  187. } else {
  188. self.pos = pos as u64;
  189. Ok(self.pos)
  190. }
  191. }
  192. }
  193. impl<T> Read for Cursor<T> where T: AsRef<[u8]> {
  194. fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
  195. let n = Read::read(&mut self.fill_buf()?, buf)?;
  196. self.pos += n as u64;
  197. Ok(n)
  198. }
  199. }
  200. impl<T> BufRead for Cursor<T> where T: AsRef<[u8]> {
  201. fn fill_buf(&mut self) -> io::Result<&[u8]> {
  202. let amt = cmp::min(self.pos, self.inner.as_ref().len() as u64);
  203. Ok(&self.inner.as_ref()[(amt as usize)..])
  204. }
  205. fn consume(&mut self, amt: usize) { self.pos += amt as u64; }
  206. }
  207. impl<'a> Write for Cursor<&'a mut [u8]> {
  208. fn write(&mut self, data: &[u8]) -> io::Result<usize> {
  209. let pos = cmp::min(self.pos, self.inner.len() as u64);
  210. let amt = (&mut self.inner[(pos as usize)..]).write(data)?;
  211. self.pos += amt as u64;
  212. Ok(amt)
  213. }
  214. fn flush(&mut self) -> io::Result<()> { Ok(()) }
  215. }
  216. impl Write for Cursor<Vec<u8>> {
  217. fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
  218. // Make sure the internal buffer is as least as big as where we
  219. // currently are
  220. let pos = self.position();
  221. let amt = pos.saturating_sub(self.inner.len() as u64);
  222. // use `resize` so that the zero filling is as efficient as possible
  223. let len = self.inner.len();
  224. self.inner.resize(len + amt as usize, 0);
  225. // Figure out what bytes will be used to overwrite what's currently
  226. // there (left), and what will be appended on the end (right)
  227. {
  228. let pos = pos as usize;
  229. let space = self.inner.len() - pos;
  230. let (left, right) = buf.split_at(cmp::min(space, buf.len()));
  231. self.inner[pos..pos + left.len()].copy_from_slice(left);
  232. self.inner.extend_from_slice(right);
  233. }
  234. // Bump us forward
  235. self.set_position(pos + buf.len() as u64);
  236. Ok(buf.len())
  237. }
  238. fn flush(&mut self) -> io::Result<()> { Ok(()) }
  239. }
  240. impl Write for Cursor<Box<[u8]>> {
  241. fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
  242. let pos = cmp::min(self.pos, self.inner.len() as u64);
  243. let amt = (&mut self.inner[(pos as usize)..]).write(buf)?;
  244. self.pos += amt as u64;
  245. Ok(amt)
  246. }
  247. fn flush(&mut self) -> io::Result<()> { Ok(()) }
  248. }
  249. #[cfg(test)]
  250. mod tests {
  251. use io::prelude::*;
  252. use io::{Cursor, SeekFrom};
  253. use vec::Vec;
  254. #[test]
  255. fn test_vec_writer() {
  256. let mut writer = Vec::new();
  257. assert_eq!(writer.write(&[0]).unwrap(), 1);
  258. assert_eq!(writer.write(&[1, 2, 3]).unwrap(), 3);
  259. assert_eq!(writer.write(&[4, 5, 6, 7]).unwrap(), 4);
  260. let b: &[_] = &[0, 1, 2, 3, 4, 5, 6, 7];
  261. assert_eq!(writer, b);
  262. }
  263. #[test]
  264. fn test_mem_writer() {
  265. let mut writer = Cursor::new(Vec::new());
  266. assert_eq!(writer.write(&[0]).unwrap(), 1);
  267. assert_eq!(writer.write(&[1, 2, 3]).unwrap(), 3);
  268. assert_eq!(writer.write(&[4, 5, 6, 7]).unwrap(), 4);
  269. let b: &[_] = &[0, 1, 2, 3, 4, 5, 6, 7];
  270. assert_eq!(&writer.get_ref()[..], b);
  271. }
  272. #[test]
  273. fn test_box_slice_writer() {
  274. let mut writer = Cursor::new(vec![0u8; 9].into_boxed_slice());
  275. assert_eq!(writer.position(), 0);
  276. assert_eq!(writer.write(&[0]).unwrap(), 1);
  277. assert_eq!(writer.position(), 1);
  278. assert_eq!(writer.write(&[1, 2, 3]).unwrap(), 3);
  279. assert_eq!(writer.write(&[4, 5, 6, 7]).unwrap(), 4);
  280. assert_eq!(writer.position(), 8);
  281. assert_eq!(writer.write(&[]).unwrap(), 0);
  282. assert_eq!(writer.position(), 8);
  283. assert_eq!(writer.write(&[8, 9]).unwrap(), 1);
  284. assert_eq!(writer.write(&[10]).unwrap(), 0);
  285. let b: &[_] = &[0, 1, 2, 3, 4, 5, 6, 7, 8];
  286. assert_eq!(&**writer.get_ref(), b);
  287. }
  288. #[test]
  289. fn test_buf_writer() {
  290. let mut buf = [0 as u8; 9];
  291. {
  292. let mut writer = Cursor::new(&mut buf[..]);
  293. assert_eq!(writer.position(), 0);
  294. assert_eq!(writer.write(&[0]).unwrap(), 1);
  295. assert_eq!(writer.position(), 1);
  296. assert_eq!(writer.write(&[1, 2, 3]).unwrap(), 3);
  297. assert_eq!(writer.write(&[4, 5, 6, 7]).unwrap(), 4);
  298. assert_eq!(writer.position(), 8);
  299. assert_eq!(writer.write(&[]).unwrap(), 0);
  300. assert_eq!(writer.position(), 8);
  301. assert_eq!(writer.write(&[8, 9]).unwrap(), 1);
  302. assert_eq!(writer.write(&[10]).unwrap(), 0);
  303. }
  304. let b: &[_] = &[0, 1, 2, 3, 4, 5, 6, 7, 8];
  305. assert_eq!(buf, b);
  306. }
  307. #[test]
  308. fn test_buf_writer_seek() {
  309. let mut buf = [0 as u8; 8];
  310. {
  311. let mut writer = Cursor::new(&mut buf[..]);
  312. assert_eq!(writer.position(), 0);
  313. assert_eq!(writer.write(&[1]).unwrap(), 1);
  314. assert_eq!(writer.position(), 1);
  315. assert_eq!(writer.seek(SeekFrom::Start(2)).unwrap(), 2);
  316. assert_eq!(writer.position(), 2);
  317. assert_eq!(writer.write(&[2]).unwrap(), 1);
  318. assert_eq!(writer.position(), 3);
  319. assert_eq!(writer.seek(SeekFrom::Current(-2)).unwrap(), 1);
  320. assert_eq!(writer.position(), 1);
  321. assert_eq!(writer.write(&[3]).unwrap(), 1);
  322. assert_eq!(writer.position(), 2);
  323. assert_eq!(writer.seek(SeekFrom::End(-1)).unwrap(), 7);
  324. assert_eq!(writer.position(), 7);
  325. assert_eq!(writer.write(&[4]).unwrap(), 1);
  326. assert_eq!(writer.position(), 8);
  327. }
  328. let b: &[_] = &[1, 3, 2, 0, 0, 0, 0, 4];
  329. assert_eq!(buf, b);
  330. }
  331. #[test]
  332. fn test_buf_writer_error() {
  333. let mut buf = [0 as u8; 2];
  334. let mut writer = Cursor::new(&mut buf[..]);
  335. assert_eq!(writer.write(&[0]).unwrap(), 1);
  336. assert_eq!(writer.write(&[0, 0]).unwrap(), 1);
  337. assert_eq!(writer.write(&[0, 0]).unwrap(), 0);
  338. }
  339. #[test]
  340. fn test_mem_reader() {
  341. let mut reader = Cursor::new(vec!(0, 1, 2, 3, 4, 5, 6, 7));
  342. let mut buf = [];
  343. assert_eq!(reader.read(&mut buf).unwrap(), 0);
  344. assert_eq!(reader.position(), 0);
  345. let mut buf = [0];
  346. assert_eq!(reader.read(&mut buf).unwrap(), 1);
  347. assert_eq!(reader.position(), 1);
  348. let b: &[_] = &[0];
  349. assert_eq!(buf, b);
  350. let mut buf = [0; 4];
  351. assert_eq!(reader.read(&mut buf).unwrap(), 4);
  352. assert_eq!(reader.position(), 5);
  353. let b: &[_] = &[1, 2, 3, 4];
  354. assert_eq!(buf, b);
  355. assert_eq!(reader.read(&mut buf).unwrap(), 3);
  356. let b: &[_] = &[5, 6, 7];
  357. assert_eq!(&buf[..3], b);
  358. assert_eq!(reader.read(&mut buf).unwrap(), 0);
  359. }
  360. #[test]
  361. fn test_boxed_slice_reader() {
  362. let mut reader = Cursor::new(vec!(0, 1, 2, 3, 4, 5, 6, 7).into_boxed_slice());
  363. let mut buf = [];
  364. assert_eq!(reader.read(&mut buf).unwrap(), 0);
  365. assert_eq!(reader.position(), 0);
  366. let mut buf = [0];
  367. assert_eq!(reader.read(&mut buf).unwrap(), 1);
  368. assert_eq!(reader.position(), 1);
  369. let b: &[_] = &[0];
  370. assert_eq!(buf, b);
  371. let mut buf = [0; 4];
  372. assert_eq!(reader.read(&mut buf).unwrap(), 4);
  373. assert_eq!(reader.position(), 5);
  374. let b: &[_] = &[1, 2, 3, 4];
  375. assert_eq!(buf, b);
  376. assert_eq!(reader.read(&mut buf).unwrap(), 3);
  377. let b: &[_] = &[5, 6, 7];
  378. assert_eq!(&buf[..3], b);
  379. assert_eq!(reader.read(&mut buf).unwrap(), 0);
  380. }
  381. #[test]
  382. fn read_to_end() {
  383. let mut reader = Cursor::new(vec!(0, 1, 2, 3, 4, 5, 6, 7));
  384. let mut v = Vec::new();
  385. reader.read_to_end(&mut v).unwrap();
  386. assert_eq!(v, [0, 1, 2, 3, 4, 5, 6, 7]);
  387. }
  388. #[test]
  389. fn test_slice_reader() {
  390. let in_buf = vec![0, 1, 2, 3, 4, 5, 6, 7];
  391. let mut reader = &mut &in_buf[..];
  392. let mut buf = [];
  393. assert_eq!(reader.read(&mut buf).unwrap(), 0);
  394. let mut buf = [0];
  395. assert_eq!(reader.read(&mut buf).unwrap(), 1);
  396. assert_eq!(reader.len(), 7);
  397. let b: &[_] = &[0];
  398. assert_eq!(&buf[..], b);
  399. let mut buf = [0; 4];
  400. assert_eq!(reader.read(&mut buf).unwrap(), 4);
  401. assert_eq!(reader.len(), 3);
  402. let b: &[_] = &[1, 2, 3, 4];
  403. assert_eq!(&buf[..], b);
  404. assert_eq!(reader.read(&mut buf).unwrap(), 3);
  405. let b: &[_] = &[5, 6, 7];
  406. assert_eq!(&buf[..3], b);
  407. assert_eq!(reader.read(&mut buf).unwrap(), 0);
  408. }
  409. #[test]
  410. fn test_buf_reader() {
  411. let in_buf = vec![0, 1, 2, 3, 4, 5, 6, 7];
  412. let mut reader = Cursor::new(&in_buf[..]);
  413. let mut buf = [];
  414. assert_eq!(reader.read(&mut buf).unwrap(), 0);
  415. assert_eq!(reader.position(), 0);
  416. let mut buf = [0];
  417. assert_eq!(reader.read(&mut buf).unwrap(), 1);
  418. assert_eq!(reader.position(), 1);
  419. let b: &[_] = &[0];
  420. assert_eq!(buf, b);
  421. let mut buf = [0; 4];
  422. assert_eq!(reader.read(&mut buf).unwrap(), 4);
  423. assert_eq!(reader.position(), 5);
  424. let b: &[_] = &[1, 2, 3, 4];
  425. assert_eq!(buf, b);
  426. assert_eq!(reader.read(&mut buf).unwrap(), 3);
  427. let b: &[_] = &[5, 6, 7];
  428. assert_eq!(&buf[..3], b);
  429. assert_eq!(reader.read(&mut buf).unwrap(), 0);
  430. }
  431. #[test]
  432. fn test_read_char() {
  433. let b = &b"Vi\xE1\xBB\x87t"[..];
  434. let mut c = Cursor::new(b).chars();
  435. assert_eq!(c.next().unwrap().unwrap(), 'V');
  436. assert_eq!(c.next().unwrap().unwrap(), 'i');
  437. assert_eq!(c.next().unwrap().unwrap(), 'ệ');
  438. assert_eq!(c.next().unwrap().unwrap(), 't');
  439. assert!(c.next().is_none());
  440. }
  441. #[test]
  442. fn test_read_bad_char() {
  443. let b = &b"\x80"[..];
  444. let mut c = Cursor::new(b).chars();
  445. assert!(c.next().unwrap().is_err());
  446. }
  447. #[test]
  448. fn seek_past_end() {
  449. let buf = [0xff];
  450. let mut r = Cursor::new(&buf[..]);
  451. assert_eq!(r.seek(SeekFrom::Start(10)).unwrap(), 10);
  452. assert_eq!(r.read(&mut [0]).unwrap(), 0);
  453. let mut r = Cursor::new(vec!(10));
  454. assert_eq!(r.seek(SeekFrom::Start(10)).unwrap(), 10);
  455. assert_eq!(r.read(&mut [0]).unwrap(), 0);
  456. let mut buf = [0];
  457. let mut r = Cursor::new(&mut buf[..]);
  458. assert_eq!(r.seek(SeekFrom::Start(10)).unwrap(), 10);
  459. assert_eq!(r.write(&[3]).unwrap(), 0);
  460. let mut r = Cursor::new(vec![10].into_boxed_slice());
  461. assert_eq!(r.seek(SeekFrom::Start(10)).unwrap(), 10);
  462. assert_eq!(r.write(&[3]).unwrap(), 0);
  463. }
  464. #[test]
  465. fn seek_before_0() {
  466. let buf = [0xff];
  467. let mut r = Cursor::new(&buf[..]);
  468. assert!(r.seek(SeekFrom::End(-2)).is_err());
  469. let mut r = Cursor::new(vec!(10));
  470. assert!(r.seek(SeekFrom::End(-2)).is_err());
  471. let mut buf = [0];
  472. let mut r = Cursor::new(&mut buf[..]);
  473. assert!(r.seek(SeekFrom::End(-2)).is_err());
  474. let mut r = Cursor::new(vec!(10).into_boxed_slice());
  475. assert!(r.seek(SeekFrom::End(-2)).is_err());
  476. }
  477. #[test]
  478. fn test_seekable_mem_writer() {
  479. let mut writer = Cursor::new(Vec::<u8>::new());
  480. assert_eq!(writer.position(), 0);
  481. assert_eq!(writer.write(&[0]).unwrap(), 1);
  482. assert_eq!(writer.position(), 1);
  483. assert_eq!(writer.write(&[1, 2, 3]).unwrap(), 3);
  484. assert_eq!(writer.write(&[4, 5, 6, 7]).unwrap(), 4);
  485. assert_eq!(writer.position(), 8);
  486. let b: &[_] = &[0, 1, 2, 3, 4, 5, 6, 7];
  487. assert_eq!(&writer.get_ref()[..], b);
  488. assert_eq!(writer.seek(SeekFrom::Start(0)).unwrap(), 0);
  489. assert_eq!(writer.position(), 0);
  490. assert_eq!(writer.write(&[3, 4]).unwrap(), 2);
  491. let b: &[_] = &[3, 4, 2, 3, 4, 5, 6, 7];
  492. assert_eq!(&writer.get_ref()[..], b);
  493. assert_eq!(writer.seek(SeekFrom::Current(1)).unwrap(), 3);
  494. assert_eq!(writer.write(&[0, 1]).unwrap(), 2);
  495. let b: &[_] = &[3, 4, 2, 0, 1, 5, 6, 7];
  496. assert_eq!(&writer.get_ref()[..], b);
  497. assert_eq!(writer.seek(SeekFrom::End(-1)).unwrap(), 7);
  498. assert_eq!(writer.write(&[1, 2]).unwrap(), 2);
  499. let b: &[_] = &[3, 4, 2, 0, 1, 5, 6, 1, 2];
  500. assert_eq!(&writer.get_ref()[..], b);
  501. assert_eq!(writer.seek(SeekFrom::End(1)).unwrap(), 10);
  502. assert_eq!(writer.write(&[1]).unwrap(), 1);
  503. let b: &[_] = &[3, 4, 2, 0, 1, 5, 6, 1, 2, 0, 1];
  504. assert_eq!(&writer.get_ref()[..], b);
  505. }
  506. #[test]
  507. fn vec_seek_past_end() {
  508. let mut r = Cursor::new(Vec::new());
  509. assert_eq!(r.seek(SeekFrom::Start(10)).unwrap(), 10);
  510. assert_eq!(r.write(&[3]).unwrap(), 1);
  511. }
  512. #[test]
  513. fn vec_seek_before_0() {
  514. let mut r = Cursor::new(Vec::new());
  515. assert!(r.seek(SeekFrom::End(-2)).is_err());
  516. }
  517. }