@@ -1147,7 +1147,7 @@ impl<T, A: Allocator> VecDeque<T, A> {
11471147 #[ inline]
11481148 #[ stable( feature = "deque_extras_15" , since = "1.5.0" ) ]
11491149 pub fn as_slices ( & self ) -> ( & [ T ] , & [ T ] ) {
1150- let ( a_range, b_range) = self . slice_ranges ( ..) ;
1150+ let ( a_range, b_range) = self . slice_ranges ( .., self . len ) ;
11511151 // SAFETY: `slice_ranges` always returns valid ranges into
11521152 // the physical buffer.
11531153 unsafe { ( & * self . buffer_range ( a_range) , & * self . buffer_range ( b_range) ) }
@@ -1181,7 +1181,7 @@ impl<T, A: Allocator> VecDeque<T, A> {
11811181 #[ inline]
11821182 #[ stable( feature = "deque_extras_15" , since = "1.5.0" ) ]
11831183 pub fn as_mut_slices ( & mut self ) -> ( & mut [ T ] , & mut [ T ] ) {
1184- let ( a_range, b_range) = self . slice_ranges ( ..) ;
1184+ let ( a_range, b_range) = self . slice_ranges ( .., self . len ) ;
11851185 // SAFETY: `slice_ranges` always returns valid ranges into
11861186 // the physical buffer.
11871187 unsafe { ( & mut * self . buffer_range ( a_range) , & mut * self . buffer_range ( b_range) ) }
@@ -1223,19 +1223,21 @@ impl<T, A: Allocator> VecDeque<T, A> {
12231223
12241224 /// Given a range into the logical buffer of the deque, this function
12251225 /// return two ranges into the physical buffer that correspond to
1226- /// the given range.
1227- fn slice_ranges < R > ( & self , range : R ) -> ( Range < usize > , Range < usize > )
1226+ /// the given range. The `len` parameter should usually just be `self.len`;
1227+ /// the reason it's passed explicitly is that if the deque is wrapped in
1228+ /// a `Drain`, then `self.len` is not actually the length of the deque.
1229+ fn slice_ranges < R > ( & self , range : R , len : usize ) -> ( Range < usize > , Range < usize > )
12281230 where
12291231 R : RangeBounds < usize > ,
12301232 {
1231- let Range { start, end } = slice:: range ( range, ..self . len ) ;
1233+ let Range { start, end } = slice:: range ( range, ..len) ;
12321234 let len = end - start;
12331235
12341236 if len == 0 {
12351237 ( 0 ..0 , 0 ..0 )
12361238 } else {
12371239 // `slice::range` guarantees that `start <= end <= self.len`.
1238- // because `len != 0`, we know that `start < end`, so `start < self. len`
1240+ // because `len != 0`, we know that `start < end`, so `start < len`
12391241 // and the indexing is valid.
12401242 let wrapped_start = self . to_physical_idx ( start) ;
12411243
@@ -1281,7 +1283,7 @@ impl<T, A: Allocator> VecDeque<T, A> {
12811283 where
12821284 R : RangeBounds < usize > ,
12831285 {
1284- let ( a_range, b_range) = self . slice_ranges ( range) ;
1286+ let ( a_range, b_range) = self . slice_ranges ( range, self . len ) ;
12851287 // SAFETY: The ranges returned by `slice_ranges`
12861288 // are valid ranges into the physical buffer, so
12871289 // it's ok to pass them to `buffer_range` and
@@ -1321,7 +1323,7 @@ impl<T, A: Allocator> VecDeque<T, A> {
13211323 where
13221324 R : RangeBounds < usize > ,
13231325 {
1324- let ( a_range, b_range) = self . slice_ranges ( range) ;
1326+ let ( a_range, b_range) = self . slice_ranges ( range, self . len ) ;
13251327 // SAFETY: The ranges returned by `slice_ranges`
13261328 // are valid ranges into the physical buffer, so
13271329 // it's ok to pass them to `buffer_range` and
0 commit comments