Skip to content

Commit cc2a280

Browse files
committed
Add some Vec <-> VecDeque documentation
These are more than just `.into_iter().collect()`, so talk about some of their nuances.
1 parent 6312b89 commit cc2a280

File tree

1 file changed

+53
-0
lines changed

1 file changed

+53
-0
lines changed

src/liballoc/collections/vec_deque.rs

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2707,6 +2707,33 @@ impl<T: fmt::Debug> fmt::Debug for VecDeque<T> {
27072707
}
27082708
}
27092709

2710+
/// Turn a `Vec` into a `VecDeque`.
2711+
///
2712+
/// This avoids reallocating where possible, but the conditions for that are
2713+
/// strict, and subject to change, so shouldn't be relied upon unless the
2714+
/// `Vec` came from `From<VecDeque>` has hasn't been reallocated.
2715+
///
2716+
/// # Examples
2717+
///
2718+
/// ```
2719+
/// use std::collections::VecDeque;
2720+
///
2721+
/// // Start with a VecDeque
2722+
/// let deque: VecDeque<_> = (1..5).collect();
2723+
///
2724+
/// // Turn it into a Vec (no allocation needed)
2725+
/// let mut vec = Vec::from(deque);
2726+
///
2727+
/// // modify it, being careful to not trigger reallocation
2728+
/// vec.pop();
2729+
/// vec.push(100);
2730+
///
2731+
/// // Turn it back into a VecDeque (no allocation needed)
2732+
/// let ptr = vec.as_ptr();
2733+
/// let deque = VecDeque::from(vec);
2734+
/// assert_eq!(deque, [1, 2, 3, 100]);
2735+
/// assert_eq!(deque.as_slices().0.as_ptr(), ptr);
2736+
/// ```
27102737
#[stable(feature = "vecdeque_vec_conversions", since = "1.10.0")]
27112738
impl<T> From<Vec<T>> for VecDeque<T> {
27122739
fn from(mut other: Vec<T>) -> Self {
@@ -2733,6 +2760,32 @@ impl<T> From<Vec<T>> for VecDeque<T> {
27332760
}
27342761
}
27352762

2763+
/// Turn a `VecDeque` into a `Vec`.
2764+
///
2765+
/// This never needs to re-allocate, but does need to do O(n) data movement if
2766+
/// the circular buffer doesn't happen to be at the beginning of the allocation.
2767+
///
2768+
/// # Examples
2769+
///
2770+
/// ```
2771+
/// use std::collections::VecDeque;
2772+
///
2773+
/// // This one is O(1)
2774+
/// let deque: VecDeque<_> = (1..5).collect();
2775+
/// let ptr = deque.as_slices().0.as_ptr();
2776+
/// let vec = Vec::from(deque);
2777+
/// assert_eq!(vec, [1, 2, 3, 4]);
2778+
/// assert_eq!(vec.as_ptr(), ptr);
2779+
///
2780+
/// // This one need data rearranging
2781+
/// let mut deque: VecDeque<_> = (1..5).collect();
2782+
/// deque.push_front(9);
2783+
/// deque.push_front(8);
2784+
/// let ptr = deque.as_slices().1.as_ptr();
2785+
/// let vec = Vec::from(deque);
2786+
/// assert_eq!(vec, [8, 9, 1, 2, 3, 4]);
2787+
/// assert_eq!(vec.as_ptr(), ptr);
2788+
/// ```
27362789
#[stable(feature = "vecdeque_vec_conversions", since = "1.10.0")]
27372790
impl<T> From<VecDeque<T>> for Vec<T> {
27382791
fn from(other: VecDeque<T>) -> Self {

0 commit comments

Comments
 (0)