Update documentation
This commit is contained in:
parent
f81b07e947
commit
f52082f543
@ -55,6 +55,9 @@
|
||||
//! This is handled by the [`InPlaceDrop`] guard for sink items (`U`) and by
|
||||
//! [`vec::IntoIter::forget_allocation_drop_remaining()`] for remaining source items (`T`).
|
||||
//!
|
||||
//! If dropping any remaining source item (`T`) panics then [`InPlaceDstBufDrop`] will handle dropping
|
||||
//! the already collected sink items (`U`) and freeing the allocation.
|
||||
//!
|
||||
//! [`vec::IntoIter::forget_allocation_drop_remaining()`]: super::IntoIter::forget_allocation_drop_remaining()
|
||||
//!
|
||||
//! # O(1) collect
|
||||
@ -194,8 +197,8 @@ impl<T, I> SpecFromIter<T, I> for Vec<T>
|
||||
// Drop any remaining values at the tail of the source but prevent drop of the allocation
|
||||
// itself once IntoIter goes out of scope.
|
||||
// If the drop panics then we also try to drop the destination buffer and its elements.
|
||||
// This is safe because `forget_allocation_drop_remaining` forgets the allocation *before*
|
||||
// trying to drop the remaining elements.
|
||||
// This is safe because `forget_allocation_drop_remaining` immediately forgets the allocation
|
||||
// and won't panic before that.
|
||||
//
|
||||
// Note: This access to the source wouldn't be allowed by the TrustedRandomIteratorNoCoerce
|
||||
// contract (used by SpecInPlaceCollect below). But see the "O(1) collect" section in the
|
||||
|
@ -96,13 +96,16 @@ fn as_raw_mut_slice(&mut self) -> *mut [T] {
|
||||
}
|
||||
|
||||
/// Drops remaining elements and relinquishes the backing allocation.
|
||||
/// This method guarantees it won't panic before relinquishing
|
||||
/// the backing allocation.
|
||||
///
|
||||
/// This is roughly equivalent to the following, but more efficient
|
||||
///
|
||||
/// ```
|
||||
/// # let mut into_iter = Vec::<u8>::with_capacity(10).into_iter();
|
||||
/// let mut into_iter = std::mem::replace(&mut into_iter, Vec::new().into_iter());
|
||||
/// (&mut into_iter).for_each(core::mem::drop);
|
||||
/// unsafe { core::ptr::write(&mut into_iter, Vec::new().into_iter()); }
|
||||
/// std::mem::forget(into_iter);
|
||||
/// ```
|
||||
///
|
||||
/// This method is used by in-place iteration, refer to the vec::in_place_collect
|
||||
@ -119,6 +122,8 @@ pub(super) fn forget_allocation_drop_remaining(&mut self) {
|
||||
self.ptr = self.buf.as_ptr();
|
||||
self.end = self.buf.as_ptr();
|
||||
|
||||
// Dropping the remaining elements can panic, so this needs to be
|
||||
// done only after updating the other fields.
|
||||
unsafe {
|
||||
ptr::drop_in_place(remaining);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user