crdt_sample/
aworset_opt.rs1use 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> }
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 self.set = self.set.drain().filter(|v|
63 other.set.contains(v) || !other.cc.dotin(&(v.0.clone(), v.2)))
64 .collect();
65
66 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