#![warn(missing_docs)]
pub use crate::storage::{ReaderId, StorageIterator as EventIterator};
use crate::storage::RingBuffer;
mod storage;
mod util;
pub trait Event: Send + Sync + 'static {}
impl<T> Event for T where T: Send + Sync + 'static {}
const DEFAULT_CAPACITY: usize = 64;
#[derive(Debug)]
pub struct EventChannel<E> {
storage: RingBuffer<E>,
}
impl<E> Default for EventChannel<E>
where
E: Event,
{
fn default() -> Self {
EventChannel::with_capacity(DEFAULT_CAPACITY)
}
}
impl<E> EventChannel<E>
where
E: Event,
{
pub fn new() -> Self {
Default::default()
}
pub fn with_capacity(size: usize) -> Self {
Self {
storage: RingBuffer::new(size),
}
}
pub fn would_write(&mut self) -> bool {
self.storage.would_write()
}
pub fn register_reader(&mut self) -> ReaderId<E> {
self.storage.new_reader_id()
}
#[deprecated(note = "please use `iter_write` instead")]
pub fn slice_write(&mut self, events: &[E])
where
E: Clone,
{
self.storage.iter_write(events.into_iter().cloned());
}
pub fn iter_write<I>(&mut self, iter: I)
where
I: IntoIterator<Item = E>,
I::IntoIter: ExactSizeIterator,
{
self.storage.iter_write(iter);
}
pub fn drain_vec_write(&mut self, events: &mut Vec<E>) {
self.storage.drain_vec_write(events);
}
pub fn single_write(&mut self, event: E) {
self.storage.single_write(event);
}
pub fn read(&self, reader_id: &mut ReaderId<E>) -> EventIterator<E> {
self.storage.read(reader_id)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[derive(Debug, Clone, PartialEq)]
struct Test {
pub id: u32,
}
#[test]
fn test_grow() {
let mut channel = EventChannel::with_capacity(10);
let mut reader0 = channel.register_reader();
let mut reader1 = channel.register_reader();
channel.iter_write(vec![1, 2, 3, 4, 5, 6, 7, 8]);
let data = channel.read(&mut reader0).cloned().collect::<Vec<_>>();
assert_eq!(data, vec![1, 2, 3, 4, 5, 6, 7, 8]);
channel.iter_write(vec![9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22]);
let data = channel.read(&mut reader0).cloned().collect::<Vec<_>>();
assert_eq!(
data,
vec![9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22]
);
for i in 23..10_000 {
channel.single_write(i);
}
let data = channel.read(&mut reader1).cloned().collect::<Vec<_>>();
assert_eq!(data, (1..10_000).collect::<Vec<_>>());
}
#[test]
fn test_read_write() {
let mut channel = EventChannel::with_capacity(14);
let mut reader_id = channel.register_reader();
let mut reader_id_extra = channel.register_reader();
channel.single_write(Test { id: 1 });
assert_eq!(
vec![Test { id: 1 }],
channel.read(&mut reader_id).cloned().collect::<Vec<_>>()
);
channel.single_write(Test { id: 2 });
assert_eq!(
vec![Test { id: 2 }],
channel.read(&mut reader_id).cloned().collect::<Vec<_>>()
);
assert_eq!(
vec![Test { id: 1 }, Test { id: 2 }],
channel
.read(&mut reader_id_extra)
.cloned()
.collect::<Vec<_>>()
);
channel.single_write(Test { id: 3 });
assert_eq!(
vec![Test { id: 3 }],
channel.read(&mut reader_id).cloned().collect::<Vec<_>>()
);
assert_eq!(
vec![Test { id: 3 }],
channel
.read(&mut reader_id_extra)
.cloned()
.collect::<Vec<_>>()
);
}
#[test]
fn test_example() {
let mut channel = EventChannel::new();
channel.drain_vec_write(&mut vec![TestEvent { data: 1 }, TestEvent { data: 2 }]);
let mut reader_id = channel.register_reader();
assert_eq!(
Vec::<TestEvent>::default(),
channel.read(&mut reader_id).cloned().collect::<Vec<_>>()
);
channel.single_write(TestEvent { data: 5 });
assert_eq!(
vec![TestEvent { data: 5 }],
channel.read(&mut reader_id).cloned().collect::<Vec<_>>()
);
channel.iter_write(
[TestEvent { data: 8 }, TestEvent { data: 9 }]
.iter()
.cloned(),
);
assert_eq!(
vec![TestEvent { data: 8 }, TestEvent { data: 9 }],
channel.read(&mut reader_id).cloned().collect::<Vec<_>>()
);
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct TestEvent {
data: u32,
}
}