#![deny(missing_docs)]
pub use storage::RBError as EventError;
pub use storage::ReaderId;
use storage::{RingBufferStorage, StorageIterator};
mod storage;
pub trait Event: Send + Sync + 'static {}
impl<T> Event for T
where
T: Send + Sync + 'static,
{
}
const DEFAULT_MAX_SIZE: usize = 200;
pub struct EventHandler<E> {
storage: RingBufferStorage<E>,
}
impl<E> EventHandler<E>
where
E: Event,
{
pub fn new() -> Self {
Self::with_capacity(DEFAULT_MAX_SIZE)
}
pub fn with_capacity(size: usize) -> Self {
Self {
storage: RingBufferStorage::new(size),
}
}
pub fn register_reader(&mut self) -> ReaderId {
self.storage.new_reader_id()
}
pub fn write(&mut self, events: &mut Vec<E>) -> Result<(), EventError<E>> {
if events.len() == 0 {
return Ok(());
}
self.storage.write(events)
}
pub fn write_single(&mut self, event: E) {
self.storage.write_single(event);
}
pub fn read(&self, reader_id: &mut ReaderId) -> Result<StorageIterator<E>, EventError<E>> {
self.storage.read(reader_id)
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::any::TypeId;
#[derive(Debug, Clone, PartialEq)]
struct Test {
pub id: u32,
}
#[test]
fn test_register_reader() {
let mut handler = EventHandler::<Test>::with_capacity(14);
let reader_id = handler.register_reader();
assert_eq!(ReaderId::new(TypeId::of::<Test>(), 1, 0, 0), reader_id);
}
#[test]
fn test_read_write() {
let mut handler = EventHandler::with_capacity(14);
let mut reader_id = handler.register_reader();
let mut reader_id_extra = handler.register_reader();
handler.write_single(Test { id: 1 });
assert_eq!(
vec![Test { id: 1 }],
handler
.read(&mut reader_id)
.unwrap()
.cloned()
.collect::<Vec<_>>()
);
handler.write_single(Test { id: 2 });
assert_eq!(
vec![Test { id: 2 }],
handler
.read(&mut reader_id)
.unwrap()
.cloned()
.collect::<Vec<_>>()
);
assert_eq!(
vec![Test { id: 1 }, Test { id: 2 }],
handler
.read(&mut reader_id_extra)
.unwrap()
.cloned()
.collect::<Vec<_>>()
);
handler.write_single(Test { id: 3 });
assert_eq!(
vec![Test { id: 3 }],
handler
.read(&mut reader_id)
.unwrap()
.cloned()
.collect::<Vec<_>>()
);
assert_eq!(
vec![Test { id: 3 }],
handler
.read(&mut reader_id_extra)
.unwrap()
.cloned()
.collect::<Vec<_>>()
);
}
}