@@ -82,7 +82,9 @@ pub struct HeaderMap<T = HeaderValue> {
82
82
/// more than once if it has more than one associated value.
83
83
#[ derive( Debug ) ]
84
84
pub struct Iter < ' a , T > {
85
- inner : IterMut < ' a , T > ,
85
+ map : & ' a HeaderMap < T > ,
86
+ entry : usize ,
87
+ cursor : Option < Cursor > ,
86
88
}
87
89
88
90
/// `HeaderMap` mutable entry iterator
@@ -811,12 +813,9 @@ impl<T> HeaderMap<T> {
811
813
/// ```
812
814
pub fn iter ( & self ) -> Iter < ' _ , T > {
813
815
Iter {
814
- inner : IterMut {
815
- map : self as * const _ as * mut _ ,
816
- entry : 0 ,
817
- cursor : self . entries . first ( ) . map ( |_| Cursor :: Head ) ,
818
- lt : PhantomData ,
819
- } ,
816
+ map : self ,
817
+ entry : 0 ,
818
+ cursor : self . entries . first ( ) . map ( |_| Cursor :: Head ) ,
820
819
}
821
820
}
822
821
@@ -2078,13 +2077,47 @@ impl<'a, T> Iterator for Iter<'a, T> {
2078
2077
type Item = ( & ' a HeaderName , & ' a T ) ;
2079
2078
2080
2079
fn next ( & mut self ) -> Option < Self :: Item > {
2081
- self . inner
2082
- . next_unsafe ( )
2083
- . map ( |( key, ptr) | ( key, unsafe { & * ptr } ) )
2080
+ use self :: Cursor :: * ;
2081
+
2082
+ if self . cursor . is_none ( ) {
2083
+ if ( self . entry + 1 ) >= self . map . entries . len ( ) {
2084
+ return None ;
2085
+ }
2086
+
2087
+ self . entry += 1 ;
2088
+ self . cursor = Some ( Cursor :: Head ) ;
2089
+ }
2090
+
2091
+ let entry = & self . map . entries [ self . entry ] ;
2092
+
2093
+ match self . cursor . unwrap ( ) {
2094
+ Head => {
2095
+ self . cursor = entry. links . map ( |l| Values ( l. next ) ) ;
2096
+ Some ( ( & entry. key , & entry. value ) )
2097
+ }
2098
+ Values ( idx) => {
2099
+ let extra = & self . map . extra_values [ idx] ;
2100
+
2101
+ match extra. next {
2102
+ Link :: Entry ( _) => self . cursor = None ,
2103
+ Link :: Extra ( i) => self . cursor = Some ( Values ( i) ) ,
2104
+ }
2105
+
2106
+ Some ( ( & entry. key , & extra. value ) )
2107
+ }
2108
+ }
2084
2109
}
2085
2110
2086
2111
fn size_hint ( & self ) -> ( usize , Option < usize > ) {
2087
- self . inner . size_hint ( )
2112
+ let map = self . map ;
2113
+ debug_assert ! ( map. entries. len( ) >= self . entry) ;
2114
+
2115
+ let lower = map. entries . len ( ) - self . entry ;
2116
+ // We could pessimistically guess at the upper bound, saying
2117
+ // that its lower + map.extra_values.len(). That could be
2118
+ // way over though, such as if we're near the end, and have
2119
+ // already gone through several extra values...
2120
+ ( lower, None )
2088
2121
}
2089
2122
}
2090
2123
0 commit comments