| //! Provides specialization for `io::copy`. |
| |
| use super::CopyState; |
| use crate::io::{BufReader, Read, Result, Take, Write}; |
| |
| pub(super) trait SpecCopyInner { |
| /// The implementation of `io::copy` that can rely on platform specific specialization |
| /// provided by `libstd`. |
| fn copy<W: Write + ?Sized>(&mut self, writer: &mut W) -> Result<CopyState>; |
| } |
| |
| impl<R: Read + ?Sized> SpecCopyInner for R { |
| default fn copy<W: Write + ?Sized>(&mut self, _writer: &mut W) -> Result<CopyState> { |
| Ok(CopyState::Fallback(0)) |
| } |
| } |
| |
| impl<R: SpecCopy> SpecCopyInner for R { |
| fn copy<W: Write + ?Sized>(&mut self, writer: &mut W) -> Result<CopyState> { |
| <R as SpecCopy>::copy(self, writer) |
| } |
| } |
| |
| #[doc(hidden)] |
| #[unstable(feature = "core_io_internals", reason = "exposed only for libstd", issue = "none")] |
| #[rustc_specialization_trait] |
| pub trait SpecCopy: Read { |
| /// Attempt to copy from this reader to the provided writer using a specialized |
| /// process. |
| /// |
| /// Note that this function does _not_ take `self` as a parameter, and instead |
| /// is passed a generic `Read` type `R`. |
| /// This allows the `Self` type to provide specialized implementations for |
| /// any combination of `Read` and `Write` types. |
| /// However, in practice `Self` and types wrapping `Self` will be passed as |
| /// the `reader` argument. |
| /// |
| /// As of time of writing, `&mut R`, `Take<R>`, and `BufReader<R>` will |
| /// forward to `R` for a specialized copy implementation. |
| fn copy<R: Read + ?Sized, W: Write + ?Sized>( |
| _reader: &mut R, |
| _writer: &mut W, |
| ) -> Result<CopyState>; |
| } |
| |
| impl<T> SpecCopy for &mut T |
| where |
| T: SpecCopy, |
| { |
| fn copy<R: Read + ?Sized, W: Write + ?Sized>( |
| reader: &mut R, |
| writer: &mut W, |
| ) -> Result<CopyState> { |
| <T as SpecCopy>::copy(reader, writer) |
| } |
| } |
| |
| impl<T: SpecCopy> SpecCopy for Take<T> { |
| fn copy<R: Read + ?Sized, W: Write + ?Sized>( |
| reader: &mut R, |
| writer: &mut W, |
| ) -> Result<CopyState> { |
| <T as SpecCopy>::copy(reader, writer) |
| } |
| } |
| |
| impl<T: ?Sized + SpecCopy> SpecCopy for BufReader<T> { |
| fn copy<R: Read + ?Sized, W: Write + ?Sized>( |
| reader: &mut R, |
| writer: &mut W, |
| ) -> Result<CopyState> { |
| <T as SpecCopy>::copy(reader, writer) |
| } |
| } |