File tree 2 files changed +33
-7
lines changed
2 files changed +33
-7
lines changed Original file line number Diff line number Diff line change @@ -707,20 +707,22 @@ impl<T> HeaderMap<T> {
707
707
. checked_add ( additional)
708
708
. ok_or_else ( MaxSizeReached :: new) ?;
709
709
710
- if cap > self . indices . len ( ) {
711
- let cap = cap
710
+ let raw_cap = to_raw_capacity ( cap) ;
711
+
712
+ if raw_cap > self . indices . len ( ) {
713
+ let raw_cap = raw_cap
712
714
. checked_next_power_of_two ( )
713
715
. ok_or_else ( MaxSizeReached :: new) ?;
714
- if cap > MAX_SIZE {
716
+ if raw_cap > MAX_SIZE {
715
717
return Err ( MaxSizeReached :: new ( ) ) ;
716
718
}
717
719
718
720
if self . entries . is_empty ( ) {
719
- self . mask = cap as Size - 1 ;
720
- self . indices = vec ! [ Pos :: none( ) ; cap ] . into_boxed_slice ( ) ;
721
- self . entries = Vec :: with_capacity ( usable_capacity ( cap ) ) ;
721
+ self . mask = raw_cap as Size - 1 ;
722
+ self . indices = vec ! [ Pos :: none( ) ; raw_cap ] . into_boxed_slice ( ) ;
723
+ self . entries = Vec :: with_capacity ( usable_capacity ( raw_cap ) ) ;
722
724
} else {
723
- self . try_grow ( cap ) ?;
725
+ self . try_grow ( raw_cap ) ?;
724
726
}
725
727
}
726
728
Original file line number Diff line number Diff line change @@ -63,6 +63,30 @@ fn reserve_overflow() {
63
63
headers. reserve ( std:: usize:: MAX ) ; // next_power_of_two overflows
64
64
}
65
65
66
+ #[ test]
67
+ fn reserve ( ) {
68
+ let mut headers = HeaderMap :: < usize > :: default ( ) ;
69
+ assert_eq ! ( headers. capacity( ) , 0 ) ;
70
+
71
+ let requested_cap = 8 ;
72
+ headers. reserve ( requested_cap) ;
73
+
74
+ let reserved_cap = headers. capacity ( ) ;
75
+ assert ! (
76
+ reserved_cap >= requested_cap,
77
+ "requested {} capacity, but it reserved only {} entries" ,
78
+ requested_cap,
79
+ reserved_cap,
80
+ ) ;
81
+
82
+ for i in 0 ..requested_cap {
83
+ let name = format ! ( "h{i}" ) . parse :: < HeaderName > ( ) . unwrap ( ) ;
84
+ headers. insert ( name, i) ;
85
+ }
86
+
87
+ assert_eq ! ( headers. capacity( ) , reserved_cap, "unexpected reallocation" ) ;
88
+ }
89
+
66
90
#[ test]
67
91
fn drain ( ) {
68
92
let mut headers = HeaderMap :: new ( ) ;
You can’t perform that action at this time.
0 commit comments