crdt_sample/
aworset_opt.rs

1use core::hash::Hash;
2use std::{collections::{HashSet}, fmt::Display, mem::size_of};
3use std::fmt::Debug;
4use crate::{NodeId, DotContext};
5
6#[derive(Clone, Debug, PartialEq, Eq)]
7pub struct AworsetOpt<E>
8where
9    E: Eq + Display + Clone + Hash + Debug,
10{
11    pub id: NodeId,
12    pub set: HashSet<(NodeId, E, i64)>,   
13    pub cc: DotContext<NodeId> // Equivalent to the cc in aworset.rs
14}
15
16impl<E> AworsetOpt<E>
17where
18    E: Eq + Display + Clone + Hash + Debug,
19{
20    pub fn new(id: NodeId) -> Self {
21        Self {
22            id, 
23            set: HashSet::new(),
24            cc: DotContext::new()
25        }
26    }
27
28    pub fn get_bytes_size(&self) -> usize {
29        let mut total_size = 0; 
30        total_size += self.id.get_bytes_size(); 
31        total_size += self.cc.get_bytes_size(); 
32        for (nodeid, _, _) in self.set.iter(){
33            total_size += nodeid.get_bytes_size();
34            total_size += size_of::<E>(); 
35            total_size += size_of::<i64>();
36        }
37        total_size 
38    }
39    
40    pub fn elements(&self) -> HashSet<E>{
41        let mut res: HashSet<E> = HashSet::new();
42        for (_, e, _) in self.set.iter(){
43            res.insert(e.clone());
44        }
45        res
46    }
47
48    pub fn add(&mut self, element: E) {
49        let dot = self.cc.makedot(&self.id);
50        self.set.insert((dot.0, element, dot.1));
51    }
52
53    pub fn rm(&mut self, element: E) {
54        self.set= self.set.drain().filter(|(_, e, _) | {
55            if element == *e { return false; }   
56            true
57        }).collect();
58    }
59
60    pub fn join(&mut self, other: &Self){
61        // Intersentions and elements not known by other.
62        self.set = self.set.drain().filter(|v|
63            other.set.contains(v) || !other.cc.dotin(&(v.0.clone(), v.2)))
64        .collect();
65        
66        // Elements known by other, but not by self.
67        for entry in other.set.iter() {
68            if !self.cc.dotin(&(entry.0.clone(), entry.2)) {
69                self.set.insert(entry.clone());
70            }
71        }
72
73        self.cc.join(&other.cc);
74    }
75}
76