dcl_data_structures 0.7.0

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

#[test]
fn test_single_executor() {
    let (executor, producer) = RustDisruptorBuilder::with_ring_buffer::<u64, 1024>(1024)
        .with_blocking_wait()
        .with_single_producer()
        .with_barrier(|_scope| {})
        .build();

    assert!(std::mem::size_of_val(&executor) > 0);
    assert!(std::mem::size_of_val(&producer) > 0);
}

#[test]
fn test_executor_with_multiple_handlers() {
    struct TestHandler;
    impl EventHandler<u64> for TestHandler {
        fn handle_event(&self, _event: &u64, _sequence: u64, _end_of_batch: bool) {}
    }

    let (executor, producer) = RustDisruptorBuilder::with_ring_buffer::<u64, 1024>(1024)
        .with_blocking_wait()
        .with_single_producer()
        .with_barrier(|scope| {
            scope.handle_events(TestHandler);
            scope.handle_events(TestHandler);
        })
        .build();

    assert!(std::mem::size_of_val(&executor) > 0);
    assert!(std::mem::size_of_val(&producer) > 0);
}

#[test]
fn test_executor_with_custom_handler() {
    struct CustomHandler {
        count: Arc<AtomicSequence>,
    }

    impl EventHandler<u64> for CustomHandler {
        fn handle_event(&self, event: &u64, sequence: u64, _end_of_batch: bool) {
            self.count.set(sequence);
            println!("Handling event {} at sequence {}", event, sequence);
        }
    }

    let counter = Arc::new(AtomicSequence::default());
    let handler = CustomHandler {
        count: counter.clone(),
    };

    let (executor, producer) = RustDisruptorBuilder::with_ring_buffer::<u64, 1024>(1024)
        .with_blocking_wait()
        .with_single_producer()
        .with_barrier(|scope| {
            scope.handle_events(handler);
        })
        .build();

    assert!(std::mem::size_of_val(&executor) > 0);
    assert!(std::mem::size_of_val(&producer) > 0);
}

#[test]
fn test_executor_with_mutable_handler() {
    struct MutableHandler {
        count: u64,
    }

    impl EventHandlerMut<u64> for MutableHandler {
        fn handle_event(&mut self, event: &mut u64, _sequence: u64, _end_of_batch: bool) {
            self.count += 1;
            *event = self.count;
        }
    }

    let (executor, producer) = RustDisruptorBuilder::with_ring_buffer::<u64, 1024>(1024)
        .with_blocking_wait()
        .with_single_producer()
        .with_barrier(|scope| {
            scope.handle_events_mut(MutableHandler { count: 0 });
        })
        .build();

    assert!(std::mem::size_of_val(&executor) > 0);
    assert!(std::mem::size_of_val(&producer) > 0);
}

#[test]
fn test_executor_with_sequential_barriers() {
    struct Handler1;
    impl EventHandler<u64> for Handler1 {
        fn handle_event(&self, _event: &u64, _sequence: u64, _end_of_batch: bool) {}
    }

    struct Handler2 {
        count: u64,
    }
    impl EventHandlerMut<u64> for Handler2 {
        fn handle_event(&mut self, event: &mut u64, _sequence: u64, _end_of_batch: bool) {
            self.count += 1;
            *event = self.count;
        }
    }

    let (executor, producer) = RustDisruptorBuilder::with_ring_buffer::<u64, 1024>(1024)
        .with_blocking_wait()
        .with_single_producer()
        .with_barrier(|scope| {
            scope.handle_events(Handler1);
        })
        .with_barrier(|scope| {
            scope.handle_events_mut(Handler2 { count: 0 });
        })
        .build();

    assert!(std::mem::size_of_val(&executor) > 0);
    assert!(std::mem::size_of_val(&producer) > 0);
}