use crate::config::{GeneratorConfig, NexmarkConfig};
use crate::event::*;
#[derive(Default, Clone, Debug)]
pub struct EventGenerator {
cfg: GeneratorConfig,
offset: u64,
step: u64,
type_filter: Option<EventType>,
}
impl EventGenerator {
pub fn new(config: NexmarkConfig) -> Self {
EventGenerator {
cfg: config.into(),
offset: 0,
step: 1,
type_filter: None,
}
}
pub fn with_offset(mut self, offset: u64) -> Self {
self.offset = offset;
self
}
pub fn with_step(mut self, step: u64) -> Self {
assert_ne!(step, 0);
self.step = step;
self
}
pub fn with_type_filter(mut self, type_: EventType) -> Self {
self.type_filter = Some(type_);
self
}
pub fn offset(&self) -> u64 {
self.offset
}
pub fn timestamp(&self) -> u64 {
self.cfg.event_timestamp(self.event_number())
}
pub fn global_offset(&self) -> u64 {
match self.type_filter {
Some(EventType::Person) => {
(self.offset as usize / self.cfg.person_proportion
* self.cfg.proportion_denominator
+ self.offset as usize % self.cfg.person_proportion) as u64
}
Some(EventType::Auction) => {
(self.offset as usize / self.cfg.auction_proportion
* self.cfg.proportion_denominator
+ self.cfg.person_proportion
+ self.offset as usize % self.cfg.auction_proportion) as u64
}
Some(EventType::Bid) => {
(self.offset as usize / self.cfg.bid_proportion * self.cfg.proportion_denominator
+ self.cfg.person_proportion
+ self.cfg.auction_proportion
+ self.offset as usize % self.cfg.bid_proportion) as u64
}
None => self.offset,
}
}
fn event_number(&self) -> usize {
match self.type_filter {
Some(_) => self.cfg.first_event_number + self.global_offset() as usize,
None => self.cfg.next_adjusted_event(self.offset as usize),
}
}
}
impl Iterator for EventGenerator {
type Item = Event;
fn next(&mut self) -> Option<Event> {
let event = Event::new(self.event_number(), &self.cfg);
self.offset += self.step;
Some(event)
}
}