| 123456789101112131415161718192021222324252627282930313233343536373839 |
- use super::rand::RngCore;
- pub use anyhow::Result;
- use std::sync::atomic::{AtomicU64, Ordering};
- #[derive(Clone, Debug, Ord, PartialOrd, Eq, PartialEq)]
- struct UniqueId {
- clerk_id: u64,
- sequence_id: u64,
- }
- #[derive(Debug)]
- struct UniqueIdSequence {
- clerk_id: u64,
- sequence_id: AtomicU64,
- }
- impl UniqueIdSequence {
- pub fn new() -> Self {
- Self {
- clerk_id: rand::thread_rng().next_u64(),
- sequence_id: AtomicU64::new(0),
- }
- }
- pub fn zero(&self) -> UniqueId {
- UniqueId {
- clerk_id: self.clerk_id,
- sequence_id: 0,
- }
- }
- pub fn inc(&mut self) -> UniqueId {
- let seq = self.sequence_id.fetch_add(1, Ordering::Relaxed);
- UniqueId {
- clerk_id: self.clerk_id,
- sequence_id: seq,
- }
- }
- }
|