@@ -10,32 +10,36 @@ use std::iter::{Fuse, FusedIterator};
1010#[ must_use = "iterator adaptors are lazy and do nothing unless consumed" ]
1111pub struct PadUsing < I , F > {
1212 iter : Fuse < I > ,
13- min : usize ,
14- pos : usize ,
15- back : usize ,
16- total_len : usize ,
13+ elements_from_next : usize ,
14+ elements_from_next_back : usize ,
15+ elements_required : usize ,
1716 filler : F ,
1817}
1918
2019impl < I , F > std:: fmt:: Debug for PadUsing < I , F >
2120where
2221 I : std:: fmt:: Debug ,
2322{
24- debug_fmt_fields ! ( PadUsing , iter, min, pos, back, total_len) ;
23+ debug_fmt_fields ! (
24+ PadUsing ,
25+ iter,
26+ elements_from_next,
27+ elements_from_next_back,
28+ elements_required
29+ ) ;
2530}
2631
2732/// Create a new `PadUsing` iterator.
28- pub fn pad_using < I , F > ( iter : I , min : usize , filler : F ) -> PadUsing < I , F >
33+ pub fn pad_using < I , F > ( iter : I , elements_required : usize , filler : F ) -> PadUsing < I , F >
2934where
3035 I : Iterator ,
3136 F : FnMut ( usize ) -> I :: Item ,
3237{
3338 PadUsing {
3439 iter : iter. fuse ( ) ,
35- min,
36- pos : 0 ,
37- back : 0 ,
38- total_len : min,
40+ elements_from_next : 0 ,
41+ elements_from_next_back : 0 ,
42+ elements_required,
3943 filler,
4044 }
4145}
@@ -51,30 +55,36 @@ where
5155 fn next ( & mut self ) -> Option < Self :: Item > {
5256 match self . iter . next ( ) {
5357 None => {
54- if self . pos + self . back < self . total_len {
55- let e = Some ( ( self . filler ) ( self . pos ) ) ;
56- self . pos += 1 ;
58+ if self . elements_from_next + self . elements_from_next_back < self . elements_required {
59+ let e = Some ( ( self . filler ) ( self . elements_from_next ) ) ;
60+ self . elements_from_next += 1 ;
5761 e
5862 } else {
5963 None
6064 }
6165 }
6266 e => {
63- self . pos += 1 ;
67+ self . elements_from_next += 1 ;
6468 e
6569 }
6670 }
6771 }
6872
6973 fn size_hint ( & self ) -> ( usize , Option < usize > ) {
7074 let ( iter_lower, iter_upper) = self . iter . size_hint ( ) ;
71- let consumed = self . pos . saturating_add ( self . back ) ;
75+ let consumed = self
76+ . elements_from_next
77+ . saturating_add ( self . elements_from_next_back ) ;
7278
73- let total_lower = iter_lower. saturating_add ( self . pos ) . max ( self . min ) ;
79+ let total_lower = iter_lower
80+ . saturating_add ( self . elements_from_next )
81+ . max ( self . elements_required ) ;
7482 let lower_bound = total_lower. saturating_sub ( consumed) ;
7583
7684 let upper_bound = iter_upper. map ( |iter_upper| {
77- let total_upper = iter_upper. saturating_add ( self . pos ) . max ( self . min ) ;
85+ let total_upper = iter_upper
86+ . saturating_add ( self . elements_from_next )
87+ . max ( self . elements_required ) ;
7888 total_upper. saturating_sub ( consumed)
7989 } ) ;
8090
@@ -85,12 +95,12 @@ where
8595 where
8696 G : FnMut ( B , Self :: Item ) -> B ,
8797 {
88- let mut pos = self . pos ;
98+ let mut pos = self . elements_from_next ;
8999 init = self . iter . fold ( init, |acc, item| {
90100 pos += 1 ;
91101 f ( acc, item)
92102 } ) ;
93- ( pos..self . min ) . map ( self . filler ) . fold ( init, f)
103+ ( pos..self . elements_required ) . map ( self . filler ) . fold ( init, f)
94104 }
95105}
96106
@@ -100,25 +110,23 @@ where
100110 F : FnMut ( usize ) -> I :: Item ,
101111{
102112 fn next_back ( & mut self ) -> Option < Self :: Item > {
103- let current_iter_len = self . iter . len ( ) ;
104- let original_iter_len = current_iter_len. saturating_add ( self . pos ) ;
105- if self . total_len < original_iter_len {
106- self . total_len = original_iter_len;
107- }
113+ let total_consumed = self . elements_from_next + self . elements_from_next_back ;
108114
109- if self . pos + self . back >= self . total_len {
115+ if self . iter . len ( ) == 0 && total_consumed >= self . elements_required {
110116 return None ;
111117 }
112118
113- let padding_count = self . total_len . saturating_sub ( current_iter_len + self . pos ) ;
119+ let elements_remaining = self . elements_required . saturating_sub ( total_consumed) ;
120+ self . elements_from_next_back += 1 ;
114121
115- if self . back < padding_count {
116- let idx = self . total_len - self . back - 1 ;
117- self . back += 1 ;
118- Some ( ( self . filler ) ( idx ) )
122+ if self . iter . len ( ) < elements_remaining {
123+ Some ( ( self . filler ) (
124+ self . elements_required - self . elements_from_next_back ,
125+ ) )
119126 } else {
120- self . back += 1 ;
121- self . iter . next_back ( )
127+ let e = self . iter . next_back ( ) ;
128+ assert ! ( e. is_some( ) ) ;
129+ e
122130 }
123131 }
124132
@@ -128,20 +136,19 @@ where
128136 {
129137 let PadUsing {
130138 iter,
131- min : _,
132- pos,
133- back,
134- mut total_len,
139+ elements_from_next,
140+ elements_from_next_back,
141+ mut elements_required,
135142 filler,
136143 } = self ;
137144 let iter_len = iter. len ( ) ;
138- let original_iter_len = iter_len. saturating_add ( pos ) ;
139- if total_len < original_iter_len {
140- total_len = original_iter_len;
145+ let original_iter_len = iter_len. saturating_add ( elements_from_next ) ;
146+ if elements_required < original_iter_len {
147+ elements_required = original_iter_len;
141148 }
142149
143- let start_idx = iter_len + pos ;
144- let end_idx = total_len - back ;
150+ let start_idx = iter_len + elements_from_next ;
151+ let end_idx = elements_required - elements_from_next_back ;
145152
146153 init = ( start_idx..end_idx) . rev ( ) . map ( filler) . fold ( init, & mut f) ;
147154
0 commit comments