@@ -10,6 +10,7 @@ use crate::intrinsics::{assume, exact_div, unchecked_sub};
10
10
use crate :: iter:: { FusedIterator , TrustedLen , TrustedRandomAccess } ;
11
11
use crate :: marker:: { PhantomData , Send , Sized , Sync } ;
12
12
use crate :: mem;
13
+ use crate :: num:: NonZeroUsize ;
13
14
use crate :: ptr:: NonNull ;
14
15
15
16
use super :: { from_raw_parts, from_raw_parts_mut} ;
@@ -1187,12 +1188,12 @@ forward_iterator! { RSplitNMut: T, &'a mut [T] }
1187
1188
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
1188
1189
pub struct Windows < ' a , T : ' a > {
1189
1190
v : & ' a [ T ] ,
1190
- size : usize ,
1191
+ size : NonZeroUsize ,
1191
1192
}
1192
1193
1193
1194
impl < ' a , T : ' a > Windows < ' a , T > {
1194
1195
#[ inline]
1195
- pub ( super ) fn new ( slice : & ' a [ T ] , size : usize ) -> Self {
1196
+ pub ( super ) fn new ( slice : & ' a [ T ] , size : NonZeroUsize ) -> Self {
1196
1197
Self { v : slice, size }
1197
1198
}
1198
1199
}
@@ -1211,21 +1212,21 @@ impl<'a, T> Iterator for Windows<'a, T> {
1211
1212
1212
1213
#[ inline]
1213
1214
fn next ( & mut self ) -> Option < & ' a [ T ] > {
1214
- if self . size > self . v . len ( ) {
1215
+ if self . size . get ( ) > self . v . len ( ) {
1215
1216
None
1216
1217
} else {
1217
- let ret = Some ( & self . v [ ..self . size ] ) ;
1218
+ let ret = Some ( & self . v [ ..self . size . get ( ) ] ) ;
1218
1219
self . v = & self . v [ 1 ..] ;
1219
1220
ret
1220
1221
}
1221
1222
}
1222
1223
1223
1224
#[ inline]
1224
1225
fn size_hint ( & self ) -> ( usize , Option < usize > ) {
1225
- if self . size > self . v . len ( ) {
1226
+ if self . size . get ( ) > self . v . len ( ) {
1226
1227
( 0 , Some ( 0 ) )
1227
1228
} else {
1228
- let size = self . v . len ( ) - self . size + 1 ;
1229
+ let size = self . v . len ( ) - self . size . get ( ) + 1 ;
1229
1230
( size, Some ( size) )
1230
1231
}
1231
1232
}
@@ -1237,7 +1238,7 @@ impl<'a, T> Iterator for Windows<'a, T> {
1237
1238
1238
1239
#[ inline]
1239
1240
fn nth ( & mut self , n : usize ) -> Option < Self :: Item > {
1240
- let ( end, overflow) = self . size . overflowing_add ( n) ;
1241
+ let ( end, overflow) = self . size . get ( ) . overflowing_add ( n) ;
1241
1242
if end > self . v . len ( ) || overflow {
1242
1243
self . v = & [ ] ;
1243
1244
None
@@ -1250,10 +1251,10 @@ impl<'a, T> Iterator for Windows<'a, T> {
1250
1251
1251
1252
#[ inline]
1252
1253
fn last ( self ) -> Option < Self :: Item > {
1253
- if self . size > self . v . len ( ) {
1254
+ if self . size . get ( ) > self . v . len ( ) {
1254
1255
None
1255
1256
} else {
1256
- let start = self . v . len ( ) - self . size ;
1257
+ let start = self . v . len ( ) - self . size . get ( ) ;
1257
1258
Some ( & self . v [ start..] )
1258
1259
}
1259
1260
}
@@ -1264,18 +1265,18 @@ impl<'a, T> Iterator for Windows<'a, T> {
1264
1265
// which means that `i` cannot overflow an `isize`, and the
1265
1266
// slice created by `from_raw_parts` is a subslice of `self.v`
1266
1267
// thus is guaranteed to be valid for the lifetime `'a` of `self.v`.
1267
- unsafe { from_raw_parts ( self . v . as_ptr ( ) . add ( idx) , self . size ) }
1268
+ unsafe { from_raw_parts ( self . v . as_ptr ( ) . add ( idx) , self . size . get ( ) ) }
1268
1269
}
1269
1270
}
1270
1271
1271
1272
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
1272
1273
impl < ' a , T > DoubleEndedIterator for Windows < ' a , T > {
1273
1274
#[ inline]
1274
1275
fn next_back ( & mut self ) -> Option < & ' a [ T ] > {
1275
- if self . size > self . v . len ( ) {
1276
+ if self . size . get ( ) > self . v . len ( ) {
1276
1277
None
1277
1278
} else {
1278
- let ret = Some ( & self . v [ self . v . len ( ) - self . size ..] ) ;
1279
+ let ret = Some ( & self . v [ self . v . len ( ) - self . size . get ( ) . .] ) ;
1279
1280
self . v = & self . v [ ..self . v . len ( ) - 1 ] ;
1280
1281
ret
1281
1282
}
@@ -1284,11 +1285,11 @@ impl<'a, T> DoubleEndedIterator for Windows<'a, T> {
1284
1285
#[ inline]
1285
1286
fn nth_back ( & mut self , n : usize ) -> Option < Self :: Item > {
1286
1287
let ( end, overflow) = self . v . len ( ) . overflowing_sub ( n) ;
1287
- if end < self . size || overflow {
1288
+ if end < self . size . get ( ) || overflow {
1288
1289
self . v = & [ ] ;
1289
1290
None
1290
1291
} else {
1291
- let ret = & self . v [ end - self . size ..end] ;
1292
+ let ret = & self . v [ end - self . size . get ( ) . .end] ;
1292
1293
self . v = & self . v [ ..end - 1 ] ;
1293
1294
Some ( ret)
1294
1295
}
0 commit comments