@@ -299,7 +299,8 @@ impl<K: Eq, V> Into<Vec<(K, V)>> for LinearMap<K, V> {
299
299
}
300
300
}
301
301
302
- /// Creates a `LinearMap` from a list of key-value pairs.
302
+ /// Creates a `LinearMap` from a list of key-value pairs. The created
303
+ /// `LinearMap` has a capacity set to the number of entries provided.
303
304
///
304
305
/// ## Example
305
306
///
@@ -318,11 +319,13 @@ impl<K: Eq, V> Into<Vec<(K, V)>> for LinearMap<K, V> {
318
319
/// ```
319
320
#[ macro_export]
320
321
macro_rules! linear_map {
321
- // trailing comma case
322
- ( $( $key: expr => $value: expr, ) +) => ( linear_map!( $( $key => $value) ,+) ) ;
323
- ( $( $key: expr => $value: expr) ,* ) => {
322
+ ( @single $( $x: tt) * ) => ( ( ) ) ;
323
+ ( @count $( $rest: expr) ,* ) => ( <[ ( ) ] >:: len( & [ $( linear_map!( @single $rest) ) ,* ] ) ) ;
324
+ ( $( $key: expr => $value: expr, ) +) => { linear_map!( $( $key => $value) ,+) } ;
325
+ ( $( $key: expr => $value: expr) ,* ) => {
324
326
{
325
- let mut _map = $crate:: LinearMap :: new( ) ;
327
+ let _cap = linear_map!( @count $( $key) ,* ) ;
328
+ let mut _map = $crate:: LinearMap :: with_capacity( _cap) ;
326
329
$(
327
330
_map. insert( $key, $value) ;
328
331
) *
@@ -896,12 +899,14 @@ mod test {
896
899
2 => "two" ,
897
900
} ;
898
901
assert_eq ! ( names. len( ) , 2 ) ;
902
+ assert_eq ! ( names. capacity( ) , 2 ) ;
899
903
assert_eq ! ( names[ & 1 ] , "one" ) ;
900
904
assert_eq ! ( names[ & 2 ] , "two" ) ;
901
905
assert_eq ! ( names. get( & 3 ) , None ) ;
902
906
903
907
let empty: LinearMap < i32 , i32 > = linear_map ! { } ;
904
908
assert_eq ! ( empty. len( ) , 0 ) ;
909
+ assert_eq ! ( empty. capacity( ) , 0 ) ;
905
910
906
911
let _nested_compiles = linear_map ! {
907
912
1 => linear_map!{ 0 => 1 + 2 , } ,
0 commit comments