o3 0.3.0

shared-nothing primitives
Documentation
use o3::buffer::{Owned, Shared};

#[cfg(target_pointer_width = "64")]
#[test]
fn buffer_handles_stay_thin() {
    assert_eq!(size_of::<Owned>(), 24);
    assert_eq!(size_of::<Shared>(), 24);
}

#[test]
fn vector_backed_storage_preserves_allocation_and_bytes() {
    let owned_vec = b"abc".to_vec();
    let owned_ptr = owned_vec.as_ptr();
    let mut owned = Owned::from(owned_vec);
    let shared_vec = b"def".to_vec();
    let shared_ptr = shared_vec.as_ptr();
    let shared = Shared::from(shared_vec);
    assert_eq!(owned.as_slice(), b"abc");
    assert_eq!(shared.as_slice(), b"def");
    assert_eq!(owned.as_ptr(), owned_ptr);
    assert_eq!(shared.as_ptr(), shared_ptr);
    owned.reserve(32);
    owned.extend_from_slice(b"45678");
    let head = owned.split_to(3);
    let tail = owned.split_off(2);
    assert_eq!(head.as_slice(), b"abc");
    assert_eq!(owned.as_slice(), b"45");
    assert_eq!(tail.as_slice(), b"678");
}

#[test]
fn native_storage_freezes_and_splits_without_copying() {
    let mut frozen = Owned::new();
    assert!(frozen.is_empty());
    assert_eq!(frozen.capacity(), 0);
    frozen.reserve(0);
    frozen.extend_from_slice(b"hello world");
    let frozen_ptr = frozen.as_ptr();
    let frozen = frozen.freeze();
    assert_eq!(frozen.as_ptr(), frozen_ptr);
    assert_eq!(frozen.as_slice(), b"hello world");
    assert_eq!(frozen.clone().as_slice(), b"hello world");

    let mut value = Owned::with_capacity(64);
    value.extend_from_slice(b"abcdefgh");
    let head = value.split_to(3);
    assert_eq!(head.capacity(), 64);
    assert_eq!(value.capacity(), 5);
    assert_eq!(head.as_slice(), b"abc");
    assert_eq!(value.as_slice(), b"defgh");
    let tail = value.split_off(2);
    assert_eq!(value.as_slice(), b"de");
    assert_eq!(tail.as_slice(), b"fgh");

    let mut reusable = Owned::with_capacity(16);
    reusable.extend_from_slice(b"first");
    let split_ptr = reusable.as_ptr();
    let first: Shared = reusable.split();
    assert_eq!(first.as_ptr(), split_ptr);
    assert_eq!(first.as_slice(), b"first");
    assert!(reusable.is_empty());

    reusable.extend_from_slice(b"second");
    let second: Shared = reusable.freeze();
    assert_eq!(second.as_slice(), b"second");
}

#[test]
fn spare_writer_commits_initialized_storage() {
    let mut o = Owned::with_capacity(8);
    let mut spare = o.spare_writer();
    assert_eq!(spare.capacity(), 8);
    spare.try_extend_from_slice(b"xyz").unwrap();
    spare.finish();
    assert_eq!(o.as_slice(), b"xyz");

    let mut owned = Owned::with_capacity(8);
    let mut writer = owned.spare_writer();
    let ptr = writer.as_mut_ptr();
    unsafe { std::ptr::copy_nonoverlapping(b"raw".as_ptr(), ptr, 3) };
    let initialized = unsafe { std::slice::from_raw_parts(ptr, 3) };
    writer.try_commit_initialized(initialized).unwrap();
    assert_eq!(writer.finish(), 3);
    assert_eq!(owned.as_slice(), b"raw");
}

#[test]
fn writer_commits_initialized_bytes() {
    let mut owned = Owned::copy_from_slice(b"head");
    let mut writer = owned.writer(8);
    writer.extend_from_slice(b" body");
    writer.push(b'!');
    assert_eq!(writer.finish(), 6);
    assert_eq!(owned.as_slice(), b"head body!");
}