@@ -53,40 +53,32 @@ where
5353
5454 #[ inline]
5555 fn next ( & mut self ) -> Option < Self :: Item > {
56- match self . iter . next ( ) {
57- None => {
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 ;
61- e
62- } else {
63- None
64- }
65- }
66- e => {
67- self . elements_from_next += 1 ;
68- e
69- }
56+ let total_consumed = self . elements_from_next + self . elements_from_next_back ;
57+
58+ if total_consumed >= self . elements_required {
59+ self . iter . next ( )
60+ } else if let Some ( e) = self . iter . next ( ) {
61+ self . elements_from_next += 1 ;
62+ Some ( e)
63+ } else {
64+ let e = ( self . filler ) ( self . elements_from_next ) ;
65+ self . elements_from_next += 1 ;
66+ Some ( e)
7067 }
7168 }
7269
7370 fn size_hint ( & self ) -> ( usize , Option < usize > ) {
74- let ( iter_lower, iter_upper) = self . iter . size_hint ( ) ;
75- let consumed = self
76- . elements_from_next
77- . saturating_add ( self . elements_from_next_back ) ;
78-
79- let total_lower = iter_lower
80- . saturating_add ( self . elements_from_next )
81- . max ( self . elements_required ) ;
82- let lower_bound = total_lower. saturating_sub ( consumed) ;
83-
84- let upper_bound = iter_upper. map ( |iter_upper| {
85- let total_upper = iter_upper
86- . saturating_add ( self . elements_from_next )
87- . max ( self . elements_required ) ;
88- total_upper. saturating_sub ( consumed)
89- } ) ;
71+ let total_consumed = self . elements_from_next + self . elements_from_next_back ;
72+
73+ if total_consumed >= self . elements_required {
74+ return self . iter . size_hint ( ) ;
75+ }
76+
77+ let elements_remaining = self . elements_required - total_consumed;
78+ let ( low, high) = self . iter . size_hint ( ) ;
79+
80+ let lower_bound = low. max ( elements_remaining) ;
81+ let upper_bound = high. map ( |h| h. max ( elements_remaining) ) ;
9082
9183 ( lower_bound, upper_bound)
9284 }
@@ -112,47 +104,33 @@ where
112104 fn next_back ( & mut self ) -> Option < Self :: Item > {
113105 let total_consumed = self . elements_from_next + self . elements_from_next_back ;
114106
115- if self . iter . len ( ) == 0 && total_consumed >= self . elements_required {
116- return None ;
107+ if total_consumed >= self . elements_required {
108+ return self . iter . next_back ( ) ;
117109 }
118110
119- let elements_remaining = self . elements_required . saturating_sub ( total_consumed) ;
111+ let elements_remaining = self . elements_required - total_consumed;
120112 self . elements_from_next_back += 1 ;
121113
122114 if self . iter . len ( ) < elements_remaining {
123115 Some ( ( self . filler ) (
124116 self . elements_required - self . elements_from_next_back ,
125117 ) )
126118 } else {
127- let e = self . iter . next_back ( ) ;
128- assert ! ( e. is_some( ) ) ;
129- e
119+ self . iter . next_back ( )
130120 }
131121 }
132122
133123 fn rfold < B , G > ( self , mut init : B , mut f : G ) -> B
134124 where
135125 G : FnMut ( B , Self :: Item ) -> B ,
136126 {
137- let PadUsing {
138- iter,
139- elements_from_next,
140- elements_from_next_back,
141- mut elements_required,
142- filler,
143- } = self ;
144- let iter_len = 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;
148- }
149-
150- let start_idx = iter_len + elements_from_next;
151- let end_idx = elements_required - elements_from_next_back;
127+ let start = self . iter . len ( ) + self . elements_from_next ;
128+ let remaining = self . elements_required . max ( start) ;
129+ let end = remaining - self . elements_from_next_back ;
152130
153- init = ( start_idx..end_idx ) . rev ( ) . map ( filler) . fold ( init, & mut f) ;
131+ init = ( start..end ) . rev ( ) . map ( self . filler ) . fold ( init, & mut f) ;
154132
155- iter. rfold ( init, f)
133+ self . iter . rfold ( init, f)
156134 }
157135}
158136
0 commit comments