From 3001450f95912ec541081b512d4a59eb2d1333ba Mon Sep 17 00:00:00 2001 From: TyOverby Date: Sun, 18 May 2014 23:31:23 -0700 Subject: [PATCH] core::iter::order functions now take two types of iterators. Previously the type signatures of the ordering functions in `core::iter::order` took two iterators, but only if they were the same type of iterator. This commit loosens that restriction and allows different kinds of iterators (but with the same type of elements) to be compared. --- src/libcore/iter.rs | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/libcore/iter.rs b/src/libcore/iter.rs index d40701860f4..9fc16b55631 100644 --- a/src/libcore/iter.rs +++ b/src/libcore/iter.rs @@ -2184,7 +2184,7 @@ pub mod order { use super::Iterator; /// Compare `a` and `b` for equality using `TotalEq` - pub fn equals>(mut a: T, mut b: T) -> bool { + pub fn equals, S: Iterator>(mut a: T, mut b: S) -> bool { loop { match (a.next(), b.next()) { (None, None) => return true, @@ -2195,7 +2195,7 @@ pub fn equals>(mut a: T, mut b: T) -> bool { } /// Order `a` and `b` lexicographically using `TotalOrd` - pub fn cmp>(mut a: T, mut b: T) -> cmp::Ordering { + pub fn cmp, S: Iterator>(mut a: T, mut b: S) -> cmp::Ordering { loop { match (a.next(), b.next()) { (None, None) => return cmp::Equal, @@ -2210,7 +2210,7 @@ pub fn cmp>(mut a: T, mut b: T) -> cmp::Ordering { } /// Compare `a` and `b` for equality (Using partial equality, `Eq`) - pub fn eq>(mut a: T, mut b: T) -> bool { + pub fn eq, S: Iterator>(mut a: T, mut b: S) -> bool { loop { match (a.next(), b.next()) { (None, None) => return true, @@ -2221,7 +2221,7 @@ pub fn eq>(mut a: T, mut b: T) -> bool { } /// Compare `a` and `b` for nonequality (Using partial equality, `Eq`) - pub fn ne>(mut a: T, mut b: T) -> bool { + pub fn ne, S: Iterator>(mut a: T, mut b: S) -> bool { loop { match (a.next(), b.next()) { (None, None) => return false, @@ -2232,7 +2232,7 @@ pub fn ne>(mut a: T, mut b: T) -> bool { } /// Return `a` < `b` lexicographically (Using partial order, `Ord`) - pub fn lt>(mut a: T, mut b: T) -> bool { + pub fn lt, S: Iterator>(mut a: T, mut b: S) -> bool { loop { match (a.next(), b.next()) { (None, None) => return false, @@ -2244,7 +2244,7 @@ pub fn lt>(mut a: T, mut b: T) -> bool { } /// Return `a` <= `b` lexicographically (Using partial order, `Ord`) - pub fn le>(mut a: T, mut b: T) -> bool { + pub fn le, S: Iterator>(mut a: T, mut b: S) -> bool { loop { match (a.next(), b.next()) { (None, None) => return true, @@ -2256,7 +2256,7 @@ pub fn le>(mut a: T, mut b: T) -> bool { } /// Return `a` > `b` lexicographically (Using partial order, `Ord`) - pub fn gt>(mut a: T, mut b: T) -> bool { + pub fn gt, S: Iterator>(mut a: T, mut b: S) -> bool { loop { match (a.next(), b.next()) { (None, None) => return false, @@ -2268,7 +2268,7 @@ pub fn gt>(mut a: T, mut b: T) -> bool { } /// Return `a` >= `b` lexicographically (Using partial order, `Ord`) - pub fn ge>(mut a: T, mut b: T) -> bool { + pub fn ge, S: Iterator>(mut a: T, mut b: S) -> bool { loop { match (a.next(), b.next()) { (None, None) => return true, @@ -2325,6 +2325,16 @@ fn test_lt() { assert!(gt(c.iter(), b.iter()) == (c[0] > b[0])); assert!(ge(c.iter(), b.iter()) == (c[0] >= b[0])); } + + #[test] + fn test_multi_iter() { + use slice::ImmutableVector; + use iter::DoubleEndedIterator; + let xs = [1i,2,3,4]; + let ys = [4i,3,2,1]; + assert!(eq(xs.iter(), ys.iter().rev())); + assert!(lt(xs.iter(), xs.iter().skip(2))); + } } #[cfg(test)] -- GitLab