Skip to main content

boarddown_core/crdt/
mod.rs

1pub use self::changeset::*;
2pub use self::vector::*;
3
4mod changeset;
5mod vector;
6
7use serde::{Deserialize, Serialize};
8use std::sync::atomic::{AtomicU64, Ordering};
9
10static CLIENT_COUNTER: AtomicU64 = AtomicU64::new(0);
11
12#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
13pub struct Version(pub u64);
14
15impl Version {
16    pub fn initial() -> Self {
17        Self(0)
18    }
19
20    pub fn increment(&self) -> Self {
21        Self(self.0 + 1)
22    }
23}
24
25impl Default for Version {
26    fn default() -> Self {
27        Self::initial()
28    }
29}
30
31#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
32pub struct ClientId(pub u64);
33
34impl ClientId {
35    pub fn new() -> Self {
36        use std::time::{SystemTime, UNIX_EPOCH};
37        
38        let timestamp = SystemTime::now()
39            .duration_since(UNIX_EPOCH)
40            .unwrap()
41            .as_nanos() as u64;
42        
43        let counter = CLIENT_COUNTER.fetch_add(1, Ordering::SeqCst);
44        
45        Self(timestamp.wrapping_add(counter))
46    }
47
48    pub fn value(&self) -> u64 {
49        self.0
50    }
51}
52
53impl Default for ClientId {
54    fn default() -> Self {
55        Self::new()
56    }
57}