From cc2a2808d078b0a7d49f7a89fa7d14ead1ebc0df Mon Sep 17 00:00:00 2001 From: Scott McMurray Date: Sat, 1 Jun 2019 17:29:05 -0700 Subject: Add some Vec <-> VecDeque documentation These are more than just `.into_iter().collect()`, so talk about some of their nuances. --- src/liballoc/collections/vec_deque.rs | 53 +++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) (limited to 'src/liballoc') diff --git a/src/liballoc/collections/vec_deque.rs b/src/liballoc/collections/vec_deque.rs index 31e49d06a7b..8cda28a5e40 100644 --- a/src/liballoc/collections/vec_deque.rs +++ b/src/liballoc/collections/vec_deque.rs @@ -2707,6 +2707,33 @@ impl fmt::Debug for VecDeque { } } +/// Turn a `Vec` into a `VecDeque`. +/// +/// This avoids reallocating where possible, but the conditions for that are +/// strict, and subject to change, so shouldn't be relied upon unless the +/// `Vec` came from `From` has hasn't been reallocated. +/// +/// # Examples +/// +/// ``` +/// use std::collections::VecDeque; +/// +/// // Start with a VecDeque +/// let deque: VecDeque<_> = (1..5).collect(); +/// +/// // Turn it into a Vec (no allocation needed) +/// let mut vec = Vec::from(deque); +/// +/// // modify it, being careful to not trigger reallocation +/// vec.pop(); +/// vec.push(100); +/// +/// // Turn it back into a VecDeque (no allocation needed) +/// let ptr = vec.as_ptr(); +/// let deque = VecDeque::from(vec); +/// assert_eq!(deque, [1, 2, 3, 100]); +/// assert_eq!(deque.as_slices().0.as_ptr(), ptr); +/// ``` #[stable(feature = "vecdeque_vec_conversions", since = "1.10.0")] impl From> for VecDeque { fn from(mut other: Vec) -> Self { @@ -2733,6 +2760,32 @@ impl From> for VecDeque { } } +/// Turn a `VecDeque` into a `Vec`. +/// +/// This never needs to re-allocate, but does need to do O(n) data movement if +/// the circular buffer doesn't happen to be at the beginning of the allocation. +/// +/// # Examples +/// +/// ``` +/// use std::collections::VecDeque; +/// +/// // This one is O(1) +/// let deque: VecDeque<_> = (1..5).collect(); +/// let ptr = deque.as_slices().0.as_ptr(); +/// let vec = Vec::from(deque); +/// assert_eq!(vec, [1, 2, 3, 4]); +/// assert_eq!(vec.as_ptr(), ptr); +/// +/// // This one need data rearranging +/// let mut deque: VecDeque<_> = (1..5).collect(); +/// deque.push_front(9); +/// deque.push_front(8); +/// let ptr = deque.as_slices().1.as_ptr(); +/// let vec = Vec::from(deque); +/// assert_eq!(vec, [8, 9, 1, 2, 3, 4]); +/// assert_eq!(vec.as_ptr(), ptr); +/// ``` #[stable(feature = "vecdeque_vec_conversions", since = "1.10.0")] impl From> for Vec { fn from(other: VecDeque) -> Self { -- cgit 1.4.1-3-g733a5