use super::QueueEntry;
use std::collections::VecDeque;
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, Default)]
pub struct LevelEntries {
order_count: u64,
queue: VecDeque<QueueEntry>,
}
impl LevelEntries {
pub fn new() -> Self {
Self::default()
}
pub fn order_count(&self) -> u64 {
self.order_count
}
pub fn queue(&self) -> &VecDeque<QueueEntry> {
&self.queue
}
pub(crate) fn increment_order_count(&mut self) {
self.order_count += 1;
}
pub(crate) fn decrement_order_count(&mut self) {
self.order_count -= 1;
}
pub(crate) fn is_empty(&self) -> bool {
self.order_count == 0
}
pub(crate) fn push(&mut self, queue_entry: QueueEntry) {
self.queue.push_back(queue_entry);
}
pub(crate) fn peek(&self) -> Option<QueueEntry> {
self.queue.front().copied()
}
pub(crate) fn pop(&mut self) -> Option<QueueEntry> {
self.queue.pop_front()
}
}
#[cfg(test)]
mod tests {
use crate::*;
#[test]
fn test_order_count() {
let mut level_entries = LevelEntries::new();
assert_eq!(level_entries.order_count(), 0);
assert!(level_entries.is_empty());
level_entries.increment_order_count();
assert_eq!(level_entries.order_count(), 1);
assert!(!level_entries.is_empty());
level_entries.decrement_order_count();
assert_eq!(level_entries.order_count(), 0);
assert!(level_entries.is_empty());
}
#[test]
fn test_push_peek_pop() {
let mut level_entries = LevelEntries::new();
assert!(level_entries.peek().is_none());
level_entries.push(QueueEntry::new(SequenceNumber(0), OrderId(0)));
assert_eq!(
level_entries.peek(),
Some(QueueEntry::new(SequenceNumber(0), OrderId(0)))
);
level_entries.push(QueueEntry::new(SequenceNumber(1), OrderId(1)));
assert_eq!(
level_entries.peek(),
Some(QueueEntry::new(SequenceNumber(0), OrderId(0)))
);
let queue_entry = level_entries.pop();
assert_eq!(
queue_entry,
Some(QueueEntry::new(SequenceNumber(0), OrderId(0)))
);
assert_eq!(
level_entries.peek(),
Some(QueueEntry::new(SequenceNumber(1), OrderId(1)))
);
let queue_entry = level_entries.pop();
assert_eq!(
queue_entry,
Some(QueueEntry::new(SequenceNumber(1), OrderId(1)))
);
assert!(level_entries.peek().is_none());
}
}