use crate::message::{
Message, MessageIterator, MessageIteratorWithId, MessageMutIterator, MessageMutIteratorWithId,
Messages,
};
#[cfg(feature = "multi_threaded")]
use crate::message::{MessageMutParIter, MessageParIter};
use core::marker::PhantomData;
#[derive(Debug)]
pub struct MessageCursor<E: Message> {
pub(super) last_message_count: usize,
pub(super) _marker: PhantomData<E>,
}
impl<E: Message> Default for MessageCursor<E> {
fn default() -> Self {
MessageCursor {
last_message_count: 0,
_marker: Default::default(),
}
}
}
impl<E: Message> Clone for MessageCursor<E> {
fn clone(&self) -> Self {
MessageCursor {
last_message_count: self.last_message_count,
_marker: PhantomData,
}
}
}
impl<E: Message> MessageCursor<E> {
pub fn read<'a>(&'a mut self, messages: &'a Messages<E>) -> MessageIterator<'a, E> {
self.read_with_id(messages).without_id()
}
pub fn read_mut<'a>(&'a mut self, messages: &'a mut Messages<E>) -> MessageMutIterator<'a, E> {
self.read_mut_with_id(messages).without_id()
}
pub fn read_with_id<'a>(
&'a mut self,
messages: &'a Messages<E>,
) -> MessageIteratorWithId<'a, E> {
MessageIteratorWithId::new(self, messages)
}
pub fn read_mut_with_id<'a>(
&'a mut self,
messages: &'a mut Messages<E>,
) -> MessageMutIteratorWithId<'a, E> {
MessageMutIteratorWithId::new(self, messages)
}
#[cfg(feature = "multi_threaded")]
pub fn par_read<'a>(&'a mut self, messages: &'a Messages<E>) -> MessageParIter<'a, E> {
MessageParIter::new(self, messages)
}
#[cfg(feature = "multi_threaded")]
pub fn par_read_mut<'a>(
&'a mut self,
messages: &'a mut Messages<E>,
) -> MessageMutParIter<'a, E> {
MessageMutParIter::new(self, messages)
}
pub fn len(&self, messages: &Messages<E>) -> usize {
messages
.message_count
.saturating_sub(self.last_message_count)
.min(messages.len())
}
pub fn missed_messages(&self, messages: &Messages<E>) -> usize {
messages
.oldest_message_count()
.saturating_sub(self.last_message_count)
}
pub fn is_empty(&self, messages: &Messages<E>) -> bool {
self.len(messages) == 0
}
pub fn clear(&mut self, messages: &Messages<E>) {
self.last_message_count = messages.message_count;
}
}