@@ -204,8 +204,10 @@ pub struct ValueIterMut<'a, T> {
204
204
/// An drain iterator of all values associated with a single header name.
205
205
#[ derive( Debug ) ]
206
206
pub struct ValueDrain < ' a , T > {
207
+ raw_links : RawLinks < T > ,
208
+ extra_values : * mut Vec < ExtraValue < T > > ,
207
209
first : Option < T > ,
208
- next : Option < :: std :: vec :: IntoIter < T > > ,
210
+ next : Option < usize > ,
209
211
lt : PhantomData < & ' a mut HeaderMap < T > > ,
210
212
}
211
213
@@ -1190,16 +1192,13 @@ impl<T> HeaderMap<T> {
1190
1192
}
1191
1193
1192
1194
let raw_links = self . raw_links ( ) ;
1193
- let extra_values = & mut self . extra_values ;
1194
-
1195
- let next = links. map ( |l| {
1196
- drain_all_extra_values ( raw_links, extra_values, l. next )
1197
- . into_iter ( )
1198
- } ) ;
1195
+ let extra_values = & mut self . extra_values as * mut _ ;
1199
1196
1200
1197
ValueDrain {
1198
+ raw_links,
1199
+ extra_values,
1201
1200
first : Some ( old) ,
1202
- next : next,
1201
+ next : links . map ( |l| l . next ) ,
1203
1202
lt : PhantomData ,
1204
1203
}
1205
1204
}
@@ -1702,22 +1701,6 @@ fn remove_extra_value<T>(mut raw_links: RawLinks<T>, extra_values: &mut Vec<Extr
1702
1701
extra
1703
1702
}
1704
1703
1705
-
1706
- fn drain_all_extra_values < T > ( raw_links : RawLinks < T > , extra_values : & mut Vec < ExtraValue < T > > , mut head : usize ) -> Vec < T > {
1707
- let mut vec = Vec :: new ( ) ;
1708
- loop {
1709
- let extra = remove_extra_value ( raw_links, extra_values, head) ;
1710
- vec. push ( extra. value ) ;
1711
-
1712
- if let Link :: Extra ( idx) = extra. next {
1713
- head = idx;
1714
- } else {
1715
- break ;
1716
- }
1717
- }
1718
- vec
1719
- }
1720
-
1721
1704
impl < ' a , T > IntoIterator for & ' a HeaderMap < T > {
1722
1705
type Item = ( & ' a HeaderName , & ' a T ) ;
1723
1706
type IntoIter = Iter < ' a , T > ;
@@ -2203,17 +2186,17 @@ impl<'a, T> Iterator for Drain<'a, T> {
2203
2186
// Read the header name
2204
2187
key = ptr:: read ( & entry. key as * const _ ) ;
2205
2188
value = ptr:: read ( & entry. value as * const _ ) ;
2189
+ next = entry. links . map ( |l| l. next ) ;
2190
+
2206
2191
2207
2192
let raw_links = RawLinks ( self . entries ) ;
2208
- let extra_values = & mut * self . extra_values ;
2209
- next = entry. links . map ( |l| {
2210
- drain_all_extra_values ( raw_links, extra_values, l. next )
2211
- . into_iter ( )
2212
- } ) ;
2193
+ let extra_values = self . extra_values ;
2213
2194
2214
2195
ValueDrain {
2196
+ raw_links,
2197
+ extra_values,
2215
2198
first : Some ( value) ,
2216
- next,
2199
+ next : next ,
2217
2200
lt : PhantomData ,
2218
2201
}
2219
2202
} ;
@@ -2947,15 +2930,12 @@ impl<'a, T> OccupiedEntry<'a, T> {
2947
2930
pub fn remove_entry_mult ( self ) -> ( HeaderName , ValueDrain < ' a , T > ) {
2948
2931
let entry = self . map . remove_found ( self . probe , self . index ) ;
2949
2932
let raw_links = self . map . raw_links ( ) ;
2950
- let extra_values = & mut self . map . extra_values ;
2951
-
2952
- let next = entry. links . map ( |l| {
2953
- drain_all_extra_values ( raw_links, extra_values, l. next )
2954
- . into_iter ( )
2955
- } ) ;
2933
+ let extra_values = & mut self . map . extra_values as * mut _ ;
2956
2934
let drain = ValueDrain {
2935
+ raw_links,
2936
+ extra_values,
2957
2937
first : Some ( entry. value ) ,
2958
- next,
2938
+ next : entry . links . map ( |l| l . next ) ,
2959
2939
lt : PhantomData ,
2960
2940
} ;
2961
2941
( entry. key , drain)
@@ -3048,26 +3028,31 @@ impl<'a, T> Iterator for ValueDrain<'a, T> {
3048
3028
fn next ( & mut self ) -> Option < T > {
3049
3029
if self . first . is_some ( ) {
3050
3030
self . first . take ( )
3051
- } else if let Some ( ref mut extras) = self . next {
3052
- extras. next ( )
3031
+ } else if let Some ( next) = self . next {
3032
+ // Remove the extra value
3033
+ let extra = unsafe {
3034
+ remove_extra_value ( self . raw_links , & mut * self . extra_values , next)
3035
+ } ;
3036
+
3037
+ match extra. next {
3038
+ Link :: Extra ( idx) => self . next = Some ( idx) ,
3039
+ Link :: Entry ( _) => self . next = None ,
3040
+ }
3041
+
3042
+ Some ( extra. value )
3053
3043
} else {
3054
3044
None
3055
3045
}
3056
3046
}
3057
3047
3058
3048
fn size_hint ( & self ) -> ( usize , Option < usize > ) {
3059
- match ( & self . first , & self . next ) {
3049
+ match ( & self . first , self . next ) {
3060
3050
// Exactly 1
3061
- ( & Some ( _) , & None ) => ( 1 , Some ( 1 ) ) ,
3062
- // 1 + extras
3063
- ( & Some ( _) , & Some ( ref extras) ) => {
3064
- let ( l, u) = extras. size_hint ( ) ;
3065
- ( l + 1 , u. map ( |u| u + 1 ) )
3066
- } ,
3067
- // Extras only
3068
- ( & None , & Some ( ref extras) ) => extras. size_hint ( ) ,
3051
+ ( & Some ( _) , None ) => ( 1 , Some ( 1 ) ) ,
3052
+ // At least 1
3053
+ ( & _, Some ( _) ) => ( 1 , None ) ,
3069
3054
// No more
3070
- ( & None , & None ) => ( 0 , Some ( 0 ) ) ,
3055
+ ( & None , None ) => ( 0 , Some ( 0 ) ) ,
3071
3056
}
3072
3057
}
3073
3058
}
0 commit comments