forked from mirror/async-std
feat(io): implement Read::by_ref
This commit is contained in:
parent
75dc819b2f
commit
f751ebb8c4
1 changed files with 66 additions and 0 deletions
|
@ -303,6 +303,44 @@ extension_trait! {
|
|||
{
|
||||
take::Take { inner: self, limit }
|
||||
}
|
||||
|
||||
#[doc = r#"
|
||||
Creates a "by reference" adaptor for this instance of `Read`.
|
||||
|
||||
The returned adaptor also implements `Read` and will simply borrow this
|
||||
current reader.
|
||||
|
||||
# Examples
|
||||
|
||||
[`File`][file]s implement `Read`:
|
||||
|
||||
[file]: ../fs/struct.File.html
|
||||
|
||||
```no_run
|
||||
use async_std::io;
|
||||
use async_std::prelude::*;
|
||||
use async_std::fs::File;
|
||||
|
||||
fn main() -> io::Result<()> { async_std::task::block_on(async {
|
||||
let mut f = File::open("foo.txt").await?;
|
||||
let mut buffer = Vec::new();
|
||||
let mut other_buffer = Vec::new();
|
||||
|
||||
{
|
||||
let reference = f.by_ref();
|
||||
|
||||
// read at most 5 bytes
|
||||
reference.take(5).read_to_end(&mut buffer).await?;
|
||||
|
||||
} // drop our &mut reference so we can use f again
|
||||
|
||||
// original file still usable, read the rest
|
||||
f.read_to_end(&mut other_buffer).await?;
|
||||
Ok(())
|
||||
}) }
|
||||
```
|
||||
"#]
|
||||
fn by_ref(&mut self) -> &mut Self where Self: Sized { self }
|
||||
}
|
||||
|
||||
impl<T: Read + Unpin + ?Sized> Read for Box<T> {
|
||||
|
@ -349,3 +387,31 @@ extension_trait! {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use crate::io;
|
||||
use crate::prelude::*;
|
||||
|
||||
#[test]
|
||||
fn test_read_by_ref() -> io::Result<()> {
|
||||
crate::task::block_on(async {
|
||||
let mut f = io::Cursor::new(vec![0u8, 1, 2, 3, 4, 5, 6, 7, 8]);
|
||||
let mut buffer = Vec::new();
|
||||
let mut other_buffer = Vec::new();
|
||||
|
||||
{
|
||||
let reference = f.by_ref();
|
||||
|
||||
// read at most 5 bytes
|
||||
assert_eq!(reference.take(5).read_to_end(&mut buffer).await?, 5);
|
||||
assert_eq!(&buffer, &[0, 1, 2, 3, 4])
|
||||
} // drop our &mut reference so we can use f again
|
||||
|
||||
// original file still usable, read the rest
|
||||
assert_eq!(f.read_to_end(&mut other_buffer).await?, 4);
|
||||
assert_eq!(&other_buffer, &[5, 6, 7, 8]);
|
||||
Ok(())
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue