@@ -379,3 +379,77 @@ macro_rules! dbg {
379379        ( $( $crate:: dbg!( $val) ) ,+, ) 
380380    } ; 
381381} 
382+ 
383+ #[ doc( hidden) ]  
384+ #[ macro_export]  
385+ #[ allow_internal_unstable( hash_map_internals) ]  
386+ #[ unstable( feature = "hash_map_internals" ,  issue = "none" ) ]  
387+ macro_rules!  repetition_utils { 
388+     ( @count $( $tokens: tt) ,* )  => { { 
389+         [ $( $crate:: repetition_utils!( @replace $tokens => ( ) ) ) ,* ] . len( ) 
390+     } } ; 
391+ 
392+     ( @replace $x: tt => $y: tt)  => {  $y } 
393+ } 
394+ 
395+ /// Creates a [`HashMap`] containing the arguments. 
396+ /// 
397+ /// `hash_map!` allows specifying the entries that make 
398+ /// up the [`HashMap`] where the key and value are separated by a `=>`. 
399+ /// 
400+ /// The entries are separated by commas with a trailing comma being allowed. 
401+ /// 
402+ /// It is semantically equivalent to using repeated [`HashMap::insert`] 
403+ /// on a newly created hashmap. 
404+ /// 
405+ /// `hash_map!` will attempt to avoid repeated reallocations by 
406+ /// using [`HashMap::with_capacity`]. 
407+ /// 
408+ /// # Examples 
409+ /// 
410+ /// ```rust 
411+ /// #![feature(hash_map_macro)] 
412+ /// 
413+ /// let map = hash_map! { 
414+ ///     "key" => "value", 
415+ ///     "key1" => "value1" 
416+ /// }; 
417+ /// 
418+ /// assert_eq!(map.get("key"), Some(&"value")); 
419+ /// assert_eq!(map.get("key1"), Some(&"value1")); 
420+ /// assert!(map.get("brrrrrrooooommm").is_none()); 
421+ /// ``` 
422+ /// 
423+ /// And with a trailing comma 
424+ /// 
425+ ///```rust 
426+ /// #![feature(hash_map_macro)] 
427+ /// 
428+ /// let map = hash_map! { 
429+ ///     "key" => "value", // notice the , 
430+ /// }; 
431+ /// 
432+ /// assert_eq!(map.get("key"), Some(&"value")); 
433+ /// ``` 
434+ /// 
435+ /// The key and value are moved into the HashMap. 
436+ /// 
437+ /// [`HashMap`]: crate::collections::HashMap 
438+ /// [`HashMap::insert`]: crate::collections::HashMap::insert 
439+ /// [`HashMap::with_capacity`]: crate::collections::HashMap::with_capacity 
440+ #[ macro_export]  
441+ #[ allow_internal_unstable( hash_map_internals) ]  
442+ #[ unstable( feature = "hash_map_macro" ,  issue = "144032" ) ]  
443+ macro_rules!  hash_map { 
444+     ( )  => { { 
445+         $crate:: collections:: HashMap :: new( ) 
446+     } } ; 
447+ 
448+     (  $(  $key: expr => $value: expr ) ,*  $( , ) ? )  => { { 
449+         let  mut  map = $crate:: collections:: HashMap :: with_capacity( 
450+             const  {  $crate:: repetition_utils!( @count $( $key) ,* )  } 
451+         ) ; 
452+         $(  map. insert( $key,  $value) ;  ) * 
453+         map
454+     } } 
455+ } 
0 commit comments