use core::sync::atomic::{AtomicUsize, Ordering};
use std::sync::Arc;
pub mod cfg;
pub mod cmd;
pub mod engine;
mod generator;
mod histogram;
pub mod logging;
mod shaper;
mod stat;
mod ui;
mod worker;
trait Produce {
type Item: ?Sized;
fn next(&self) -> &Self::Item;
}
#[derive(Debug)]
pub struct OneProduce<T> {
v: T,
}
impl<T> OneProduce<T> {
#[inline]
pub const fn new(v: T) -> Self {
Self { v }
}
}
impl<T> Produce for Arc<OneProduce<T>> {
type Item = T;
#[inline]
fn next(&self) -> &Self::Item {
&self.v
}
}
#[derive(Debug)]
pub struct VecProduce<T> {
vec: Vec<T>,
idx: AtomicUsize,
}
impl<T> VecProduce<T> {
#[inline]
pub const fn new(vec: Vec<T>) -> Self {
Self { vec, idx: AtomicUsize::new(0) }
}
}
impl<T> Produce for Arc<VecProduce<T>> {
type Item = T;
#[inline]
fn next(&self) -> &Self::Item {
let idx = self.idx.fetch_add(1, Ordering::Relaxed);
let idx = idx % self.vec.len();
&self.vec[idx]
}
}
pub enum GeneratorEvent {
Suspend,
Resume,
Set(u64),
}