vecpool 0.1.0

Thread-local pool of reusable Vec buffers with cross-type reuse
Documentation
use std::sync::Arc;
use vecpool::get;

#[test]
fn buffer_reuse() {
    let mut v = get::<u32>();
    v.push(1);
    v.push(2);
    v.push(3);
    drop(v);

    let v2 = get::<u32>();
    assert!(v2.capacity() > 0);
}

#[test]
fn cross_type_reuse() {
    let mut v = get::<i32>();
    v.push(1);
    v.push(2);
    drop(v);

    let v2 = get::<u32>();
    assert!(v2.capacity() > 0);
}

#[test]
fn no_cross_layout_reuse() {
    let mut v = get::<u8>();
    v.push(1);
    v.push(2);
    drop(v);

    let v2 = get::<u32>();
    assert_eq!(v2.capacity(), 0);
}

#[test]
fn zst_handling() {
    let mut v = get::<()>();
    v.push(());
    v.push(());
    drop(v);

    let mut v2 = get::<()>();
    v2.push(());
}

#[test]
fn deref_deref_mut() {
    let mut v = get::<u32>();
    v.push(10);
    v.push(20);
    assert_eq!(v.len(), 2);
    assert_eq!(v[0], 10);
    assert_eq!(v[1], 20);
}

#[test]
fn debug_impl() {
    let mut v = get::<u32>();
    v.push(1);
    v.push(2);
    let s = format!("{:?}", v);
    assert_eq!(s, "[1, 2]");
}

#[test]
fn drop_clears_elements() {
    let arc = Arc::new(42);
    {
        let mut v = get::<Arc<i32>>();
        v.push(arc.clone());
        v.push(arc.clone());
    }
    assert_eq!(Arc::strong_count(&arc), 1);
}

#[test]
fn with_capacity_reuses_large_enough_buffer() {
    let mut v = vecpool::get::<u32>();
    for i in 0..200 {
        v.push(i);
    }
    let cap = v.capacity();
    drop(v);

    let v2 = vecpool::with_capacity::<u32>(100);
    assert!(v2.capacity() >= 100);
    assert_eq!(v2.capacity(), cap);
}

#[test]
fn with_capacity_allocates_fresh_if_pool_too_small() {
    // Ensure pool has a small buffer
    let mut v = vecpool::get::<u32>();
    v.push(1);
    drop(v);

    let v2 = vecpool::with_capacity::<u32>(1000);
    assert!(v2.capacity() >= 1000);
}

#[test]
fn pool_vec_new() {
    let mut v = vecpool::PoolVec::<u32>::new();
    v.push(42);
    assert_eq!(v[0], 42);
}

#[test]
fn into_iterator() {
    let mut v = vecpool::get::<u32>();
    v.push(1);
    v.push(2);
    v.push(3);

    let collected: Vec<u32> = v.into_iter().collect();
    assert_eq!(collected, vec![1, 2, 3]);
}

#[test]
fn from_vec() {
    let original = vec![10u32, 20, 30];
    let pooled = vecpool::PoolVec::from(original);
    assert_eq!(pooled.len(), 3);
    assert_eq!(pooled[0], 10);
    // On drop, buffer goes to pool
    let cap = pooled.capacity();
    drop(pooled);

    let reused = vecpool::get::<u32>();
    assert_eq!(reused.capacity(), cap);
}

#[test]
fn clear_pool_frees_buffers() {
    let mut v = vecpool::get::<u32>();
    v.push(1);
    drop(v);

    vecpool::clear_pool();

    // After clearing, next get should have no capacity (fresh vec)
    let v2 = vecpool::get::<u32>();
    assert_eq!(v2.capacity(), 0);
}

#[test]
fn from_iterator() {
    let pooled: vecpool::PoolVec<u32> = (0..100).collect();
    assert_eq!(pooled.len(), 100);
    assert_eq!(pooled[0], 0);
    assert_eq!(pooled[99], 99);
}