bencher/
macros.rs

1
2/// Defines a function called `$group_name` that returns the test description
3/// values for the listed functions `$function`.
4#[macro_export]
5macro_rules! benchmark_group {
6    ($group_name:ident, $($function:path),+) => {
7        pub fn $group_name() -> ::std::vec::Vec<$crate::TestDescAndFn> {
8            use $crate::{TestDescAndFn, TestFn, TestDesc};
9            use std::borrow::Cow;
10            let mut benches = ::std::vec::Vec::new();
11            $(
12                benches.push(TestDescAndFn {
13                    desc: TestDesc {
14                        name: Cow::from(stringify!($function)),
15                        ignore: false,
16                    },
17                    testfn: TestFn::StaticBenchFn($function),
18                });
19            )+
20            benches
21        }
22    };
23    ($group_name:ident, $($function:path,)+) => {
24        benchmark_group!($group_name, $($function),+);
25    };
26}
27
28
29/// Define a `fn main()` that will run all benchmarks defined by the groups
30/// in `$group_name`.
31///
32/// The main function will read the first argument from the console and use
33/// it to filter the benchmarks to run.
34#[macro_export]
35macro_rules! benchmark_main {
36    ($($group_name:path),+) => {
37        fn main() {
38            use $crate::TestOpts;
39            use $crate::run_tests_console;
40            let mut test_opts = TestOpts::default();
41            // check to see if we should filter:
42            if let Some(arg) = ::std::env::args().skip(1).find(|arg| *arg != "--bench") {
43                test_opts.filter = Some(arg);
44            }
45            let mut benches = Vec::new();
46            $(
47                benches.extend($group_name());
48            )+
49            run_tests_console(&test_opts, benches).unwrap();
50        }
51    };
52    ($($group_name:path,)+) => {
53        benchmark_main!($($group_name),+);
54    };
55}