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
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
// :: debug macros.

// represents a debug-only string.
//
// in debug builds, this string will be included verbatim. in release builds, it will be replaced with an empty static
// string.
#[cfg(not(debug))]
#[macro_export]
macro_rules! d {
    ($value: tt) => {
        $value
    };
}
#[cfg(debug)]
#[macro_export]
macro_rules! d {
    ($value: tt) => {
        ""
    };
}


/// a macro that prints a line to stdout only in debug builds.
#[cfg(debug)]
#[macro_export]
macro_rules! dlog {
    ()             => (println!());
    ($fmt: expr)   => (println!($fmt));
    ($($arg: tt)*) => (println!($($arg)*));
}

#[cfg(not(debug))]
#[macro_export]
macro_rules! dlog {
    () => {};
    ($fmt: expr) => {};
    ($($arg: tt)*) => {};
}


// :: collection macros.

// a helper macro that returns the number of items passed to it.
#[macro_export]
macro_rules! __hina_item_count {
    (=a $($x: tt)*) => (
        ()
    );

    ($($items: expr),*) => (
        <[()]>::len(&[
            $(
                __hina_item_count![=a $items]
            ), *
        ])
    );
}

#[macro_export]
macro_rules! hash_map {
    ($($key: expr => $value: expr),* $(,)*) => ({
        let count      = __hina_item_count!($($key), *);
        let mut object = ::std::collections::HashMap::with_capacity(count);

        $(
            object.insert($key, $value);
        )*

        object
    });
}

#[macro_export]
macro_rules! btree_map {
    ($($key: expr => $value: expr),* $(,)*) => ({
        let mut object = ::std::collections::BTreeMap::new();

        $(
            object.insert($key, $value);
        )*

        object
    });
}

#[macro_export]
macro_rules! hash_set {
    ($($key: expr),* $(,)*) => ({
        let count      = __hina_item_count!($($key), *);
        let mut object = ::std::collections::HashSet::with_capacity(count);

        $(
            object.insert($key);
        )*

        object
    });
}

#[macro_export]
macro_rules! btree_set {
    ($($key: expr),* $(,)*) => ({
        let mut object = ::std::collections::BTreeSet::new();

        $(
            object.insert($key);
        )*

        object
    });
}