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 } |             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> { |     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