pub type BusId = u32;
pub type TrackId = u32;
#[derive(Debug, Clone)]
pub struct BusIdGenerator {
next_id: BusId,
}
impl BusIdGenerator {
pub fn new() -> Self {
Self { next_id: 0 }
}
pub fn next_id(&mut self) -> BusId {
let id = self.next_id;
self.next_id = self.next_id.wrapping_add(1);
id
}
pub fn peek(&self) -> BusId {
self.next_id
}
pub fn reset(&mut self) {
self.next_id = 0;
}
}
impl Default for BusIdGenerator {
fn default() -> Self {
Self::new()
}
}
#[derive(Debug, Clone)]
pub struct TrackIdGenerator {
next_id: TrackId,
}
impl TrackIdGenerator {
pub fn new() -> Self {
Self { next_id: 0 }
}
pub fn next_id(&mut self) -> TrackId {
let id = self.next_id;
self.next_id = self.next_id.wrapping_add(1);
id
}
pub fn peek(&self) -> TrackId {
self.next_id
}
pub fn reset(&mut self) {
self.next_id = 0;
}
}
impl Default for TrackIdGenerator {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_bus_id_generator() {
let mut gen = BusIdGenerator::new();
assert_eq!(gen.next_id(), 0);
assert_eq!(gen.next_id(), 1);
assert_eq!(gen.next_id(), 2);
}
#[test]
fn test_track_id_generator() {
let mut gen = TrackIdGenerator::new();
assert_eq!(gen.next_id(), 0);
assert_eq!(gen.next_id(), 1);
assert_eq!(gen.next_id(), 2);
}
#[test]
fn test_bus_id_generator_peek() {
let mut gen = BusIdGenerator::new();
assert_eq!(gen.peek(), 0);
assert_eq!(gen.next_id(), 0);
assert_eq!(gen.peek(), 1);
assert_eq!(gen.next_id(), 1);
}
#[test]
fn test_bus_id_generator_reset() {
let mut gen = BusIdGenerator::new();
gen.next_id();
gen.next_id();
gen.reset();
assert_eq!(gen.next_id(), 0);
}
#[test]
fn test_track_id_generator_wrapping() {
let mut gen = TrackIdGenerator::new();
gen.next_id = u32::MAX;
assert_eq!(gen.next_id(), u32::MAX);
assert_eq!(gen.next_id(), 0); }
}