1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
use crate::communication::Push;
pub mod pushers;
pub mod pullers;
pub mod pact;
pub type Bundle<T, D> = crate::communication::Message<Message<T, D>>;
#[derive(Clone, Abomonation, Serialize, Deserialize)]
pub struct Message<T, D> {
pub time: T,
pub data: Vec<D>,
pub from: usize,
pub seq: usize,
}
impl<T, D> Message<T, D> {
pub fn default_length() -> usize {
1024
}
pub fn new(time: T, data: Vec<D>, from: usize, seq: usize) -> Self {
Message { time, data, from, seq }
}
#[inline]
pub fn push_at<P: Push<Bundle<T, D>>>(buffer: &mut Vec<D>, time: T, pusher: &mut P) {
let data = ::std::mem::replace(buffer, Vec::new());
let message = Message::new(time, data, 0, 0);
let mut bundle = Some(Bundle::from_typed(message));
pusher.push(&mut bundle);
if let Some(message) = bundle {
if let Some(message) = message.if_typed() {
*buffer = message.data;
buffer.clear();
}
}
if buffer.capacity() != Self::default_length() {
*buffer = Vec::with_capacity(Self::default_length());
}
}}