use std::fmt::Debug;
use std::sync::atomic::{AtomicU64, Ordering};
pub trait IdGenerator<Id> {
fn generate() -> Id;
}
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
pub struct TaskId<Id: Clone + Copy + Eq + Ord + Debug> {
id: Id,
}
impl<Id: Clone + Copy + Eq + Ord + Debug> TaskId<Id> {
pub fn new(id: Id) -> Self {
Self { id }
}
pub fn id(&self) -> Id {
self.id
}
}
pub struct AtomicU64Generator;
impl IdGenerator<u64> for AtomicU64Generator {
fn generate() -> u64 {
static NEXT_ID: AtomicU64 = AtomicU64::new(0);
NEXT_ID.fetch_add(1, Ordering::Relaxed)
}
}
pub type TaskIdU64 = TaskId<u64>;