|
|
@@ -22,21 +22,21 @@ impl<T: Ord + Clone> Node<T> {
|
|
|
Self { name: name.into(), gset: GSet::new(), time: 0 }
|
|
|
}
|
|
|
|
|
|
- pub fn receive_event(&mut self, event: Event<T>) {
|
|
|
+ pub fn receive_event(&mut self, event: &Event<T>) {
|
|
|
self.time = max(self.time, event.counter) + 1;
|
|
|
self.gset.insert(event);
|
|
|
}
|
|
|
|
|
|
- pub fn send_event(&mut self, value: T) -> Event<T> {
|
|
|
+ pub fn send_event(&mut self, value: &T) -> Event<T> {
|
|
|
self.time += 1;
|
|
|
let event = Event::new(value, self.time, self.name.clone());
|
|
|
- self.gset.insert(event.clone());
|
|
|
+ self.gset.insert(&event);
|
|
|
event
|
|
|
}
|
|
|
}
|
|
|
|
|
|
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq, PartialOrd)]
|
|
|
-struct Event<T> {
|
|
|
+struct Event<T: Clone> {
|
|
|
// the msg in the event
|
|
|
value: T,
|
|
|
// the counter for lamport clock
|
|
|
@@ -46,13 +46,13 @@ struct Event<T> {
|
|
|
name: String,
|
|
|
}
|
|
|
|
|
|
-impl<T> Event<T> {
|
|
|
- pub fn new(value: T, counter: u64, name: String) -> Self {
|
|
|
- Self { value, counter, name }
|
|
|
+impl<T: Clone> Event<T> {
|
|
|
+ pub fn new(value: &T, counter: u64, name: String) -> Self {
|
|
|
+ Self { value: value.clone(), counter, name }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-impl<T: Eq + PartialOrd> Ord for Event<T> {
|
|
|
+impl<T: Eq + PartialOrd + Clone> Ord for Event<T> {
|
|
|
fn cmp(&self, other: &Self) -> Ordering {
|
|
|
let ord = self.counter.cmp(&other.counter);
|
|
|
if ord == Ordering::Equal {
|
|
|
@@ -67,13 +67,13 @@ pub struct GSet<T: Ord> {
|
|
|
set: BTreeSet<T>,
|
|
|
}
|
|
|
|
|
|
-impl<T: Ord> GSet<T> {
|
|
|
+impl<T: Ord + Clone> GSet<T> {
|
|
|
pub fn new() -> Self {
|
|
|
Self { set: BTreeSet::new() }
|
|
|
}
|
|
|
|
|
|
- pub fn insert(&mut self, element: T) {
|
|
|
- self.set.insert(element);
|
|
|
+ pub fn insert(&mut self, element: &T) {
|
|
|
+ self.set.insert(element.clone());
|
|
|
}
|
|
|
|
|
|
pub fn contains(&self, element: &T) -> bool {
|
|
|
@@ -84,8 +84,14 @@ impl<T: Ord> GSet<T> {
|
|
|
self.set.len()
|
|
|
}
|
|
|
|
|
|
- pub fn merge(&mut self, other: Self) {
|
|
|
- other.set.into_iter().for_each(|e| self.insert(e))
|
|
|
+ pub fn merge(&mut self, other: &Self) {
|
|
|
+ other.set.iter().for_each(|e| self.insert(e))
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+impl<T: Ord + Clone> Default for GSet<T> {
|
|
|
+ fn default() -> Self {
|
|
|
+ Self::new()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -99,14 +105,14 @@ mod tests {
|
|
|
mut b: Node<String>,
|
|
|
mut c: Node<String>,
|
|
|
) -> (Node<String>, Node<String>, Node<String>) {
|
|
|
- a.gset.merge(b.gset.clone());
|
|
|
- a.gset.merge(c.gset.clone());
|
|
|
+ a.gset.merge(&b.gset);
|
|
|
+ a.gset.merge(&c.gset);
|
|
|
|
|
|
- b.gset.merge(a.gset.clone());
|
|
|
- b.gset.merge(c.gset.clone());
|
|
|
+ b.gset.merge(&a.gset);
|
|
|
+ b.gset.merge(&c.gset);
|
|
|
|
|
|
- c.gset.merge(a.gset.clone());
|
|
|
- c.gset.merge(b.gset.clone());
|
|
|
+ c.gset.merge(&a.gset);
|
|
|
+ c.gset.merge(&b.gset);
|
|
|
|
|
|
(a, b, c)
|
|
|
}
|
|
|
@@ -118,17 +124,17 @@ mod tests {
|
|
|
let mut c: Node<String> = Node::new("Node C");
|
|
|
|
|
|
// node a
|
|
|
- a.send_event("a_msg1".into());
|
|
|
- a.send_event("a_msg2".into());
|
|
|
+ a.send_event(&"a_msg1".to_string());
|
|
|
+ a.send_event(&"a_msg2".to_string());
|
|
|
|
|
|
// node b
|
|
|
- b.send_event("b_msg1".into());
|
|
|
+ b.send_event(&"b_msg1".to_string());
|
|
|
|
|
|
// node c
|
|
|
- c.send_event("c_msg1".into());
|
|
|
+ c.send_event(&"c_msg1".to_string());
|
|
|
|
|
|
// node b
|
|
|
- b.send_event("b_msg2".into());
|
|
|
+ b.send_event(&"b_msg2".to_string());
|
|
|
|
|
|
let (a, mut b, mut c) = sync_simulation(a, b, c);
|
|
|
|
|
|
@@ -137,13 +143,13 @@ mod tests {
|
|
|
assert_eq!(c.gset.len(), 5);
|
|
|
|
|
|
// node c
|
|
|
- c.send_event("c_msg2".into());
|
|
|
- c.send_event("c_msg3".into());
|
|
|
- c.send_event("c_msg4".into());
|
|
|
- c.send_event("c_msg5".into());
|
|
|
+ c.send_event(&"c_msg2".to_string());
|
|
|
+ c.send_event(&"c_msg3".to_string());
|
|
|
+ c.send_event(&"c_msg4".to_string());
|
|
|
+ c.send_event(&"c_msg5".to_string());
|
|
|
|
|
|
// node b
|
|
|
- b.send_event("b_msg3".into());
|
|
|
+ b.send_event(&"b_msg3".to_string());
|
|
|
|
|
|
let (a, b, c) = sync_simulation(a, b, c);
|
|
|
|