Rollup merge of #41463 - SergioBenitez:master, r=alexcrichton
Add internal accessor methods to io::{Chain, Take}. Resolves #29067.
This commit is contained in:
commit
5f62b2716f
@ -160,6 +160,7 @@
|
||||
- [linked_list_extras](library-features/linked-list-extras.md)
|
||||
- [lookup_host](library-features/lookup-host.md)
|
||||
- [manually_drop](library-features/manually-drop.md)
|
||||
- [more_io_inner_methods](library-features/more-io-inner-methods.md)
|
||||
- [mpsc_select](library-features/mpsc-select.md)
|
||||
- [n16](library-features/n16.md)
|
||||
- [never_type_impls](library-features/never-type-impls.md)
|
||||
|
@ -0,0 +1,11 @@
|
||||
# `more_io_inner_methods`
|
||||
|
||||
The tracking issue for this feature is: [#41519]
|
||||
|
||||
[#41519]: https://github.com/rust-lang/rust/issues/41519
|
||||
|
||||
------------------------
|
||||
|
||||
This feature enables several internal accessor methods on structures in
|
||||
`std::io` including `Take::{get_ref, get_mut}` and `Chain::{into_inner, get_ref,
|
||||
get_mut}`.
|
@ -1504,6 +1504,87 @@ pub struct Chain<T, U> {
|
||||
done_first: bool,
|
||||
}
|
||||
|
||||
impl<T, U> Chain<T, U> {
|
||||
/// Consumes the `Chain`, returning the wrapped readers.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(more_io_inner_methods)]
|
||||
///
|
||||
/// # use std::io;
|
||||
/// use std::io::prelude::*;
|
||||
/// use std::fs::File;
|
||||
///
|
||||
/// # fn foo() -> io::Result<()> {
|
||||
/// let mut foo_file = File::open("foo.txt")?;
|
||||
/// let mut bar_file = File::open("bar.txt")?;
|
||||
///
|
||||
/// let chain = foo_file.chain(bar_file);
|
||||
/// let (foo_file, bar_file) = chain.into_inner();
|
||||
/// # Ok(())
|
||||
/// # }
|
||||
/// ```
|
||||
#[unstable(feature = "more_io_inner_methods", issue="41519")]
|
||||
pub fn into_inner(self) -> (T, U) {
|
||||
(self.first, self.second)
|
||||
}
|
||||
|
||||
/// Gets references to the underlying readers in this `Chain`.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(more_io_inner_methods)]
|
||||
///
|
||||
/// # use std::io;
|
||||
/// use std::io::prelude::*;
|
||||
/// use std::fs::File;
|
||||
///
|
||||
/// # fn foo() -> io::Result<()> {
|
||||
/// let mut foo_file = File::open("foo.txt")?;
|
||||
/// let mut bar_file = File::open("bar.txt")?;
|
||||
///
|
||||
/// let chain = foo_file.chain(bar_file);
|
||||
/// let (foo_file, bar_file) = chain.get_ref();
|
||||
/// # Ok(())
|
||||
/// # }
|
||||
/// ```
|
||||
#[unstable(feature = "more_io_inner_methods", issue="41519")]
|
||||
pub fn get_ref(&self) -> (&T, &U) {
|
||||
(&self.first, &self.second)
|
||||
}
|
||||
|
||||
/// Gets mutable references to the underlying readers in this `Chain`.
|
||||
///
|
||||
/// Care should be taken to avoid modifying the internal I/O state of the
|
||||
/// underlying readers as doing so may corrupt the internal state of this
|
||||
/// `Chain`.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(more_io_inner_methods)]
|
||||
///
|
||||
/// # use std::io;
|
||||
/// use std::io::prelude::*;
|
||||
/// use std::fs::File;
|
||||
///
|
||||
/// # fn foo() -> io::Result<()> {
|
||||
/// let mut foo_file = File::open("foo.txt")?;
|
||||
/// let mut bar_file = File::open("bar.txt")?;
|
||||
///
|
||||
/// let mut chain = foo_file.chain(bar_file);
|
||||
/// let (foo_file, bar_file) = chain.get_mut();
|
||||
/// # Ok(())
|
||||
/// # }
|
||||
/// ```
|
||||
#[unstable(feature = "more_io_inner_methods", issue="41519")]
|
||||
pub fn get_mut(&mut self) -> (&mut T, &mut U) {
|
||||
(&mut self.first, &mut self.second)
|
||||
}
|
||||
}
|
||||
|
||||
#[stable(feature = "std_debug", since = "1.16.0")]
|
||||
impl<T: fmt::Debug, U: fmt::Debug> fmt::Debug for Chain<T, U> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
@ -1616,6 +1697,64 @@ impl<T> Take<T> {
|
||||
pub fn into_inner(self) -> T {
|
||||
self.inner
|
||||
}
|
||||
|
||||
/// Gets a reference to the underlying reader.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(more_io_inner_methods)]
|
||||
///
|
||||
/// use std::io;
|
||||
/// use std::io::prelude::*;
|
||||
/// use std::fs::File;
|
||||
///
|
||||
/// # fn foo() -> io::Result<()> {
|
||||
/// let mut file = File::open("foo.txt")?;
|
||||
///
|
||||
/// let mut buffer = [0; 5];
|
||||
/// let mut handle = file.take(5);
|
||||
/// handle.read(&mut buffer)?;
|
||||
///
|
||||
/// let file = handle.get_ref();
|
||||
/// # Ok(())
|
||||
/// # }
|
||||
/// ```
|
||||
#[unstable(feature = "more_io_inner_methods", issue="41519")]
|
||||
pub fn get_ref(&self) -> &T {
|
||||
&self.inner
|
||||
}
|
||||
|
||||
/// Gets a mutable reference to the underlying reader.
|
||||
///
|
||||
/// Care should be taken to avoid modifying the internal I/O state of the
|
||||
/// underlying reader as doing so may corrupt the internal limit of this
|
||||
/// `Take`.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(more_io_inner_methods)]
|
||||
///
|
||||
/// use std::io;
|
||||
/// use std::io::prelude::*;
|
||||
/// use std::fs::File;
|
||||
///
|
||||
/// # fn foo() -> io::Result<()> {
|
||||
/// let mut file = File::open("foo.txt")?;
|
||||
///
|
||||
/// let mut buffer = [0; 5];
|
||||
/// let mut handle = file.take(5);
|
||||
/// handle.read(&mut buffer)?;
|
||||
///
|
||||
/// let file = handle.get_mut();
|
||||
/// # Ok(())
|
||||
/// # }
|
||||
/// ```
|
||||
#[unstable(feature = "more_io_inner_methods", issue="41519")]
|
||||
pub fn get_mut(&mut self) -> &mut T {
|
||||
&mut self.inner
|
||||
}
|
||||
}
|
||||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
|
Loading…
Reference in New Issue
Block a user