dcl_data_structures 0.6.0

Data structures for for deep_causality crate.
Documentation
use dcl_data_structures::ring_buffer::prelude::*;
use std::sync::Arc;

const SIZE: usize = 1024;

#[test]
fn writes_and_reads_data() {
    let buffer = RingBuffer::<i64, SIZE>::new();

    for i in 0..SIZE as i64 {
        unsafe {
            *buffer.get_mut(i as Sequence) = i;
        }
    }

    for i in 0..SIZE as i64 {
        unsafe {
            assert_eq!(*buffer.get(i as Sequence), i);
        }
    }
}

#[test]
fn writes_are_visible_across_threads() {
    let buffer: Arc<RingBuffer<i64, SIZE>> = Arc::new(RingBuffer::new());

    let b1 = buffer.clone();
    let t1 = std::thread::spawn(move || {
        for i in 0..SIZE as i64 {
            unsafe {
                *b1.get_mut(i as Sequence) = i;
            }
        }
    });

    let b2 = buffer.clone();
    let t2 = std::thread::spawn(move || {
        for i in 0..SIZE as i64 {
            unsafe {
                *b2.get_mut(i as Sequence) = i * 2;
            }
        }
    });

    t1.join().unwrap();
    t2.join().unwrap();
}