diff options
| author | bors <bors@rust-lang.org> | 2024-09-25 04:57:12 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2024-09-25 04:57:12 +0000 |
| commit | 4c62024cd5dbafb64941bded422e4fbc2a100e73 (patch) | |
| tree | d53288325071e253910a6b5ffbdef798a43a08a1 /library/std/src/io | |
| parent | 1b5aa96d6016bafe50e071b45d4d2e3c90fd766f (diff) | |
| parent | 458537ebc0e7d893103e03450f8830061bab1b2d (diff) | |
| download | rust-4c62024cd5dbafb64941bded422e4fbc2a100e73.tar.gz rust-4c62024cd5dbafb64941bded422e4fbc2a100e73.zip | |
Auto merge of #130803 - cuviper:file-buffered, r=joshtriplett
Add `File` constructors that return files wrapped with a buffer In addition to the light convenience, these are intended to raise visibility that buffering is something you should consider when opening a file, since unbuffered I/O is a common performance footgun to Rust newcomers. ACP: https://github.com/rust-lang/libs-team/issues/446 Tracking Issue: #130804
Diffstat (limited to 'library/std/src/io')
| -rw-r--r-- | library/std/src/io/buffered/bufreader.rs | 8 | ||||
| -rw-r--r-- | library/std/src/io/buffered/bufreader/buffer.rs | 12 | ||||
| -rw-r--r-- | library/std/src/io/buffered/bufwriter.rs | 10 |
3 files changed, 29 insertions, 1 deletions
diff --git a/library/std/src/io/buffered/bufreader.rs b/library/std/src/io/buffered/bufreader.rs index e51dde994de..fcb3e36027b 100644 --- a/library/std/src/io/buffered/bufreader.rs +++ b/library/std/src/io/buffered/bufreader.rs @@ -74,6 +74,14 @@ impl<R: Read> BufReader<R> { BufReader::with_capacity(DEFAULT_BUF_SIZE, inner) } + pub(crate) fn try_new_buffer() -> io::Result<Buffer> { + Buffer::try_with_capacity(DEFAULT_BUF_SIZE) + } + + pub(crate) fn with_buffer(inner: R, buf: Buffer) -> Self { + Self { inner, buf } + } + /// Creates a new `BufReader<R>` with the specified buffer capacity. /// /// # Examples diff --git a/library/std/src/io/buffered/bufreader/buffer.rs b/library/std/src/io/buffered/bufreader/buffer.rs index 1bf84d8bef3..3df7e3971da 100644 --- a/library/std/src/io/buffered/bufreader/buffer.rs +++ b/library/std/src/io/buffered/bufreader/buffer.rs @@ -10,7 +10,7 @@ //! without encountering any runtime bounds checks. use crate::cmp; -use crate::io::{self, BorrowedBuf, Read}; +use crate::io::{self, BorrowedBuf, ErrorKind, Read}; use crate::mem::MaybeUninit; pub struct Buffer { @@ -37,6 +37,16 @@ impl Buffer { } #[inline] + pub fn try_with_capacity(capacity: usize) -> io::Result<Self> { + match Box::try_new_uninit_slice(capacity) { + Ok(buf) => Ok(Self { buf, pos: 0, filled: 0, initialized: 0 }), + Err(_) => { + Err(io::const_io_error!(ErrorKind::OutOfMemory, "failed to allocate read buffer")) + } + } + } + + #[inline] pub fn buffer(&self) -> &[u8] { // SAFETY: self.pos and self.cap are valid, and self.cap => self.pos, and // that region is initialized because those are all invariants of this type. diff --git a/library/std/src/io/buffered/bufwriter.rs b/library/std/src/io/buffered/bufwriter.rs index 13516d3b961..c41bae2aa4e 100644 --- a/library/std/src/io/buffered/bufwriter.rs +++ b/library/std/src/io/buffered/bufwriter.rs @@ -94,6 +94,16 @@ impl<W: Write> BufWriter<W> { BufWriter::with_capacity(DEFAULT_BUF_SIZE, inner) } + pub(crate) fn try_new_buffer() -> io::Result<Vec<u8>> { + Vec::try_with_capacity(DEFAULT_BUF_SIZE).map_err(|_| { + io::const_io_error!(ErrorKind::OutOfMemory, "failed to allocate write buffer") + }) + } + + pub(crate) fn with_buffer(inner: W, buf: Vec<u8>) -> Self { + Self { inner, buf, panicked: false } + } + /// Creates a new `BufWriter<W>` with at least the specified buffer capacity. /// /// # Examples |
