1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36


// Count the number of arguments
// FIXME (rust-lang/rfcs#88) Remove this macro in favor of the `$#$($arg)` syntax
#[macro_export]
macro_rules! collection_count_args {
    () => { 0 };
    ($x:expr) => { 1 };
    ($head:expr, $($tail:expr),+) => { 1 + collection_count_args!($($tail),+) };
}

#[macro_export]
macro_rules! collection {
    // collection![1, 2, 3]
    ($($x:expr),*) => ({
        let mut _temp = $crate::Create::create_with_capacity(collection_count_args!($($x),*));

        $($crate::AddElementMut::add_element(&mut _temp, $x);)*

        _temp
    });
    // collection!{"I" => 1, "II" => 2}
    ($($k:expr => $v:expr),*) => ({
        let mut _temp = $crate::Create::create_with_capacity(collection_count_args!($(($k, $v)),*));

        $($crate::AddElementMut::add_element(&mut _temp, ($k, $v));)*

        _temp
    });
    ($($x:expr),+,) => {
        collection!($($x),+)
    };
    ($($k:expr => $v:expr),+,) => {
        collection!($($k => $v),+)
    };
}