Auto merge of #94748 - tbu-:pr_file_arc, r=Amanieu
Add `Read`, `Write` and `Seek` impls for `Arc<File>` where appropriate If `&T` implements these traits, `Arc<T>` has no reason not to do so either. This is useful for operating system handles like `File` or `TcpStream` which don't need a mutable reference to implement these traits. CC #53835. CC #94744.
This commit is contained in:
commit
05b82e551e
@ -16,6 +16,7 @@
|
|||||||
use crate::io::{self, BorrowedCursor, IoSlice, IoSliceMut, Read, Seek, SeekFrom, Write};
|
use crate::io::{self, BorrowedCursor, IoSlice, IoSliceMut, Read, Seek, SeekFrom, Write};
|
||||||
use crate::path::{Path, PathBuf};
|
use crate::path::{Path, PathBuf};
|
||||||
use crate::sealed::Sealed;
|
use crate::sealed::Sealed;
|
||||||
|
use crate::sync::Arc;
|
||||||
use crate::sys::fs as fs_imp;
|
use crate::sys::fs as fs_imp;
|
||||||
use crate::sys_common::{AsInner, AsInnerMut, FromInner, IntoInner};
|
use crate::sys_common::{AsInner, AsInnerMut, FromInner, IntoInner};
|
||||||
use crate::time::SystemTime;
|
use crate::time::SystemTime;
|
||||||
@ -742,78 +743,20 @@ fn buffer_capacity_required(mut file: &File) -> Option<usize> {
|
|||||||
Some(size.saturating_sub(pos) as usize)
|
Some(size.saturating_sub(pos) as usize)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
|
||||||
impl Read for File {
|
|
||||||
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
|
|
||||||
self.inner.read(buf)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize> {
|
|
||||||
self.inner.read_vectored(bufs)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn read_buf(&mut self, cursor: BorrowedCursor<'_>) -> io::Result<()> {
|
|
||||||
self.inner.read_buf(cursor)
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
fn is_read_vectored(&self) -> bool {
|
|
||||||
self.inner.is_read_vectored()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reserves space in the buffer based on the file size when available.
|
|
||||||
fn read_to_end(&mut self, buf: &mut Vec<u8>) -> io::Result<usize> {
|
|
||||||
let size = buffer_capacity_required(self);
|
|
||||||
buf.reserve(size.unwrap_or(0));
|
|
||||||
io::default_read_to_end(self, buf, size)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reserves space in the buffer based on the file size when available.
|
|
||||||
fn read_to_string(&mut self, buf: &mut String) -> io::Result<usize> {
|
|
||||||
let size = buffer_capacity_required(self);
|
|
||||||
buf.reserve(size.unwrap_or(0));
|
|
||||||
io::default_read_to_string(self, buf, size)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
|
||||||
impl Write for File {
|
|
||||||
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
|
|
||||||
self.inner.write(buf)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> io::Result<usize> {
|
|
||||||
self.inner.write_vectored(bufs)
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
fn is_write_vectored(&self) -> bool {
|
|
||||||
self.inner.is_write_vectored()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn flush(&mut self) -> io::Result<()> {
|
|
||||||
self.inner.flush()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
|
||||||
impl Seek for File {
|
|
||||||
fn seek(&mut self, pos: SeekFrom) -> io::Result<u64> {
|
|
||||||
self.inner.seek(pos)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
impl Read for &File {
|
impl Read for &File {
|
||||||
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
|
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
|
||||||
self.inner.read(buf)
|
self.inner.read(buf)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn read_buf(&mut self, cursor: BorrowedCursor<'_>) -> io::Result<()> {
|
|
||||||
self.inner.read_buf(cursor)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize> {
|
fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize> {
|
||||||
self.inner.read_vectored(bufs)
|
self.inner.read_vectored(bufs)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn read_buf(&mut self, cursor: BorrowedCursor<'_>) -> io::Result<()> {
|
||||||
|
self.inner.read_buf(cursor)
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn is_read_vectored(&self) -> bool {
|
fn is_read_vectored(&self) -> bool {
|
||||||
self.inner.is_read_vectored()
|
self.inner.is_read_vectored()
|
||||||
@ -859,6 +802,96 @@ fn seek(&mut self, pos: SeekFrom) -> io::Result<u64> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
|
impl Read for File {
|
||||||
|
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
|
||||||
|
(&*self).read(buf)
|
||||||
|
}
|
||||||
|
fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize> {
|
||||||
|
(&*self).read_vectored(bufs)
|
||||||
|
}
|
||||||
|
fn read_buf(&mut self, cursor: BorrowedCursor<'_>) -> io::Result<()> {
|
||||||
|
(&*self).read_buf(cursor)
|
||||||
|
}
|
||||||
|
#[inline]
|
||||||
|
fn is_read_vectored(&self) -> bool {
|
||||||
|
(&&*self).is_read_vectored()
|
||||||
|
}
|
||||||
|
fn read_to_end(&mut self, buf: &mut Vec<u8>) -> io::Result<usize> {
|
||||||
|
(&*self).read_to_end(buf)
|
||||||
|
}
|
||||||
|
fn read_to_string(&mut self, buf: &mut String) -> io::Result<usize> {
|
||||||
|
(&*self).read_to_string(buf)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
|
impl Write for File {
|
||||||
|
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
|
||||||
|
(&*self).write(buf)
|
||||||
|
}
|
||||||
|
fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> io::Result<usize> {
|
||||||
|
(&*self).write_vectored(bufs)
|
||||||
|
}
|
||||||
|
#[inline]
|
||||||
|
fn is_write_vectored(&self) -> bool {
|
||||||
|
(&&*self).is_write_vectored()
|
||||||
|
}
|
||||||
|
fn flush(&mut self) -> io::Result<()> {
|
||||||
|
(&*self).flush()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
|
impl Seek for File {
|
||||||
|
fn seek(&mut self, pos: SeekFrom) -> io::Result<u64> {
|
||||||
|
(&*self).seek(pos)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[stable(feature = "io_traits_arc", since = "CURRENT_RUSTC_VERSION")]
|
||||||
|
impl Read for Arc<File> {
|
||||||
|
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
|
||||||
|
(&**self).read(buf)
|
||||||
|
}
|
||||||
|
fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize> {
|
||||||
|
(&**self).read_vectored(bufs)
|
||||||
|
}
|
||||||
|
fn read_buf(&mut self, cursor: BorrowedCursor<'_>) -> io::Result<()> {
|
||||||
|
(&**self).read_buf(cursor)
|
||||||
|
}
|
||||||
|
#[inline]
|
||||||
|
fn is_read_vectored(&self) -> bool {
|
||||||
|
(&**self).is_read_vectored()
|
||||||
|
}
|
||||||
|
fn read_to_end(&mut self, buf: &mut Vec<u8>) -> io::Result<usize> {
|
||||||
|
(&**self).read_to_end(buf)
|
||||||
|
}
|
||||||
|
fn read_to_string(&mut self, buf: &mut String) -> io::Result<usize> {
|
||||||
|
(&**self).read_to_string(buf)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#[stable(feature = "io_traits_arc", since = "CURRENT_RUSTC_VERSION")]
|
||||||
|
impl Write for Arc<File> {
|
||||||
|
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
|
||||||
|
(&**self).write(buf)
|
||||||
|
}
|
||||||
|
fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> io::Result<usize> {
|
||||||
|
(&**self).write_vectored(bufs)
|
||||||
|
}
|
||||||
|
#[inline]
|
||||||
|
fn is_write_vectored(&self) -> bool {
|
||||||
|
(&**self).is_write_vectored()
|
||||||
|
}
|
||||||
|
fn flush(&mut self) -> io::Result<()> {
|
||||||
|
(&**self).flush()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#[stable(feature = "io_traits_arc", since = "CURRENT_RUSTC_VERSION")]
|
||||||
|
impl Seek for Arc<File> {
|
||||||
|
fn seek(&mut self, pos: SeekFrom) -> io::Result<u64> {
|
||||||
|
(&**self).seek(pos)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl OpenOptions {
|
impl OpenOptions {
|
||||||
/// Creates a blank new set of options ready for configuration.
|
/// Creates a blank new set of options ready for configuration.
|
||||||
///
|
///
|
||||||
|
Loading…
Reference in New Issue
Block a user