mod tests;
use crate::cmp;
-use crate::convert::TryInto;
use crate::fmt;
use crate::mem::replace;
use crate::ops::{Deref, DerefMut};
/// Also see [`IoSliceMut::advance_slices`] to advance the cursors of
/// multiple buffers.
///
+ /// # Panics
+ ///
+ /// Panics when trying to advance beyond the end of the slice.
+ ///
/// # Examples
///
/// ```
self.0.advance(n)
}
- /// Advance the internal cursor of the slices.
+ /// Advance a slice of slices.
///
- /// # Notes
+ /// Shrinks the slice to remove any `IoSliceMut`s that are fully advanced over.
+ /// If the cursor ends up in the middle of an `IoSliceMut`, it is modified
+ /// to start at that cursor.
///
- /// Elements in the slice may be modified if the cursor is not advanced to
- /// the end of the slice. For example if we have a slice of buffers with 2
- /// `IoSliceMut`s, both of length 8, and we advance the cursor by 10 bytes
- /// the first `IoSliceMut` will be untouched however the second will be
- /// modified to remove the first 2 bytes (10 - 8).
+ /// For example, if we have a slice of two 8-byte `IoSliceMut`s, and we advance by 10 bytes,
+ /// the result will only include the second `IoSliceMut`, advanced by 2 bytes.
+ ///
+ /// # Panics
+ ///
+ /// Panics when trying to advance beyond the end of the slices.
///
/// # Examples
///
}
*bufs = &mut replace(bufs, &mut [])[remove..];
- if !bufs.is_empty() {
+ if bufs.is_empty() {
+ assert!(n == accumulated_len, "advancing io slices beyond their length");
+ } else {
bufs[0].advance(n - accumulated_len)
}
}
/// Also see [`IoSlice::advance_slices`] to advance the cursors of multiple
/// buffers.
///
+ /// # Panics
+ ///
+ /// Panics when trying to advance beyond the end of the slice.
+ ///
/// # Examples
///
/// ```
/// use std::io::IoSlice;
/// use std::ops::Deref;
///
- /// let mut data = [1; 8];
- /// let mut buf = IoSlice::new(&mut data);
+ /// let data = [1; 8];
+ /// let mut buf = IoSlice::new(&data);
///
/// // Mark 3 bytes as read.
/// buf.advance(3);
self.0.advance(n)
}
- /// Advance the internal cursor of the slices.
+ /// Advance a slice of slices.
///
- /// # Notes
+ /// Shrinks the slice to remove any `IoSlice`s that are fully advanced over.
+ /// If the cursor ends up in the middle of an `IoSlice`, it is modified
+ /// to start at that cursor.
///
- /// Elements in the slice may be modified if the cursor is not advanced to
- /// the end of the slice. For example if we have a slice of buffers with 2
- /// `IoSlice`s, both of length 8, and we advance the cursor by 10 bytes the
- /// first `IoSlice` will be untouched however the second will be modified to
- /// remove the first 2 bytes (10 - 8).
+ /// For example, if we have a slice of two 8-byte `IoSlice`s, and we advance by 10 bytes,
+ /// the result will only include the second `IoSlice`, advanced by 2 bytes.
+ ///
+ /// # Panics
+ ///
+ /// Panics when trying to advance beyond the end of the slices.
///
/// # Examples
///
}
*bufs = &mut replace(bufs, &mut [])[remove..];
- if !bufs.is_empty() {
+ if bufs.is_empty() {
+ assert!(n == accumulated_len, "advancing io slices beyond their length");
+ } else {
bufs[0].advance(n - accumulated_len)
}
}
/// use std::fs::File;
///
/// fn main() -> std::io::Result<()> {
- /// let mut data1 = [1; 8];
- /// let mut data2 = [15; 8];
- /// let io_slice1 = IoSlice::new(&mut data1);
- /// let io_slice2 = IoSlice::new(&mut data2);
+ /// let data1 = [1; 8];
+ /// let data2 = [15; 8];
+ /// let io_slice1 = IoSlice::new(&data1);
+ /// let io_slice2 = IoSlice::new(&data2);
///
/// let mut buffer = File::create("foo.txt")?;
///
}
/// Read all bytes until a newline (the `0xA` byte) is reached, and append
- /// them to the provided buffer.
+ /// them to the provided buffer. You do not need to clear the buffer before
+ /// appending.
///
/// This function will read bytes from the underlying stream until the
/// newline delimiter (the `0xA` byte) or EOF is found. Once found, all bytes