#[macro_export]
macro_rules! hashmap {
() => { std::collections::HashMap::new() };
($($key:expr => $value:expr,)+) => { hashmap!($($key => $value),+) };
($($key:expr => $value:expr),*) => {
std::collections::HashMap::from([ $(($key, $value),)* ])
};
}
#[macro_export]
macro_rules! btreemap {
() => { std::collections::BTreeMap::new() };
($($key:expr => $value:expr,)+) => { btreemap!($($key => $value),+) };
($($key:expr => $value:expr),*) => {
std::collections::BTreeMap::from([ $(($key, $value),)* ])
};
}
#[macro_export]
macro_rules! hashset {
() => { std::collections::HashSet::new() };
($($key:expr,)+) => { hashset!($($key),+) };
($($key:expr),*) => { std::collections::HashSet::from([ $($key,)* ]) };
}
#[macro_export]
macro_rules! btreeset {
() => { std::collections::BTreeSet::new() };
($($key:expr,)+) => { btreeset!($($key),+) };
($($key:expr),*) => { std::collections::BTreeSet::from([ $($key,)* ]) };
}
#[cfg(test)]
#[macro_export]
macro_rules! time {
($verbose:expr, $p:block) => {
let macro_timer = std::time::Instant::now();
$p
let elapsed = macro_timer.elapsed().as_secs_f64();
if ($verbose) { std::println!("elapsed time: {elapsed:.3} s"); }
}
}
#[macro_export]
macro_rules! s {
($arg:expr) => {{ String::from($arg) }}
}
#[cfg(test)]
mod tests {
use std::collections::{HashMap, BTreeMap, HashSet, BTreeSet};
#[test]
fn hashmap() {
let h = hashmap!(
'a' => hashmap!(
'1' => 'a',
'2' => 'A'
),
'b' => hashmap!['1' => 'b', '2' => 'B',],
'c' => hashmap!()
);
assert_eq!(h, HashMap::from([('a', HashMap::from([('1', 'a'), ('2', 'A')])), ('b', HashMap::from([('1', 'b'), ('2', 'B')])), ('c', HashMap::new())]))
}
#[test]
fn btreemap() {
let h = btreemap!(
'a' => btreemap!(
'1' => 'a',
'2' => 'A'
),
'b' => btreemap!['1' => 'b', '2' => 'B',],
'c' => btreemap!()
);
assert_eq!(h, BTreeMap::from([('a', BTreeMap::from([('1', 'a'), ('2', 'A')])), ('b', BTreeMap::from([('1', 'b'), ('2', 'B')])), ('c', BTreeMap::new())]))
}
#[test]
fn hashset() {
let h1 = hashset![1, 3, 5, 7];
let h2 = hashset!();
assert_eq!(h1, HashSet::from([1, 3, 5, 7]));
assert_eq!(h2, HashSet::<i32>::from([]));
}
#[test]
fn btreeset() {
let h1 = btreeset![1, 3, 5, 7];
let h2 = btreeset!();
assert_eq!(h1, BTreeSet::from([1, 3, 5, 7]));
assert_eq!(h2, BTreeSet::<i32>::from([]));
}
}