Skip to content

Commit 4fa71ed

Browse files
authoredFeb 19, 2022
Rollup merge of #92902 - ssomers:docter_drain, r=yaahc
Improve the documentation of drain members hopefully fixes #92765
2 parents 1882597 + a677e60 commit 4fa71ed

File tree

6 files changed

+57
-26
lines changed

6 files changed

+57
-26
lines changed
 

‎library/alloc/src/collections/binary_heap.rs

+11-5
Original file line numberDiff line numberDiff line change
@@ -746,9 +746,12 @@ impl<T: Ord> BinaryHeap<T> {
746746
self.rebuild_tail(start);
747747
}
748748

749-
/// Returns an iterator which retrieves elements in heap order.
750-
/// The retrieved elements are removed from the original heap.
751-
/// The remaining elements will be removed on drop in heap order.
749+
/// Clears the binary heap, returning an iterator over the removed elements
750+
/// in heap order. If the iterator is dropped before being fully consumed,
751+
/// it drops the remaining elements in heap order.
752+
///
753+
/// The returned iterator keeps a mutable borrow on the heap to optimize
754+
/// its implementation.
752755
///
753756
/// Note:
754757
/// * `.drain_sorted()` is *O*(*n* \* log(*n*)); much slower than `.drain()`.
@@ -1158,9 +1161,12 @@ impl<T> BinaryHeap<T> {
11581161
self.len() == 0
11591162
}
11601163

1161-
/// Clears the binary heap, returning an iterator over the removed elements.
1164+
/// Clears the binary heap, returning an iterator over the removed elements
1165+
/// in arbitrary order. If the iterator is dropped before being fully
1166+
/// consumed, it drops the remaining elements in arbitrary order.
11621167
///
1163-
/// The elements are removed in arbitrary order.
1168+
/// The returned iterator keeps a mutable borrow on the heap to optimize
1169+
/// its implementation.
11641170
///
11651171
/// # Examples
11661172
///

‎library/alloc/src/collections/vec_deque/mod.rs

+12-8
Original file line numberDiff line numberDiff line change
@@ -1215,21 +1215,25 @@ impl<T, A: Allocator> VecDeque<T, A> {
12151215
unsafe { IterMut::new(ring, tail, head, PhantomData) }
12161216
}
12171217

