1use std::fmt::Debug;
2use std::sync::atomic::{AtomicU64, Ordering};
3
4pub trait IdGenerator<Id> {
5 fn generate() -> Id;
6}
7
8#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
9pub struct TaskId<Id: Clone + Copy + Eq + Ord + Debug> {
10 id: Id,
11}
12
13impl<Id: Clone + Copy + Eq + Ord + Debug> TaskId<Id> {
14 pub fn new(id: Id) -> Self {
15 Self { id }
16 }
17
18 pub fn id(&self) -> Id {
19 self.id
20 }
21}
22
23pub struct AtomicU64Generator;
24
25impl IdGenerator<u64> for AtomicU64Generator {
26 fn generate() -> u64 {
27 static NEXT_ID: AtomicU64 = AtomicU64::new(0);
28 NEXT_ID.fetch_add(1, Ordering::Relaxed)
29 }
30}
31
32pub type TaskIdU64 = TaskId<u64>;