@@ -1147,7 +1147,7 @@ impl<T, A: Allocator> VecDeque<T, A> {
1147
1147
#[ inline]
1148
1148
#[ stable( feature = "deque_extras_15" , since = "1.5.0" ) ]
1149
1149
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 ) ;
1151
1151
// SAFETY: `slice_ranges` always returns valid ranges into
1152
1152
// the physical buffer.
1153
1153
unsafe { ( & * self . buffer_range ( a_range) , & * self . buffer_range ( b_range) ) }
@@ -1181,7 +1181,7 @@ impl<T, A: Allocator> VecDeque<T, A> {
1181
1181
#[ inline]
1182
1182
#[ stable( feature = "deque_extras_15" , since = "1.5.0" ) ]
1183
1183
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 ) ;
1185
1185
// SAFETY: `slice_ranges` always returns valid ranges into
1186
1186
// the physical buffer.
1187
1187
unsafe { ( & mut * self . buffer_range ( a_range) , & mut * self . buffer_range ( b_range) ) }
@@ -1223,19 +1223,21 @@ impl<T, A: Allocator> VecDeque<T, A> {
1223
1223
1224
1224
/// Given a range into the logical buffer of the deque, this function
1225
1225
/// 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 > )
1228
1230
where
1229
1231
R : RangeBounds < usize > ,
1230
1232
{
1231
- let Range { start, end } = slice:: range ( range, ..self . len ) ;
1233
+ let Range { start, end } = slice:: range ( range, ..len) ;
1232
1234
let len = end - start;
1233
1235
1234
1236
if len == 0 {
1235
1237
( 0 ..0 , 0 ..0 )
1236
1238
} else {
1237
1239
// `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`
1239
1241
// and the indexing is valid.
1240
1242
let wrapped_start = self . to_physical_idx ( start) ;
1241
1243
@@ -1281,7 +1283,7 @@ impl<T, A: Allocator> VecDeque<T, A> {
1281
1283
where
1282
1284
R : RangeBounds < usize > ,
1283
1285
{
1284
- let ( a_range, b_range) = self . slice_ranges ( range) ;
1286
+ let ( a_range, b_range) = self . slice_ranges ( range, self . len ) ;
1285
1287
// SAFETY: The ranges returned by `slice_ranges`
1286
1288
// are valid ranges into the physical buffer, so
1287
1289
// it's ok to pass them to `buffer_range` and
@@ -1321,7 +1323,7 @@ impl<T, A: Allocator> VecDeque<T, A> {
1321
1323
where
1322
1324
R : RangeBounds < usize > ,
1323
1325
{
1324
- let ( a_range, b_range) = self . slice_ranges ( range) ;
1326
+ let ( a_range, b_range) = self . slice_ranges ( range, self . len ) ;
1325
1327
// SAFETY: The ranges returned by `slice_ranges`
1326
1328
// are valid ranges into the physical buffer, so
1327
1329
// it's ok to pass them to `buffer_range` and
0 commit comments