@@ -10,6 +10,7 @@ use crate::intrinsics::{assume, exact_div, unchecked_sub};
1010use crate :: iter:: { FusedIterator , TrustedLen , TrustedRandomAccess } ;
1111use crate :: marker:: { PhantomData , Send , Sized , Sync } ;
1212use crate :: mem;
13+ use crate :: num:: NonZeroUsize ;
1314use crate :: ptr:: NonNull ;
1415
1516use super :: { from_raw_parts, from_raw_parts_mut} ;
@@ -1187,12 +1188,12 @@ forward_iterator! { RSplitNMut: T, &'a mut [T] }
11871188#[ stable( feature = "rust1" , since = "1.0.0" ) ]
11881189pub struct Windows < ' a , T : ' a > {
11891190 v : & ' a [ T ] ,
1190- size : usize ,
1191+ size : NonZeroUsize ,
11911192}
11921193
11931194impl < ' a , T : ' a > Windows < ' a , T > {
11941195 #[ inline]
1195- pub ( super ) fn new ( slice : & ' a [ T ] , size : usize ) -> Self {
1196+ pub ( super ) fn new ( slice : & ' a [ T ] , size : NonZeroUsize ) -> Self {
11961197 Self { v : slice, size }
11971198 }
11981199}
@@ -1211,21 +1212,21 @@ impl<'a, T> Iterator for Windows<'a, T> {
12111212
12121213 #[ inline]
12131214 fn next ( & mut self ) -> Option < & ' a [ T ] > {
1214- if self . size > self . v . len ( ) {
1215+ if self . size . get ( ) > self . v . len ( ) {
12151216 None
12161217 } else {
1217- let ret = Some ( & self . v [ ..self . size ] ) ;
1218+ let ret = Some ( & self . v [ ..self . size . get ( ) ] ) ;
12181219 self . v = & self . v [ 1 ..] ;
12191220 ret
12201221 }
12211222 }
12221223
12231224 #[ inline]
12241225 fn size_hint ( & self ) -> ( usize , Option < usize > ) {
1225- if self . size > self . v . len ( ) {
1226+ if self . size . get ( ) > self . v . len ( ) {
12261227 ( 0 , Some ( 0 ) )
12271228 } else {
1228- let size = self . v . len ( ) - self . size + 1 ;
1229+ let size = self . v . len ( ) - self . size . get ( ) + 1 ;
12291230 ( size, Some ( size) )
12301231 }
12311232 }
@@ -1237,7 +1238,7 @@ impl<'a, T> Iterator for Windows<'a, T> {
12371238
12381239 #[ inline]
12391240 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) ;
12411242 if end > self . v . len ( ) || overflow {
12421243 self . v = & [ ] ;
12431244 None
@@ -1250,10 +1251,10 @@ impl<'a, T> Iterator for Windows<'a, T> {
12501251
12511252 #[ inline]
12521253 fn last ( self ) -> Option < Self :: Item > {
1253- if self . size > self . v . len ( ) {
1254+ if self . size . get ( ) > self . v . len ( ) {
12541255 None
12551256 } else {
1256- let start = self . v . len ( ) - self . size ;
1257+ let start = self . v . len ( ) - self . size . get ( ) ;
12571258 Some ( & self . v [ start..] )
12581259 }
12591260 }
@@ -1264,18 +1265,18 @@ impl<'a, T> Iterator for Windows<'a, T> {
12641265 // which means that `i` cannot overflow an `isize`, and the
12651266 // slice created by `from_raw_parts` is a subslice of `self.v`
12661267 // 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 ( ) ) }
12681269 }
12691270}
12701271
12711272#[ stable( feature = "rust1" , since = "1.0.0" ) ]
12721273impl < ' a , T > DoubleEndedIterator for Windows < ' a , T > {
12731274 #[ inline]
12741275 fn next_back ( & mut self ) -> Option < & ' a [ T ] > {
1275- if self . size > self . v . len ( ) {
1276+ if self . size . get ( ) > self . v . len ( ) {
12761277 None
12771278 } else {
1278- let ret = Some ( & self . v [ self . v . len ( ) - self . size ..] ) ;
1279+ let ret = Some ( & self . v [ self . v . len ( ) - self . size . get ( ) . .] ) ;
12791280 self . v = & self . v [ ..self . v . len ( ) - 1 ] ;
12801281 ret
12811282 }
@@ -1284,11 +1285,11 @@ impl<'a, T> DoubleEndedIterator for Windows<'a, T> {
12841285 #[ inline]
12851286 fn nth_back ( & mut self , n : usize ) -> Option < Self :: Item > {
12861287 let ( end, overflow) = self . v . len ( ) . overflowing_sub ( n) ;
1287- if end < self . size || overflow {
1288+ if end < self . size . get ( ) || overflow {
12881289 self . v = & [ ] ;
12891290 None
12901291 } else {
1291- let ret = & self . v [ end - self . size ..end] ;
1292+ let ret = & self . v [ end - self . size . get ( ) . .end] ;
12921293 self . v = & self . v [ ..end - 1 ] ;
12931294 Some ( ret)
12941295 }
0 commit comments