Skip to content

Commit 5ded370

Browse files
committed
Simplifications followin @bnjbvr review.
1 parent ddd0d8c commit 5ded370

File tree

1 file changed

+17
-25
lines changed

1 file changed

+17
-25
lines changed

src/lib.rs

Lines changed: 17 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ impl Gtid {
8989
self.intervals.push(interval);
9090
return;
9191
}
92-
if let Some(&first) = self.intervals.first() {
92+
if let Some(first) = self.intervals.first_mut() {
9393
// if interval is strictly before intervals
9494
if interval.1 < first.0 {
9595
self.intervals.insert(0, interval);
@@ -98,25 +98,19 @@ impl Gtid {
9898

9999
// if interval merge before interval
100100
if interval.1 == first.0 {
101-
// unwrapping is ok as intervals is not empty
102-
103-
let first = self.intervals.first_mut().unwrap();
104-
*first = (interval.0, first.1);
101+
first.0 = interval.0;
105102
return;
106103
}
107104
}
108105

109-
if let Some(&last) = self.intervals.last() {
106+
if let Some(last) = self.intervals.last_mut() {
110107
if interval.0 > last.1 {
111108
self.intervals.push(interval);
112109
return;
113110
}
114111

115112
if interval.0 == last.1 {
116-
// unwrapping is ok as intervals is not empty
117-
118-
let last = self.intervals.last_mut().unwrap();
119-
*last = (last.0, interval.1);
113+
last.1 = interval.1;
120114
return;
121115
}
122116
}
@@ -126,17 +120,12 @@ impl Gtid {
126120
.binary_search_by(|elem| elem.1.cmp(&interval.0))
127121
{
128122
Err(idx) => {
129-
// error case so it won't merge with previous
130-
// it may merge before the item currently at idx
131-
if idx == self.intervals.len() {
132-
// previously treated
133-
unreachable!()
134-
}
135-
// we can unwrap as the case interval is after the last element is treated before
136-
let next = self.intervals.get(idx).unwrap();
123+
// there is always a next element, otherwise we fall
124+
// into the previous if let some last case
125+
let next = &mut self.intervals[idx];
137126
// interval merges with next
138127
if next.0 == interval.1 {
139-
*self.intervals.get_mut(idx).unwrap() = (interval.0, next.1);
128+
next.0 = interval.0;
140129
} else {
141130
// just add interval, nothing to merge
142131
self.intervals.insert(idx, interval);
@@ -151,27 +140,30 @@ impl Gtid {
151140

152141
// interval merges with before and after
153142
if interval.0 == before.1 && interval.1 == after.0 {
154-
*self.intervals.get_mut(idx).unwrap() = (before.0, after.1);
143+
self.intervals[idx] = (before.0, after.1);
155144
self.intervals.remove(idx + 1);
156145
} else if
157146
// interval merges with before
158147
interval.0 == before.1 {
159-
*self.intervals.get_mut(idx).unwrap() = (before.0, interval.1);
148+
self.intervals[idx] = (before.0, interval.1);
160149
} else if
161150
// interval merges with after
162151
interval.1 == after.0 {
163-
unreachable!("should have been treated in the error branch before");
164-
// *self.intervals.get_mut(idx + 1).unwrap() = (interval.0, after.1);
152+
unreachable!("should have been treated in the error branch before: interval merges with after");
165153
} else {
166154
// interval does not merge
167-
unreachable!("should have been treated in the error branch before");
168-
// self.intervals.insert(idx + 1, interval)
155+
unreachable!("should have been treated in the error branch before: interval does not merge");
169156
}
170157
}
171158
}
172159
}
173160

174161
/// Add a raw interval into the gtid.
162+
///
163+
/// ## Safety
164+
///
165+
/// Gtids must not overlap, and be ordered.
166+
/// see https://dev.mysql.com/doc/refman/8.0/en/replication-gtids-concepts.html
175167
fn add_interval(&mut self, interval: &(u64, u64)) -> Result<(), GtidError> {
176168
if interval.0 == 0 || interval.1 == 0 {
177169
return Err(GtidError::ZeroInInterval);

0 commit comments

Comments
 (0)