partial-array 0.1.3

Provides potentially partially-filled arrays
Documentation
use std::sync::atomic::{AtomicUsize, Ordering};

use crate::PartialArray;

#[derive(Debug, Clone)]
struct DropCounter<'a>(&'a AtomicUsize);
impl Drop for DropCounter<'_> {
    fn drop(&mut self) {
        self.0.fetch_add(1, Ordering::Relaxed);
    }
}

#[test]
fn full() {
    let count = AtomicUsize::new(0);

    let partial_array: PartialArray<_, 4> = vec![
        DropCounter(&count),
        DropCounter(&count),
        DropCounter(&count),
        DropCounter(&count),
    ]
    .into_iter()
    .collect();
    drop(partial_array);

    assert_eq!(count.load(Ordering::Relaxed), 4);
}

#[test]
fn empty() {
    let count = AtomicUsize::new(0);

    let partial_array: PartialArray<i32, 4> = vec![].into_iter().collect();
    drop(partial_array);

    assert_eq!(count.load(Ordering::Relaxed), 0);
}

#[test]
fn partial() {
    let count = AtomicUsize::new(0);

    let partial_array: PartialArray<_, 4> = vec![DropCounter(&count), DropCounter(&count)]
        .into_iter()
        .collect();
    drop(partial_array);

    assert_eq!(count.load(Ordering::Relaxed), 2);
}

#[test]
fn iter_full() {
    let count = AtomicUsize::new(0);

    let partial_array: PartialArray<_, 4> = vec![
        DropCounter(&count),
        DropCounter(&count),
        DropCounter(&count),
        DropCounter(&count),
    ]
    .into_iter()
    .collect();
    drop(partial_array.into_iter());

    assert_eq!(count.load(Ordering::Relaxed), 4);
}

#[test]
fn iter_empty() {
    let count = AtomicUsize::new(0);

    let partial_array: PartialArray<i32, 4> = vec![].into_iter().collect();
    drop(partial_array.into_iter());

    assert_eq!(count.load(Ordering::Relaxed), 0);
}

#[test]
fn iter_partial() {
    let count = AtomicUsize::new(0);

    let partial_array: PartialArray<_, 4> = vec![DropCounter(&count), DropCounter(&count)]
        .into_iter()
        .collect();
    drop(partial_array.into_iter());

    assert_eq!(count.load(Ordering::Relaxed), 2);
}