@@ -379,3 +379,77 @@ macro_rules! dbg {
379
379
($($crate::dbg!($val)),+,)
380
380
};
381
381
}
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