use crate::id::Id;
use core::sync::atomic::{AtomicUsize, Ordering::Relaxed};
#[cfg(feature = "uuid")]
use uuid::Uuid;
static COUNTER: AtomicUsize = AtomicUsize::new(0);
impl<T> Id<&T> {
pub fn cloned(&self) -> Id<T>
where
T: Clone,
{
Id(self.0.clone())
}
pub fn copied(&self) -> Id<T>
where
T: Copy,
{
Id(*self.0)
}
}
impl<T> Id<&mut T> {
pub fn cloned(&self) -> Id<T>
where
T: Clone,
{
Id(self.0.clone())
}
pub fn copied(&self) -> Id<T>
where
T: Copy,
{
Id(*self.0)
}
}
impl Id<usize> {
pub fn create() -> Self {
let value: usize;
#[cfg(feature = "rand")]
{
value = rand::random::<u128>() as usize;
}
#[cfg(not(feature = "rand"))]
{
value = COUNTER.fetch_add(1, Relaxed);
}
Id::new(value)
}
pub fn atomic() -> Self {
Self::new(COUNTER.fetch_add(1, Relaxed))
}
pub fn atomic_step(&mut self) -> usize {
self.replace(COUNTER.fetch_add(1, Relaxed))
}
}
#[cfg(feature = "uuid")]
impl Id<Uuid> {
pub fn v3(namespace: &Uuid, name: &[u8]) -> Self {
let id = Uuid::new_v3(namespace, name);
Self::new(id)
}
#[cfg(all(feature = "rng", feature = "uuid"))]
pub fn v4() -> Self {
let id = Uuid::new_v4();
Self::new(id)
}
}