vsdb 13.2.0

A std-collection-like database
Documentation
use ruc::*;
use serde::{Deserialize, Serialize};
use std::ops::Bound;
use vsdb::{MapxOrd, ValueEnDe, vsdb_set_base_dir};

#[derive(Serialize, Deserialize, Default, Debug, Eq, PartialEq, Clone)]
struct SampleBlock {
    idx: usize,
    data: Vec<usize>,
}

fn gen_sample(idx: usize) -> SampleBlock {
    SampleBlock {
        idx,
        data: vec![idx],
    }
}

#[test]
fn basic_cases() {
    let cnt = 200;
    info_omit!(vsdb_set_base_dir(&format!(
        "/tmp/vsdb_testing/{}",
        rand::random::<u64>()
    )));

    let hdr = {
        let mut hdr_i = MapxOrd::new();

        (0..cnt).for_each(|i| {
            assert!(hdr_i.get(&i).is_none());
        });

        (0..cnt).map(|i| (i, gen_sample(i))).for_each(|(i, b)| {
            hdr_i.entry(&i).or_insert(b.clone());
            assert_eq!(pnk!(hdr_i.get(&i)).idx, i);
            hdr_i.remove(&i);
            assert!(hdr_i.get(&i).is_none());
            hdr_i.insert(&i, &b);
            hdr_i.insert(&i, &b);
        });

        <MapxOrd<usize, SampleBlock> as ValueEnDe>::encode(&hdr_i)
    };

    let mut reloaded = pnk!(<MapxOrd<usize, SampleBlock> as ValueEnDe>::decode(&hdr));

    (0..cnt).for_each(|i| {
        assert_eq!(i, reloaded.get(&i).unwrap().idx);
    });

    (1..cnt).for_each(|i| {
        pnk!(reloaded.get_mut(&i)).idx = 1 + i;
        assert_eq!(pnk!(reloaded.get(&i)).idx, 1 + i);
        assert!(reloaded.contains_key(&i));
        reloaded.remove(&i);
        assert!(!reloaded.contains_key(&i));
    });

    reloaded.clear();

    reloaded.insert(&1, &gen_sample(1));
    reloaded.insert(&1, &gen_sample(1));
    reloaded.insert(&10, &gen_sample(10));
    reloaded.insert(&100, &gen_sample(100));
    reloaded.insert(&1000, &gen_sample(1000));

    assert!(reloaded.range(0..1).next().is_none());

    assert_eq!(100, reloaded.range(12..999).next().unwrap().1.idx);
    assert_eq!(100, reloaded.range(12..=999).next().unwrap().1.idx);

    assert_eq!(100, reloaded.range(100..=999).next().unwrap().1.idx);
    assert!(
        reloaded
            .range((Bound::Excluded(100), Bound::Included(999)))
            .next()
            .is_none()
    );

    assert_eq!(100, reloaded.get_ge(&99).unwrap().1.idx);
    assert_eq!(100, reloaded.get_ge(&100).unwrap().1.idx);
    assert_eq!(100, reloaded.get_le(&100).unwrap().1.idx);
    assert_eq!(100, reloaded.get_le(&101).unwrap().1.idx);
}

#[test]
fn negative_int_range() {
    macro_rules! run {
        ($int: ty) => {
            let mut hdr = MapxOrd::<$int, $int>::new();
            (-50..50).for_each(|i| {
                hdr.insert(&i, &i);
            });

            hdr.range(..)
                .map(|(i, _)| i)
                .enumerate()
                .for_each(|(idx, i)| {
                    assert_eq!((idx as $int) - 50, i);
                });
        };
    }

    run!(i8);
    run!(i16);
    run!(i32);
    run!(i64);
    run!(i128);
    run!(isize);
}