#![feature(test)]

extern crate test;

extern crate backtrace;

#[cfg(feature = "std")]
use backtrace::Backtrace;

#[bench]
#[cfg(feature = "std")]
fn trace(b: &mut test::Bencher) {
    #[inline(never)]
    fn the_function() {
        backtrace::trace(|frame| {
            let ip = frame.ip();
            test::black_box(ip);
            true
        });
    }
    b.iter(the_function);
}

#[bench]
#[cfg(feature = "std")]
fn trace_and_resolve_callback(b: &mut test::Bencher) {
    #[inline(never)]
    fn the_function() {
        backtrace::trace(|frame| {
            backtrace::resolve(frame.ip(), |symbol| {
                let addr = symbol.addr();
                test::black_box(addr);
            });
            true
        });
    }
    b.iter(the_function);
}

#[bench]
#[cfg(feature = "std")]
fn trace_and_resolve_separate(b: &mut test::Bencher) {
    #[inline(never)]
    fn the_function(frames: &mut Vec<*mut std::ffi::c_void>) {
        backtrace::trace(|frame| {
            frames.push(frame.ip());
            true
        });
        frames.iter().for_each(|frame_ip| {
            backtrace::resolve(*frame_ip, |symbol| {
                test::black_box(symbol);
            });
        });
    }
    let mut frames = Vec::with_capacity(1024);
    b.iter(|| {
        the_function(&mut frames);
        frames.clear();
    });
}

#[bench]
#[cfg(feature = "std")]
fn new_unresolved(b: &mut test::Bencher) {
    #[inline(never)]
    fn the_function() {
        let bt = Backtrace::new_unresolved();
        test::black_box(bt);
    }
    b.iter(the_function);
}

#[bench]
#[cfg(feature = "std")]
fn new(b: &mut test::Bencher) {
    #[inline(never)]
    fn the_function() {
        let bt = Backtrace::new();
        test::black_box(bt);
    }
    b.iter(the_function);
}

#[bench]
#[cfg(feature = "std")]
fn new_unresolved_and_resolve_separate(b: &mut test::Bencher) {
    #[inline(never)]
    fn the_function() {
        let mut bt = Backtrace::new_unresolved();
        bt.resolve();
        test::black_box(bt);
    }
    b.iter(the_function);
}
