|
|
@@ -0,0 +1,39 @@
|
|
|
+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,
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|