arrayset 3.1.1

An array-backed ordered set type.
Documentation
extern crate alloc;

use crate::OrdMap;
use alloc::string::String;
use core::cell::Cell;

#[test]
fn test_simple() {
    let mut map: OrdMap<String, String, 4> = Default::default();
    assert_eq!(map.len(), 0);
    assert_eq!(map.insert("Richberger".into(), "Taylor".into()), Ok(None));
    assert_eq!(
        map.insert("Richberger".into(), "Harpo".into()),
        Ok(Some((String::from("Richberger"), String::from("Harpo"))))
    );
    assert_eq!(
        map.replace("Richberger".into(), "Groucho".into()),
        Ok(Some((String::from("Richberger"), String::from("Taylor"))))
    );
    assert_eq!(map.get("Richberger"), Some(&String::from("Groucho")));
    assert_eq!(&map["Richberger"], &String::from("Groucho"));
    assert_eq!(map.len(), 1);
    *map.get_mut("Richberger").unwrap() = String::from("Taylor");
    assert_eq!(map.get("Richberger"), Some(&String::from("Taylor")));
    assert_eq!(map["Richberger"], String::from("Taylor"));
}

#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
struct Value<'a> {
    value: u8,
    drop_counter: &'a Cell<u8>,
}

impl<'a> Value<'a> {
    fn new(value: u8, drop_counter: &'a Cell<u8>) -> Self {
        Self {
            value,
            drop_counter,
        }
    }
}

impl<'a> Drop for Value<'a> {
    fn drop(&mut self) {
        self.drop_counter.set(self.drop_counter.get() + 1);
    }
}

#[test]
fn test_drop() {
    let drop_counter = Cell::new(0u8);
    let mut map: OrdMap<_, (), 4> = Default::default();
    assert_eq!(map.insert(Value::new(4, &drop_counter), ()), Ok(None));
    assert_eq!(drop_counter.get(), 0);
    assert!(matches!(
        map.insert(Value::new(4, &drop_counter), ()),
        Ok(Some(_))
    ));
    assert_eq!(drop_counter.get(), 1);
    assert_eq!(map.insert(Value::new(6, &drop_counter), ()), Ok(None));
    assert_eq!(map.insert(Value::new(5, &drop_counter), ()), Ok(None));
    assert_eq!(drop_counter.get(), 1);
    let removed = map.remove(&Value::new(5, &drop_counter)).unwrap();
    assert_eq!(drop_counter.get(), 2);
    drop(removed);
    assert_eq!(drop_counter.get(), 3);
    map.clear();
    assert_eq!(drop_counter.get(), 5);
    assert_eq!(map.insert(Value::new(4, &drop_counter), ()), Ok(None));
    assert_eq!(map.insert(Value::new(2, &drop_counter), ()), Ok(None));
    assert_eq!(map.insert(Value::new(8, &drop_counter), ()), Ok(None));
    assert_eq!(map.insert(Value::new(5, &drop_counter), ()), Ok(None));
    assert_eq!(drop_counter.get(), 5);
    assert!(matches!(
        map.insert(Value::new(3, &drop_counter), ()),
        Err(_)
    ));
    assert_eq!(drop_counter.get(), 6);
    drop(map);
    assert_eq!(drop_counter.get(), 10);
    let mut set: OrdMap<_, (), 6> = Default::default();
    assert_eq!(set.insert(Value::new(1, &drop_counter), ()), Ok(None));
    assert_eq!(set.insert(Value::new(2, &drop_counter), ()), Ok(None));
    assert_eq!(set.insert(Value::new(3, &drop_counter), ()), Ok(None));
    assert_eq!(set.insert(Value::new(4, &drop_counter), ()), Ok(None));
    assert_eq!(set.insert(Value::new(5, &drop_counter), ()), Ok(None));
    assert_eq!(set.insert(Value::new(6, &drop_counter), ()), Ok(None));
    set.retain(|k, ()| k.value % 2 == 0);
    assert_eq!(drop_counter.get(), 13);
    drop(set);
    assert_eq!(drop_counter.get(), 16);
    let mut set: OrdMap<_, (), 6> = Default::default();
    assert_eq!(set.insert(Value::new(1, &drop_counter), ()), Ok(None));
    assert_eq!(set.insert(Value::new(2, &drop_counter), ()), Ok(None));
    assert_eq!(set.insert(Value::new(3, &drop_counter), ()), Ok(None));
    assert_eq!(set.insert(Value::new(4, &drop_counter), ()), Ok(None));
    assert_eq!(set.insert(Value::new(5, &drop_counter), ()), Ok(None));
    assert_eq!(set.insert(Value::new(6, &drop_counter), ()), Ok(None));
    assert_eq!(drop_counter.get(), 16);
    for (value, ()) in set {
        assert_eq!(drop_counter.get(), 16);
        assert_eq!(value.value, 1);
        drop(value);
        assert_eq!(drop_counter.get(), 17);
        break;
    }

    assert_eq!(drop_counter.get(), 22);
}