@@ -202,23 +202,6 @@ impl<T> VecDeque<T> {
202
202
len) ;
203
203
}
204
204
205
- /// Returns a pair of slices which contain the contents of the buffer not used by the VecDeque.
206
- #[ inline]
207
- unsafe fn unused_as_mut_slices < ' a > ( & ' a mut self ) -> ( & ' a mut [ T ] , & ' a mut [ T ] ) {
208
- let head = self . head ;
209
- let tail = self . tail ;
210
- let buf = self . buffer_as_mut_slice ( ) ;
211
- if head != tail {
212
- // In buf, head..tail contains the VecDeque and tail..head is unused.
213
- // So calling `ring_slices` with tail and head swapped returns unused slices.
214
- RingSlices :: ring_slices ( buf, tail, head)
215
- } else {
216
- // Swapping doesn't help when head == tail.
217
- let ( before, after) = buf. split_at_mut ( head) ;
218
- ( after, before)
219
- }
220
- }
221
-
222
205
/// Copies a potentially wrapping block of memory len long from src to dest.
223
206
/// (abs(dst - src) + len) must be no larger than cap() (There must be at
224
207
/// most one continuous overlapping region between src and dest).
@@ -1851,148 +1834,8 @@ impl<T> VecDeque<T> {
1851
1834
#[ inline]
1852
1835
#[ stable( feature = "append" , since = "1.4.0" ) ]
1853
1836
pub fn append ( & mut self , other : & mut Self ) {
1854
- // Copies all values from `src_slice` to the start of `dst_slice`.
1855
- unsafe fn copy_whole_slice < T > ( src_slice : & [ T ] , dst_slice : & mut [ T ] ) {
1856
- let len = src_slice. len ( ) ;
1857
- ptr:: copy_nonoverlapping ( src_slice. as_ptr ( ) , dst_slice[ ..len] . as_mut_ptr ( ) , len) ;
1858
- }
1859
-
1860
- let src_total = other. len ( ) ;
1861
-
1862
- // Guarantees there is space in `self` for `other`.
1863
- self . reserve ( src_total) ;
1864
-
1865
- self . head = {
1866
- let original_head = self . head ;
1867
-
1868
- // The goal is to copy all values from `other` into `self`. To avoid any
1869
- // mismatch, all valid values in `other` are retrieved...
1870
- let ( src_high, src_low) = other. as_slices ( ) ;
1871
- // and unoccupied parts of self are retrieved.
1872
- let ( dst_high, dst_low) = unsafe { self . unused_as_mut_slices ( ) } ;
1873
-
1874
- // Then all that is needed is to copy all values from
1875
- // src (src_high and src_low) to dst (dst_high and dst_low).
1876
- //
1877
- // other [o o o . . . . . o o o o]
1878
- // [5 6 7] [1 2 3 4]
1879
- // src_low src_high
1880
- //
1881
- // self [. . . . . . o o o o . .]
1882
- // [3 4 5 6 7 .] [1 2]
1883
- // dst_low dst_high
1884
- //
1885
- // Values are not copied one by one but as slices in `copy_whole_slice`.
1886
- // What slices are used depends on various properties of src and dst.
1887
- // There are 6 cases in total:
1888
- // 1. `src` is contiguous and fits in dst_high
1889
- // 2. `src` is contiguous and does not fit in dst_high
1890
- // 3. `src` is discontiguous and fits in dst_high
1891
- // 4. `src` is discontiguous and does not fit in dst_high
1892
- // + src_high is smaller than dst_high
1893
- // 5. `src` is discontiguous and does not fit in dst_high
1894
- // + dst_high is smaller than src_high
1895
- // 6. `src` is discontiguous and does not fit in dst_high
1896
- // + dst_high is the same size as src_high
1897
- let src_contiguous = src_low. is_empty ( ) ;
1898
- let dst_high_fits_src = dst_high. len ( ) >= src_total;
1899
- match ( src_contiguous, dst_high_fits_src) {
1900
- ( true , true ) => {
1901
- // 1.
1902
- // other [. . . o o o . . . . . .]
1903
- // [] [1 1 1]
1904
- //
1905
- // self [. o o o o o . . . . . .]
1906
- // [.] [1 1 1 . . .]
1907
-
1908
- unsafe {
1909
- copy_whole_slice ( src_high, dst_high) ;
1910
- }
1911
- original_head + src_total
1912
- }
1913
- ( true , false ) => {
1914
- // 2.
1915
- // other [. . . o o o o o . . . .]
1916
- // [] [1 1 2 2 2]
1917
- //
1918
- // self [. . . . . . . o o o . .]
1919
- // [2 2 2 . . . .] [1 1]
1920
-
1921
- let ( src_1, src_2) = src_high. split_at ( dst_high. len ( ) ) ;
1922
- unsafe {
1923
- copy_whole_slice ( src_1, dst_high) ;
1924
- copy_whole_slice ( src_2, dst_low) ;
1925
- }
1926
- src_total - dst_high. len ( )
1927
- }
1928
- ( false , true ) => {
1929
- // 3.
1930
- // other [o o . . . . . . . o o o]
1931
- // [2 2] [1 1 1]
1932
- //
1933
- // self [. o o . . . . . . . . .]
1934
- // [.] [1 1 1 2 2 . . . .]
1935
-
1936
- let ( dst_1, dst_2) = dst_high. split_at_mut ( src_high. len ( ) ) ;
1937
- unsafe {
1938
- copy_whole_slice ( src_high, dst_1) ;
1939
- copy_whole_slice ( src_low, dst_2) ;
1940
- }
1941
- original_head + src_total
1942
- }
1943
- ( false , false ) => {
1944
- if src_high. len ( ) < dst_high. len ( ) {
1945
- // 4.
1946
- // other [o o o . . . . . . o o o]
1947
- // [2 3 3] [1 1 1]
1948
- //
1949
- // self [. . . . . . o o . . . .]
1950
- // [3 3 . . . .] [1 1 1 2]
1951
-
1952
- let ( dst_1, dst_2) = dst_high. split_at_mut ( src_high. len ( ) ) ;
1953
- let ( src_2, src_3) = src_low. split_at ( dst_2. len ( ) ) ;
1954
- unsafe {
1955
- copy_whole_slice ( src_high, dst_1) ;
1956
- copy_whole_slice ( src_2, dst_2) ;
1957
- copy_whole_slice ( src_3, dst_low) ;
1958
- }
1959
- src_3. len ( )
1960
- } else if src_high. len ( ) > dst_high. len ( ) {
1961
- // 5.
1962
- // other [o o o . . . . . o o o o]
1963
- // [3 3 3] [1 1 2 2]
1964
- //
1965
- // self [. . . . . . o o o o . .]
1966
- // [2 2 3 3 3 .] [1 1]
1967
-
1968
- let ( src_1, src_2) = src_high. split_at ( dst_high. len ( ) ) ;
1969
- let ( dst_2, dst_3) = dst_low. split_at_mut ( src_2. len ( ) ) ;
1970
- unsafe {
1971
- copy_whole_slice ( src_1, dst_high) ;
1972
- copy_whole_slice ( src_2, dst_2) ;
1973
- copy_whole_slice ( src_low, dst_3) ;
1974
- }
1975
- dst_2. len ( ) + src_low. len ( )
1976
- } else {
1977
- // 6.
1978
- // other [o o . . . . . . . o o o]
1979
- // [2 2] [1 1 1]
1980
- //
1981
- // self [. . . . . . . o o . . .]
1982
- // [2 2 . . . . .] [1 1 1]
1983
-
1984
- unsafe {
1985
- copy_whole_slice ( src_high, dst_high) ;
1986
- copy_whole_slice ( src_low, dst_low) ;
1987
- }
1988
- src_low. len ( )
1989
- }
1990
- }
1991
- }
1992
- } ;
1993
-
1994
- // Some values now exist in both `other` and `self` but are made inaccessible in `other`.
1995
- other. tail = other. head ;
1837
+ // naive impl
1838
+ self . extend ( other. drain ( ..) ) ;
1996
1839
}
1997
1840
1998
1841
/// Retains only the elements specified by the predicate.
@@ -2145,11 +1988,11 @@ pub struct Iter<'a, T: 'a> {
2145
1988
#[ stable( feature = "collection_debug" , since = "1.17.0" ) ]
2146
1989
impl < ' a , T : ' a + fmt:: Debug > fmt:: Debug for Iter < ' a , T > {
2147
1990
fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
1991
+ let ( front, back) = RingSlices :: ring_slices ( self . ring , self . head , self . tail ) ;
2148
1992
f. debug_tuple ( "Iter" )
2149
- . field ( & self . ring )
2150
- . field ( & self . tail )
2151
- . field ( & self . head )
2152
- . finish ( )
1993
+ . field ( & front)
1994
+ . field ( & back)
1995
+ . finish ( )
2153
1996
}
2154
1997
}
2155
1998
@@ -2242,11 +2085,11 @@ pub struct IterMut<'a, T: 'a> {
2242
2085
#[ stable( feature = "collection_debug" , since = "1.17.0" ) ]
2243
2086
impl < ' a , T : ' a + fmt:: Debug > fmt:: Debug for IterMut < ' a , T > {
2244
2087
fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
2088
+ let ( front, back) = RingSlices :: ring_slices ( & * self . ring , self . head , self . tail ) ;
2245
2089
f. debug_tuple ( "IterMut" )
2246
- . field ( & self . ring )
2247
- . field ( & self . tail )
2248
- . field ( & self . head )
2249
- . finish ( )
2090
+ . field ( & front)
2091
+ . field ( & back)
2092
+ . finish ( )
2250
2093
}
2251
2094
}
2252
2095
@@ -3124,4 +2967,21 @@ mod tests {
3124
2967
}
3125
2968
}
3126
2969
2970
+ #[ test]
2971
+ fn issue_53529 ( ) {
2972
+ use boxed:: Box ;
2973
+
2974
+ let mut dst = VecDeque :: new ( ) ;
2975
+ dst. push_front ( Box :: new ( 1 ) ) ;
2976
+ dst. push_front ( Box :: new ( 2 ) ) ;
2977
+ assert_eq ! ( * dst. pop_back( ) . unwrap( ) , 1 ) ;
2978
+
2979
+ let mut src = VecDeque :: new ( ) ;
2980
+ src. push_front ( Box :: new ( 2 ) ) ;
2981
+ dst. append ( & mut src) ;
2982
+ for a in dst {
2983
+ assert_eq ! ( * a, 2 ) ;
2984
+ }
2985
+ }
2986
+
3127
2987
}
0 commit comments