/rust/registry/src/index.crates.io-1949cf8c6b5b557f/flate2-1.1.10/src/bufreader.rs
Line | Count | Source |
1 | | // Copyright 2013 The Rust Project Developers. See the COPYRIGHT |
2 | | // file at the top-level directory of this distribution and at |
3 | | // <https://github.com/rust-lang/rust/blob/HEAD/COPYRIGHT>. |
4 | | // |
5 | | // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or |
6 | | // https://www.apache.org/licenses/LICENSE-2.0> or the MIT license |
7 | | // <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your |
8 | | // option. This file may not be copied, modified, or distributed |
9 | | // except according to those terms. |
10 | | |
11 | | use crate::io; |
12 | | use crate::io::{BufRead, Read}; |
13 | | use alloc::boxed::Box; |
14 | | use alloc::vec::Vec; |
15 | | use core::cmp; |
16 | | use core::mem; |
17 | | |
18 | | pub struct BufReader<R> { |
19 | | inner: R, |
20 | | buf: Box<[u8]>, |
21 | | pos: usize, |
22 | | cap: usize, |
23 | | } |
24 | | |
25 | | impl<R> ::core::fmt::Debug for BufReader<R> |
26 | | where |
27 | | R: ::core::fmt::Debug, |
28 | | { |
29 | 0 | fn fmt(&self, fmt: &mut ::core::fmt::Formatter) -> Result<(), ::core::fmt::Error> { |
30 | 0 | fmt.debug_struct("BufReader") |
31 | 0 | .field("reader", &self.inner) |
32 | 0 | .field( |
33 | 0 | "buffer", |
34 | 0 | &format_args!("{}/{}", self.cap - self.pos, self.buf.len()), |
35 | 0 | ) |
36 | 0 | .finish() |
37 | 0 | } |
38 | | } |
39 | | |
40 | | impl<R: Read> BufReader<R> { |
41 | 0 | pub fn new(inner: R) -> BufReader<R> { |
42 | 0 | BufReader::with_buf(vec![0; 32 * 1024], inner) |
43 | 0 | } |
44 | | |
45 | 3.24k | pub fn with_buf(buf: Vec<u8>, inner: R) -> BufReader<R> { |
46 | 3.24k | BufReader { |
47 | 3.24k | inner, |
48 | 3.24k | buf: buf.into_boxed_slice(), |
49 | 3.24k | pos: 0, |
50 | 3.24k | cap: 0, |
51 | 3.24k | } |
52 | 3.24k | } <flate2::bufreader::BufReader<&mut std::io::cursor::Cursor<&[u8]>>>::with_buf Line | Count | Source | 45 | 3.24k | pub fn with_buf(buf: Vec<u8>, inner: R) -> BufReader<R> { | 46 | 3.24k | BufReader { | 47 | 3.24k | inner, | 48 | 3.24k | buf: buf.into_boxed_slice(), | 49 | 3.24k | pos: 0, | 50 | 3.24k | cap: 0, | 51 | 3.24k | } | 52 | 3.24k | } |
Unexecuted instantiation: <flate2::bufreader::BufReader<_>>::with_buf |
53 | | } |
54 | | |
55 | | impl<R> BufReader<R> { |
56 | 0 | pub fn get_ref(&self) -> &R { |
57 | 0 | &self.inner |
58 | 0 | } |
59 | | |
60 | 0 | pub fn get_mut(&mut self) -> &mut R { |
61 | 0 | &mut self.inner |
62 | 0 | } |
63 | | |
64 | 0 | pub fn into_inner(self) -> R { |
65 | 0 | self.inner |
66 | 0 | } |
67 | | |
68 | 0 | pub fn reset(&mut self, inner: R) -> R { |
69 | 0 | self.pos = 0; |
70 | 0 | self.cap = 0; |
71 | 0 | mem::replace(&mut self.inner, inner) |
72 | 0 | } |
73 | | } |
74 | | |
75 | | impl<R: Read> Read for BufReader<R> { |
76 | 0 | fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { |
77 | | // If we don't have any buffered data and we're doing a massive read |
78 | | // (larger than our internal buffer), bypass our internal buffer |
79 | | // entirely. |
80 | 0 | if self.pos == self.cap && buf.len() >= self.buf.len() { |
81 | 0 | return self.inner.read(buf); |
82 | 0 | } |
83 | 0 | let nread = { |
84 | 0 | let mut rem = self.fill_buf()?; |
85 | 0 | rem.read(buf)? |
86 | | }; |
87 | 0 | self.consume(nread); |
88 | 0 | Ok(nread) |
89 | 0 | } |
90 | | } |
91 | | |
92 | | impl<R: Read> BufRead for BufReader<R> { |
93 | 419k | fn fill_buf(&mut self) -> io::Result<&[u8]> { |
94 | | // If we've reached the end of our internal buffer then we need to fetch |
95 | | // some more data from the underlying reader. |
96 | 419k | if self.pos == self.cap { |
97 | 6.53k | self.cap = self.inner.read(&mut self.buf)?; |
98 | 6.53k | self.pos = 0; |
99 | 412k | } |
100 | 419k | Ok(&self.buf[self.pos..self.cap]) |
101 | 419k | } <flate2::bufreader::BufReader<&mut std::io::cursor::Cursor<&[u8]>> as std::io::BufRead>::fill_buf Line | Count | Source | 93 | 419k | fn fill_buf(&mut self) -> io::Result<&[u8]> { | 94 | | // If we've reached the end of our internal buffer then we need to fetch | 95 | | // some more data from the underlying reader. | 96 | 419k | if self.pos == self.cap { | 97 | 6.53k | self.cap = self.inner.read(&mut self.buf)?; | 98 | 6.53k | self.pos = 0; | 99 | 412k | } | 100 | 419k | Ok(&self.buf[self.pos..self.cap]) | 101 | 419k | } |
Unexecuted instantiation: <flate2::bufreader::BufReader<_> as std::io::BufRead>::fill_buf |
102 | | |
103 | 419k | fn consume(&mut self, amt: usize) { |
104 | 419k | self.pos = cmp::min(self.pos + amt, self.cap); |
105 | 419k | } <flate2::bufreader::BufReader<&mut std::io::cursor::Cursor<&[u8]>> as std::io::BufRead>::consume Line | Count | Source | 103 | 419k | fn consume(&mut self, amt: usize) { | 104 | 419k | self.pos = cmp::min(self.pos + amt, self.cap); | 105 | 419k | } |
Unexecuted instantiation: <flate2::bufreader::BufReader<_> as std::io::BufRead>::consume |
106 | | } |