#![feature(test)]
extern crate test;
use test::Bencher;

use delay_init::delay;
use std::{collections::HashMap, sync::OnceLock};

const N: usize = 10000;

delay! {
    static MAP: HashMap<u32,u32> = {
        let mut map = HashMap::new();
        map.insert(12,12);
        map
    };
}

#[bench]
fn lazy(b: &mut Bencher) {
    b.iter(|| {
        for _ in 0..N {
            assert_eq!(*MAP.get(&12).unwrap(), 12);
            assert!(MAP.get(&11).is_none());
        }
    });
}

#[bench]
fn normal(b: &mut Bencher) {
    let mut map = HashMap::new();
    map.insert(12,12);
    b.iter(|| {
        for _ in 0..N {
            assert_eq!(*map.get(&12).unwrap(), 12);
            assert!(map.get(&11).is_none());
        }
    });
}

fn get_map() -> &'static HashMap<i32,i32> {
    static CELL: OnceLock<HashMap<i32,i32>> = OnceLock::new();
    CELL.get_or_init(|| {
        let mut map = HashMap::new();
        map.insert(12,12);
        map
    })
}

#[bench]
fn stdcell(b: &mut Bencher) {
    b.iter(|| {
        for _ in 0..N {
            assert_eq!(*get_map().get(&12).unwrap(), 12);
            assert!(get_map().get(&11).is_none());
        }
    });
}