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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
use std::clone::Clone;
pub type SequenceNumber = u16;
#[derive(Debug)]
pub struct SequenceBuffer<T: Clone + Default> {
sequence_num: SequenceNumber,
entry_sequences: Box<[Option<SequenceNumber>]>,
entries: Box<[T]>,
}
impl<T: Clone + Default> SequenceBuffer<T> {
pub fn with_capacity(size: u16) -> Self {
Self {
sequence_num: 0,
entry_sequences: vec![None; size as usize].into_boxed_slice(),
entries: vec![T::default(); size as usize].into_boxed_slice(),
}
}
pub fn sequence_num(&self) -> SequenceNumber {
self.sequence_num
}
pub fn get_mut(&mut self, sequence_num: SequenceNumber) -> Option<&mut T> {
if self.exists(sequence_num) {
let index = self.index(sequence_num);
return Some(&mut self.entries[index]);
}
None
}
pub fn insert(&mut self, sequence_num: SequenceNumber, entry: T) -> Option<&mut T> {
if sequence_less_than(
sequence_num,
self.sequence_num
.wrapping_sub(self.entry_sequences.len() as u16),
) {
return None;
}
self.advance_sequence(sequence_num);
let index = self.index(sequence_num);
self.entry_sequences[index] = Some(sequence_num);
self.entries[index] = entry;
Some(&mut self.entries[index])
}
pub fn exists(&self, sequence_num: SequenceNumber) -> bool {
let index = self.index(sequence_num);
if let Some(s) = self.entry_sequences[index] {
return s == sequence_num;
}
false
}
pub fn remove(&mut self, sequence_num: SequenceNumber) -> Option<T> {
if self.exists(sequence_num) {
let index = self.index(sequence_num);
let value = std::mem::replace(&mut self.entries[index], T::default());
self.entry_sequences[index] = None;
return Some(value);
}
None
}
fn advance_sequence(&mut self, sequence_num: SequenceNumber) {
if sequence_greater_than(sequence_num.wrapping_add(1), self.sequence_num) {
self.remove_entries(u32::from(sequence_num));
self.sequence_num = sequence_num.wrapping_add(1);
}
}
fn remove_entries(&mut self, mut finish_sequence: u32) {
let start_sequence = u32::from(self.sequence_num);
if finish_sequence < start_sequence {
finish_sequence += 65536;
}
if finish_sequence - start_sequence < self.entry_sequences.len() as u32 {
for sequence in start_sequence..=finish_sequence {
self.remove(sequence as u16);
}
} else {
for index in 0..self.entry_sequences.len() {
self.entries[index] = T::default();
self.entry_sequences[index] = None;
}
}
}
fn index(&self, sequence: SequenceNumber) -> usize {
sequence as usize % self.entry_sequences.len()
}
}
pub fn sequence_greater_than(s1: u16, s2: u16) -> bool {
((s1 > s2) && (s1 - s2 <= 32768)) || ((s1 < s2) && (s2 - s1 > 32768))
}
pub fn sequence_less_than(s1: u16, s2: u16) -> bool {
sequence_greater_than(s2, s1)
}