Skip to content

Commit 2f53aea

Browse files
kinto-bPhilippe-Cholet
authored andcommitted
Simplify OrderingOrBool::merge
Return `(Option<Either<L, R>>, MergeResult)` instead of `(Option<L>, Option<R>, MergeResult)`
1 parent 232e0c2 commit 2f53aea

File tree

1 file changed

+36
-30
lines changed

1 file changed

+36
-30
lines changed

src/merge_join.rs

+36-30
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ pub trait OrderingOrBool<L, R> {
115115
// "merge" never returns (Some(...), Some(...), ...) so Option<Either<I::Item, J::Item>>
116116
// is appealing but it is always followed by two put_backs, so we think the compiler is
117117
// smart enough to optimize it. Or we could move put_backs into "merge".
118-
fn merge(&mut self, left: L, right: R) -> (Option<L>, Option<R>, Self::MergeResult);
118+
fn merge(&mut self, left: L, right: R) -> (Option<Either<L, R>>, Self::MergeResult);
119119
fn size_hint(left: SizeHint, right: SizeHint) -> SizeHint;
120120
}
121121

@@ -127,11 +127,11 @@ impl<L, R, F: FnMut(&L, &R) -> Ordering> OrderingOrBool<L, R> for MergeFuncLR<F,
127127
fn right(right: R) -> Self::MergeResult {
128128
EitherOrBoth::Right(right)
129129
}
130-
fn merge(&mut self, left: L, right: R) -> (Option<L>, Option<R>, Self::MergeResult) {
130+
fn merge(&mut self, left: L, right: R) -> (Option<Either<L, R>>, Self::MergeResult) {
131131
match self.0(&left, &right) {
132-
Ordering::Equal => (None, None, EitherOrBoth::Both(left, right)),
133-
Ordering::Less => (None, Some(right), EitherOrBoth::Left(left)),
134-
Ordering::Greater => (Some(left), None, EitherOrBoth::Right(right)),
132+
Ordering::Equal => (None, EitherOrBoth::Both(left, right)),
133+
Ordering::Less => (Some(Either::Right(right)), EitherOrBoth::Left(left)),
134+
Ordering::Greater => (Some(Either::Left(left)), EitherOrBoth::Right(right)),
135135
}
136136
}
137137
fn size_hint(left: SizeHint, right: SizeHint) -> SizeHint {
@@ -154,11 +154,11 @@ impl<L, R, F: FnMut(&L, &R) -> bool> OrderingOrBool<L, R> for MergeFuncLR<F, boo
154154
fn right(right: R) -> Self::MergeResult {
155155
Either::Right(right)
156156
}
157-
fn merge(&mut self, left: L, right: R) -> (Option<L>, Option<R>, Self::MergeResult) {
157+
fn merge(&mut self, left: L, right: R) -> (Option<Either<L, R>>, Self::MergeResult) {
158158
if self.0(&left, &right) {
159-
(None, Some(right), Either::Left(left))
159+
(Some(Either::Right(right)), Either::Left(left))
160160
} else {
161-
(Some(left), None, Either::Right(right))
161+
(Some(Either::Left(left)), Either::Right(right))
162162
}
163163
}
164164
fn size_hint(left: SizeHint, right: SizeHint) -> SizeHint {
@@ -175,11 +175,11 @@ impl<T, F: FnMut(&T, &T) -> bool> OrderingOrBool<T, T> for F {
175175
fn right(right: T) -> Self::MergeResult {
176176
right
177177
}
178-
fn merge(&mut self, left: T, right: T) -> (Option<T>, Option<T>, Self::MergeResult) {
178+
fn merge(&mut self, left: T, right: T) -> (Option<Either<T, T>>, Self::MergeResult) {
179179
if self(&left, &right) {
180-
(None, Some(right), left)
180+
(Some(Either::Right(right)), left)
181181
} else {
182-
(Some(left), None, right)
182+
(Some(Either::Left(left)), right)
183183
}
184184
}
185185
fn size_hint(left: SizeHint, right: SizeHint) -> SizeHint {
@@ -196,11 +196,11 @@ impl<T: PartialOrd> OrderingOrBool<T, T> for MergeLte {
196196
fn right(right: T) -> Self::MergeResult {
197197
right
198198
}
199-
fn merge(&mut self, left: T, right: T) -> (Option<T>, Option<T>, Self::MergeResult) {
199+
fn merge(&mut self, left: T, right: T) -> (Option<Either<T, T>>, Self::MergeResult) {
200200
if left <= right {
201-
(None, Some(right), left)
201+
(Some(Either::Right(right)), left)
202202
} else {
203-
(Some(left), None, right)
203+
(Some(Either::Left(left)), right)
204204
}
205205
}
206206
fn size_hint(left: SizeHint, right: SizeHint) -> SizeHint {
@@ -244,13 +244,17 @@ where
244244
(Some(left), None) => Some(F::left(left)),
245245
(None, Some(right)) => Some(F::right(right)),
246246
(Some(left), Some(right)) => {
247-
let (left, right, next) = self.cmp_fn.merge(left, right);
248-
if let Some(left) = left {
249-
self.left.put_back(left);
250-
}
251-
if let Some(right) = right {
252-
self.right.put_back(right);
247+
let (not_next, next) = self.cmp_fn.merge(left, right);
248+
match not_next {
249+
Some(Either::Left(l)) => {
250+
self.left.put_back(l);
251+
}
252+
Some(Either::Right(r)) => {
253+
self.right.put_back(r);
254+
}
255+
None => (),
253256
}
257+
254258
Some(next)
255259
}
256260
}
@@ -268,22 +272,21 @@ where
268272
loop {
269273
match (left, right) {
270274
(Some(l), Some(r)) => match self.cmp_fn.merge(l, r) {
271-
(None, Some(r), x) => {
275+
(Some(Either::Right(r)), x) => {
272276
acc = f(acc, x);
273277
left = self.left.next();
274278
right = Some(r);
275279
}
276-
(Some(l), None, x) => {
280+
(Some(Either::Left(l)), x) => {
277281
acc = f(acc, x);
278282
left = Some(l);
279283
right = self.right.next();
280284
}
281-
(None, None, x) => {
285+
(None, x) => {
282286
acc = f(acc, x);
283287
left = self.left.next();
284288
right = self.right.next();
285289
}
286-
(Some(_), Some(_), _) => unreachable!(),
287290
},
288291
(Some(l), None) => {
289292
self.left.put_back(l);
@@ -319,12 +322,15 @@ where
319322
(Some(_left), None) => break self.left.nth(n).map(F::left),
320323
(None, Some(_right)) => break self.right.nth(n).map(F::right),
321324
(Some(left), Some(right)) => {
322-
let (left, right, _) = self.cmp_fn.merge(left, right);
323-
if let Some(left) = left {
324-
self.left.put_back(left);
325-
}
326-
if let Some(right) = right {
327-
self.right.put_back(right);
325+
let (not_next, _) = self.cmp_fn.merge(left, right);
326+
match not_next {
327+
Some(Either::Left(l)) => {
328+
self.left.put_back(l);
329+
}
330+
Some(Either::Right(r)) => {
331+
self.right.put_back(r);
332+
}
333+
None => (),
328334
}
329335
}
330336
}

0 commit comments

Comments
 (0)