fring 0.4.0

Lightweight, no_std, and *fast* ring buffer
Documentation
use fring::Buffer;

#[test]
fn read_and_write() {
    let mut b: Buffer<u8, 2> = Buffer::new();
    let (mut p, mut c) = b.split();
    let mut w = p.write(usize::MAX);
    assert!(w.len() == 2);
    w[0] = 22;
    w[1] = 23;
    let r = c.read(usize::MAX);
    assert!(r.len() == 0);
    drop(w);
    drop(r);
    let r = c.read(usize::MAX);
    assert!(r.len() == 2);
    assert!(r[0] == 22);
    assert!(r[1] == 23);
}

#[test]
fn producer_consumer() {
    let b: Buffer<u8, 2> = Buffer::new();
    let mut p = unsafe { b.producer() };
    let mut c = unsafe { b.consumer() };
    p.write(1)[0] = 22;
    assert!(c.read(1)[0] == 22);
}

#[test]
fn wrap_around() {
    let mut b: Buffer<u8, 32> = Buffer::new();
    let (mut p, mut c) = b.split();
    for i in 0..33 {
        let w = p.write(i);
        let mut len = w.len();
        drop(w);
        if len != i {
            let w = p.write(i - len);
            len += w.len();
        }
        assert!(len == i);
        let r = c.read(usize::MAX);
        let mut len = r.len();
        drop(r);
        if len != i {
            let r = c.read(usize::MAX);
            len += r.len();
        }
        assert!(len == i);
    }
}

#[test]
fn flush() {
    let mut b: Buffer<u8, 8> = Buffer::new();
    let (mut p, mut c) = b.split();
    p.write(5);
    c.flush();
    assert!(c.read(usize::MAX).len() == 0);
}

#[test]
fn empty_size() {
    let mut b: Buffer<u8, 8> = Buffer::new();
    let (mut p, mut c) = b.split();
    assert!(p.empty_size() == 8);
    p.write(5);
    assert!(p.empty_size() == 3);
    p.write(5);
    assert!(p.empty_size() == 0);
    c.read(5);
    assert!(p.empty_size() == 5);
    c.read(5);
    assert!(p.empty_size() == 8);
}

#[test]
fn data_size() {
    let mut b: Buffer<u8, 8> = Buffer::new();
    let (mut p, mut c) = b.split();
    assert!(c.data_size() == 0);
    p.write(5);
    assert!(c.data_size() == 5);
    p.write(5);
    assert!(c.data_size() == 8);
    c.read(5);
    assert!(c.data_size() == 3);
    c.read(5);
    assert!(c.data_size() == 0);
}

#[test]
fn consume() {
    let mut b: Buffer<u8, 4> = Buffer::new();
    let (mut p, mut c) = b.split();
    p.write(1)[0] = 1;
    p.write(1)[0] = 2;
    p.write(1)[0] = 3;
    let mut r = c.read(usize::MAX);
    assert!(r.len() == 3);
    r.consume(1);
    assert!(r.len() == 2);
    assert!(r[0] == 2);
    assert!(r[1] == 3);
}

#[test]
#[should_panic]
fn bad_consume() {
    let mut b: Buffer<u8, 4> = Buffer::new();
    let (mut p, mut c) = b.split();
    p.write(2);
    let mut r = c.read(usize::MAX);
    r.consume(3);
}

#[test]
fn partial_drop() {
    let mut b: Buffer<u8, 4> = Buffer::new();
    let (mut p, c) = b.split();
    let w = p.write(3);
    w.partial_drop(1);
    assert!(c.data_size() == 1);
}

#[test]
#[should_panic]
fn bad_partial_drop() {
    let mut b: Buffer<u8, 4> = Buffer::new();
    let (mut p, _) = b.split();
    let w = p.write(2);
    w.partial_drop(3);
}

#[test]
fn zero_sized_ops() {
    let mut b: Buffer<u8, 4> = Buffer::new();
    let (mut p, mut c) = b.split();
    p.write(1);
    let mut r = c.read(0);
    r.consume(0);
    r.partial_drop(0);
    assert!(c.data_size() == 1);
    p.write(0);
    assert!(p.empty_size() == 3);
}