o3 0.3.0

shared-nothing primitives
Documentation
use o3::buffer::{OwnedView, Shared, SharedPool, View};

#[cfg(target_pointer_width = "64")]
#[test]
fn owned_view_stays_compact() {
    assert_eq!(std::mem::size_of::<OwnedView>(), 32);
}

#[test]
fn view_preserves_borrowed_and_shared_ranges() {
    let borrowed = View::from_slice(b"abcdef").slice(1..5).slice(1..3);
    assert_eq!(borrowed.as_slice(), b"cd");
    assert_eq!(borrowed.into_shared().as_slice(), b"cd");

    let shared = Shared::copy_from_slice(b"012345");
    let view = View::from_shared_range(shared.clone(), 1..5).slice(1..3);
    assert_eq!(view.as_slice(), b"23");
    assert_eq!(view.into_shared().as_slice(), b"23");
    assert_eq!(shared.as_slice(), b"012345");

    let caught = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {
        shared.slice((
            std::ops::Bound::Excluded(usize::MAX),
            std::ops::Bound::Unbounded,
        ))
    }));
    assert!(caught.is_err());
    let caught =
        std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| shared.slice(..=usize::MAX)));
    assert!(caught.is_err());
}

#[test]
fn owned_view_retains_pooled_storage() {
    let pool = SharedPool::new(1, 8);
    let mut lease = pool.try_acquire().unwrap();
    lease.spare_writer().try_extend_from_slice(b"abcd").unwrap();
    let pooled = lease.freeze();
    let ptr = pooled.as_slice().as_ptr();
    let mut view = View::from_pooled(pooled).into_owned();

    assert_eq!(view.as_slice().as_ptr(), ptr);
    assert_eq!(pool.available(), 0);
    view.advance(1);
    assert_eq!(view.as_slice(), b"bcd");
    assert_eq!(view.as_slice().as_ptr(), ptr.wrapping_add(1));

    drop(view);
    assert_eq!(pool.available(), 1);
}

#[test]
fn owned_view_slices_without_copying() {
    let pool = SharedPool::new(1, 8);
    let mut lease = pool.try_acquire().unwrap();
    lease
        .spare_writer()
        .try_extend_from_slice(b"abcdef")
        .unwrap();
    let ptr = lease.as_slice().as_ptr();
    let view = View::from_pooled(lease.freeze()).into_owned().slice(2..5);

    assert_eq!(view.as_slice(), b"cde");
    assert_eq!(view.as_slice().as_ptr(), ptr.wrapping_add(2));
    assert_eq!(pool.available(), 0);
    drop(view);
    assert_eq!(pool.available(), 1);
}