common.rs 838 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. use super::rand::RngCore;
  2. pub use anyhow::Result;
  3. use std::sync::atomic::{AtomicU64, Ordering};
  4. #[derive(Clone, Debug, Ord, PartialOrd, Eq, PartialEq)]
  5. struct UniqueId {
  6. clerk_id: u64,
  7. sequence_id: u64,
  8. }
  9. #[derive(Debug)]
  10. struct UniqueIdSequence {
  11. clerk_id: u64,
  12. sequence_id: AtomicU64,
  13. }
  14. impl UniqueIdSequence {
  15. pub fn new() -> Self {
  16. Self {
  17. clerk_id: rand::thread_rng().next_u64(),
  18. sequence_id: AtomicU64::new(0),
  19. }
  20. }
  21. pub fn zero(&self) -> UniqueId {
  22. UniqueId {
  23. clerk_id: self.clerk_id,
  24. sequence_id: 0,
  25. }
  26. }
  27. pub fn inc(&mut self) -> UniqueId {
  28. let seq = self.sequence_id.fetch_add(1, Ordering::Relaxed);
  29. UniqueId {
  30. clerk_id: self.clerk_id,
  31. sequence_id: seq,
  32. }
  33. }
  34. }