@@ -2709,6 +2709,11 @@ impl<T: fmt::Debug> fmt::Debug for VecDeque<T> {
2709
2709
2710
2710
#[ stable( feature = "vecdeque_vec_conversions" , since = "1.10.0" ) ]
2711
2711
impl < T > From < Vec < T > > for VecDeque < T > {
2712
+ /// Turn a [`Vec<T>`] into a [`VecDeque<T>`].
2713
+ ///
2714
+ /// This avoids reallocating where possible, but the conditions for that are
2715
+ /// strict, and subject to change, and so shouldn't be relied upon unless the
2716
+ /// `Vec<T>` came from `From<VecDeque<T>>` and hasn't been reallocated.
2712
2717
fn from ( mut other : Vec < T > ) -> Self {
2713
2718
unsafe {
2714
2719
let other_buf = other. as_mut_ptr ( ) ;
@@ -2735,6 +2740,32 @@ impl<T> From<Vec<T>> for VecDeque<T> {
2735
2740
2736
2741
#[ stable( feature = "vecdeque_vec_conversions" , since = "1.10.0" ) ]
2737
2742
impl < T > From < VecDeque < T > > for Vec < T > {
2743
+ /// Turn a [`VecDeque<T>`] into a [`Vec<T>`].
2744
+ ///
2745
+ /// This never needs to re-allocate, but does need to do O(n) data movement if
2746
+ /// the circular buffer doesn't happen to be at the beginning of the allocation.
2747
+ ///
2748
+ /// # Examples
2749
+ ///
2750
+ /// ```
2751
+ /// use std::collections::VecDeque;
2752
+ ///
2753
+ /// // This one is O(1).
2754
+ /// let deque: VecDeque<_> = (1..5).collect();
2755
+ /// let ptr = deque.as_slices().0.as_ptr();
2756
+ /// let vec = Vec::from(deque);
2757
+ /// assert_eq!(vec, [1, 2, 3, 4]);
2758
+ /// assert_eq!(vec.as_ptr(), ptr);
2759
+ ///
2760
+ /// // This one needs data rearranging.
2761
+ /// let mut deque: VecDeque<_> = (1..5).collect();
2762
+ /// deque.push_front(9);
2763
+ /// deque.push_front(8);
2764
+ /// let ptr = deque.as_slices().1.as_ptr();
2765
+ /// let vec = Vec::from(deque);
2766
+ /// assert_eq!(vec, [8, 9, 1, 2, 3, 4]);
2767
+ /// assert_eq!(vec.as_ptr(), ptr);
2768
+ /// ```
2738
2769
fn from ( other : VecDeque < T > ) -> Self {
2739
2770
unsafe {
2740
2771
let buf = other. buf . ptr ( ) ;
0 commit comments