use std::fmt::{self, Display};
use std::sync::atomic::{AtomicU64, Ordering};
static NEXT_RUN_ID: AtomicU64 = AtomicU64::new(0);
#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
pub struct RunId(u64);
impl RunId {
pub fn next() -> Self {
Self(NEXT_RUN_ID.fetch_add(1, Ordering::Relaxed))
}
pub fn get(&self) -> u64 {
self.0
}
}
impl Display for RunId {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
Display::fmt(&self.0, formatter)
}
}
#[cfg(test)]
mod tests {
#![allow(clippy::missing_panics_doc)]
use super::*;
#[test]
fn display_returns_the_number() {
let id = RunId::next();
let text = id.to_string();
assert_eq!(text, id.get().to_string());
}
#[test]
fn next_returns_a_new_identity_every_time() {
let first = RunId::next();
let second = RunId::next();
assert_ne!(first, second);
}
#[test]
fn trait_send() {
fn assert_send<T: Send>() {}
assert_send::<RunId>();
}
#[test]
fn trait_sync() {
fn assert_sync<T: Sync>() {}
assert_sync::<RunId>();
}
#[test]
fn trait_unpin() {
fn assert_unpin<T: Unpin>() {}
assert_unpin::<RunId>();
}
}