arrayset 3.1.1

An array-backed ordered set type.
Documentation
use crate::OrdSet;
use core::cell::Cell;

#[test]
fn test_simple() {
    let mut set: OrdSet<u8, 4> = Default::default();

    assert_eq!(set.len(), 0);
    assert!(set.is_empty());
    assert_eq!(set.insert(5), Ok(None));
    assert_eq!(set.insert(5), Ok(Some(5)));
    assert_eq!(set.len(), 1);
    assert!(!set.is_empty());
    assert_eq!(set.insert(2), Ok(None));
    assert_eq!(set.insert(8), Ok(None));
    assert_eq!(set.insert(9), Ok(None));
    assert_eq!(set.len(), 4);
    assert_eq!(set.insert(4), Err(4));
    assert_eq!(set.len(), 4);
    assert_eq!(set.remove(&3), None);
    assert_eq!(set.len(), 4);
    assert_eq!(set.remove(&5), Some(5));
    assert_eq!(set.len(), 3);
    assert_eq!(set.insert(4), Ok(None));
    assert_eq!(set.len(), 4);
    assert_eq!(set.pop_last(), Some(9));
    assert_eq!(set.len(), 3);
    assert_eq!(set.first(), Some(&2));
    assert_eq!(set.len(), 3);
    assert_eq!(set.pop_first(), Some(2));
    assert_eq!(set.len(), 2);
    assert_eq!(set.pop_last(), Some(8));
    assert_eq!(set.len(), 1);
    assert!(!set.is_empty());
    assert_eq!(set.pop_last(), Some(4));
    assert!(set.is_empty());
    assert_eq!(set.len(), 0);
    assert_eq!(set.pop_last(), None);
    assert_eq!(set.pop_first(), None);
    assert_eq!(set.last(), None);
    assert_eq!(set.first(), None);

    let mut set: OrdSet<u8, 6> = OrdSet::from([1, 2, 3, 4, 5, 5, 6, 6]);
    set.retain(|&k| k % 2 == 0);
    assert!(set.iter().eq([2, 4, 6].iter()));
}

#[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 set: OrdSet<_, 4> = Default::default();
    assert_eq!(set.insert(Value::new(4, &drop_counter)), Ok(None));
    assert_eq!(drop_counter.get(), 0);
    assert!(matches!(
        set.insert(Value::new(4, &drop_counter)),
        Ok(Some(_))
    ));
    assert_eq!(drop_counter.get(), 1);
    assert_eq!(set.insert(Value::new(6, &drop_counter)), Ok(None));
    assert_eq!(set.insert(Value::new(5, &drop_counter)), Ok(None));
    assert_eq!(drop_counter.get(), 1);
    let removed = set.remove(&Value::new(5, &drop_counter)).unwrap();
    assert_eq!(drop_counter.get(), 2);
    drop(removed);
    assert_eq!(drop_counter.get(), 3);
    set.clear();
    assert_eq!(drop_counter.get(), 5);
    assert_eq!(set.insert(Value::new(4, &drop_counter)), Ok(None));
    assert_eq!(set.insert(Value::new(2, &drop_counter)), Ok(None));
    assert_eq!(set.insert(Value::new(8, &drop_counter)), Ok(None));
    assert_eq!(set.insert(Value::new(5, &drop_counter)), Ok(None));
    assert_eq!(drop_counter.get(), 5);
    assert!(matches!(set.insert(Value::new(3, &drop_counter)), Err(_)));
    assert_eq!(drop_counter.get(), 6);
    drop(set);
    assert_eq!(drop_counter.get(), 10);
    let mut set: OrdSet<_, 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: OrdSet<_, 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);
}

#[test]
fn test_comparisons() {
    let mut left: OrdSet<u8, 4> = Default::default();
    let mut right: OrdSet<u8, 20> = Default::default();
    assert_eq!(left.insert(5), Ok(None));
    assert_eq!(left.insert(8), Ok(None));
    assert_eq!(left.insert(6), Ok(None));
    assert_eq!(right.insert(10), Ok(None));
    assert_eq!(right.insert(6), Ok(None));
    assert_eq!(right.insert(3), Ok(None));

    assert!(left.union(&right).copied().eq([3u8, 5, 6, 8, 10]));
    assert!(left.difference(&right).copied().eq([5u8, 8]));
    assert!(right.difference(&left).copied().eq([3u8, 10]));
    assert!(right.intersection(&left).copied().eq([6u8]));
    assert!(left
        .symmetric_difference(&right)
        .copied()
        .eq([3u8, 5, 8, 10]));
}