]> git.lizzy.rs Git - rust.git/blobdiff - library/std/src/io/copy.rs
add forwarding specializations for &mut variants
[rust.git] / library / std / src / io / copy.rs
index 4604f2ab002d98e5b5edd6326c055055f9abd328..e8cbe6a7e715a084201b26bdc9b6e5637e3f5a86 100644 (file)
@@ -173,22 +173,6 @@ fn copy(self) -> Result<u64> {
                     )
                     .map(|bytes_copied| bytes_copied + bytes_flushed)
                 }
-                (CopyParams(reader_meta, Some(readfd)), CopyParams(writer_meta, Some(writefd)))
-                    if reader_meta.is_fifo() || writer_meta.is_fifo() =>
-                {
-                    // splice
-                    let bytes_flushed = flush()?;
-                    let max_write = reader.min_limit();
-                    let (mut reader, mut writer) =
-                        unsafe { (fd_as_file(readfd), fd_as_file(writefd)) };
-                    crate::sys::fs::sendfile_splice(
-                        crate::sys::fs::SpliceMode::Splice,
-                        &mut reader,
-                        &mut writer,
-                        max_write,
-                    )
-                    .map(|bytes_sent| bytes_sent + bytes_flushed)
-                }
                 (
                     CopyParams(FdMeta::Metadata(reader_meta), Some(readfd)),
                     CopyParams(_, Some(writefd)),
@@ -205,6 +189,22 @@ fn copy(self) -> Result<u64> {
                         &mut reader,
                         &mut writer,
                         min(len, max_write),
+                    )
+                        .map(|bytes_sent| bytes_sent + bytes_flushed)
+                }
+                (CopyParams(reader_meta, Some(readfd)), CopyParams(writer_meta, Some(writefd)))
+                    if reader_meta.is_fifo() || writer_meta.is_fifo() =>
+                {
+                    // splice
+                    let bytes_flushed = flush()?;
+                    let max_write = reader.min_limit();
+                    let (mut reader, mut writer) =
+                        unsafe { (fd_as_file(readfd), fd_as_file(writefd)) };
+                    crate::sys::fs::sendfile_splice(
+                        crate::sys::fs::SpliceMode::Splice,
+                        &mut reader,
+                        &mut writer,
+                        max_write,
                     )
                     .map(|bytes_sent| bytes_sent + bytes_flushed)
                 }
@@ -235,6 +235,27 @@ trait CopyWrite: Write {
         fn properties(&self) -> CopyParams;
     }
 
+    impl<T> CopyRead for &mut T where T: CopyRead {
+        fn drain_to<W: Write>(&mut self, writer: &mut W, limit: u64) -> Result<u64> {
+            (**self).drain_to(writer, limit)
+        }
+
+        fn min_limit(&self) -> u64 {
+            (**self).min_limit()
+        }
+
+        fn properties(&self) -> CopyParams {
+            (**self).properties()
+        }
+    }
+
+    impl<T> CopyWrite for &mut T where T: CopyWrite {
+        fn properties(&self) -> CopyParams {
+            (**self).properties()
+        }
+    }
+
+
     impl CopyRead for File {
         fn properties(&self) -> CopyParams {
             CopyParams(fd_to_meta(self), Some(self.as_raw_fd()))