1218-
/// Creates a draining iterator that removes the specified range in the
1219-
/// deque and yields the removed items.
1218+
/// Removes the specified range from the deque in bulk, returning all
1219+
/// removed elements as an iterator. If the iterator is dropped before
1220+
/// being fully consumed, it drops the remaining removed elements.
12201221
///
1221-
/// Note 1: The element range is removed even if the iterator is not
1222-
/// consumed until the end.
1222+
/// The returned iterator keeps a mutable borrow on the queue to optimize
1223+
/// its implementation.
12231224
///
1224-
/// Note 2: It is unspecified how many elements are removed from the deque,
1225-
/// if the `Drain` value is not dropped, but the borrow it holds expires
1226-
/// (e.g., due to `mem::forget`).
12271225
///
12281226
/// # Panics
12291227
///
12301228
/// Panics if the starting point is greater than the end point or if
12311229
/// the end point is greater than the length of the deque.
12321230
///
1231+
/// # Leaking
1232+
///
1233+
/// If the returned iterator goes out of scope without being dropped (due to
1234+
/// [`mem::forget`], for example), the deque may have lost and leaked
1235+
/// elements arbitrarily, including elements outside the range.
1236+
///
12331237
/// # Examples
12341238
///
12351239
/// ```
@@ -1240,7 +1244,7 @@ impl<T, A: Allocator> VecDeque<T, A> {
12401244
/// assert_eq!(drained, [3]);
12411245
/// assert_eq!(deque, [1, 2]);
12421246
///
1243-
/// // A full range clears all contents
1247+
/// // A full range clears all contents, like `clear()` does
12441248
/// deque.drain(..);
12451249
/// assert!(deque.is_empty());
12461250
/// ```

‎library/alloc/src/string.rs

+12-5
Original file line numberDiff line numberDiff line change
@@ -1628,17 +1628,24 @@ impl String {
16281628
self.vec.clear()
16291629
}
16301630

1631-
/// Creates a draining iterator that removes the specified range in the `String`
1632-
/// and yields the removed `chars`.
1631+
/// Removes the specified range from the string in bulk, returning all
1632+
/// removed characters as an iterator.
16331633
///
1634-
/// Note: The element range is removed even if the iterator is not
1635-
/// consumed until the end.
1634+
/// The returned iterator keeps a mutable borrow on the string to optimize
1635+
/// its implementation.
16361636
///
16371637
/// # Panics
16381638
///
16391639
/// Panics if the starting point or end point do not lie on a [`char`]
16401640
/// boundary, or if they're out of bounds.
16411641
///
1642+
/// # Leaking
1643+
///
1644+
/// If the returned iterator goes out of scope without being dropped (due to
1645+
/// [`core::mem::forget`], for example), the string may still contain a copy
1646+
/// of any drained characters, or may have lost characters arbitrarily,
1647+
/// including characters outside the range.
1648+
///
16421649
/// # Examples
16431650
///
16441651
/// Basic usage:
@@ -1652,7 +1659,7 @@ impl String {
16521659
/// assert_eq!(t, "α is alpha, ");
16531660
/// assert_eq!(s, "β is beta");
16541661
///
1655-
/// // A full range clears the string
1662+
/// // A full range clears the string, like `clear()` does
16561663
/// s.drain(..);
16571664
/// assert_eq!(s, "");
16581665
/// ```

‎library/alloc/src/vec/mod.rs

+12-7
Original file line numberDiff line numberDiff line change
@@ -1799,19 +1799,24 @@ impl<T, A: Allocator> Vec<T, A> {
17991799
self.len += count;
18001800
}
18011801

1802-
/// Creates a draining iterator that removes the specified range in the vector
1803-
/// and yields the removed items.
1802+
/// Removes the specified range from the vector in bulk, returning all
1803+
/// removed elements as an iterator. If the iterator is dropped before
1804+
/// being fully consumed, it drops the remaining removed elements.
18041805
///
1805-
/// When the iterator **is** dropped, all elements in the range are removed
1806-
/// from the vector, even if the iterator was not fully consumed. If the
1807-
/// iterator **is not** dropped (with [`mem::forget`] for example), it is
1808-
/// unspecified how many elements are removed.
1806+
/// The returned iterator keeps a mutable borrow on the vector to optimize
1807+
/// its implementation.
18091808
///
18101809
/// # Panics
18111810
///
18121811
/// Panics if the starting point is greater than the end point or if
18131812
/// the end point is greater than the length of the vector.
18141813
///
1814+
/// # Leaking
1815+
///
1816+
/// If the returned iterator goes out of scope without being dropped (due to
1817+
/// [`mem::forget`], for example), the vector may have lost and leaked
1818+
/// elements arbitrarily, including elements outside the range.
1819+
///
18151820
/// # Examples
18161821
///
18171822
/// ```
@@ -1820,7 +1825,7 @@ impl<T, A: Allocator> Vec<T, A> {
18201825
/// assert_eq!(v, &[1]);
18211826
/// assert_eq!(u, &[2, 3]);
18221827
///
1823-
/// // A full range clears the vector
1828+
/// // A full range clears the vector, like `clear()` does
18241829
/// v.drain(..);
18251830
/// assert_eq!(v, &[]);
18261831
/// ```

‎library/std/src/collections/hash/map.rs

+4
Original file line numberDiff line numberDiff line change
@@ -547,6 +547,10 @@ impl<K, V, S> HashMap<K, V, S> {
547547
/// Clears the map, returning all key-value pairs as an iterator. Keeps the
548548
/// allocated memory for reuse.
549549
///
550+
/// If the returned iterator is dropped before being fully consumed, it
551+
/// drops the remaining key-value pairs. The returned iterator keeps a
552+
/// mutable borrow on the vector to optimize its implementation.
553+
///
550554
/// # Examples
551555
///
552556
/// ```

‎library/std/src/collections/hash/set.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,12 @@ impl<T, S> HashSet<T, S> {
227227
self.base.is_empty()
228228
}
229229

230-
/// Clears the set, returning all elements in an iterator.
230+
/// Clears the set, returning all elements as an iterator. Keeps the
231+
/// allocated memory for reuse.
232+
///
233+
/// If the returned iterator is dropped before being fully consumed, it
234+
/// drops the remaining elements. The returned iterator keeps a mutable
235+
/// borrow on the vector to optimize its implementation.
231236
///
232237
/// # Examples
233238
///

0 commit comments

Comments
 (0)
Please sign in to comment.