Skip to content

Commit 78bf6cd

Browse files
committed
map: Make Eq comparisons ordering-aware.
This is a breaking change. Not sure if you really want to take this but I think it's the right thing to do. Fixes #153
1 parent 008e543 commit 78bf6cd

File tree

3 files changed

+42
-9
lines changed

3 files changed

+42
-9
lines changed

src/map.rs

+26-1
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,23 @@ where
370370
}
371371
}
372372

373+
/// Performs an equality comparison without accounting for the ordering of
374+
/// the keys.
375+
///
376+
/// This is effectively an equivalent to HashMap::eq.
377+
pub fn unordered_eq<V2, S2>(&self, other: &IndexMap<K, V2, S2>) -> bool
378+
where
379+
V: PartialEq<V2>,
380+
S2: BuildHasher,
381+
{
382+
if self.len() != other.len() {
383+
return false;
384+
}
385+
386+
self.iter()
387+
.all(|(key, value)| other.get(key).map_or(false, |v| *value == *v))
388+
}
389+
373390
/// Return references to the key-value pair stored for `key`,
374391
/// if it is present, else `None`.
375392
///
@@ -1244,7 +1261,8 @@ where
12441261
}
12451262

12461263
self.iter()
1247-
.all(|(key, value)| other.get(key).map_or(false, |v| *value == *v))
1264+
.zip(other.iter())
1265+
.all(|((k1, v1), (k2, v2))| k1 == k2 && v1 == v2)
12481266
}
12491267
}
12501268

@@ -1624,4 +1642,11 @@ mod tests {
16241642
assert!(values.contains(&4));
16251643
assert!(values.contains(&6));
16261644
}
1645+
1646+
#[test]
1647+
fn eq() {
1648+
let m1: IndexMap<_, _> = vec![(1, 1), (2, 2)].into_iter().collect();
1649+
let m2: IndexMap<_, _> = vec![(2, 2), (1, 1)].into_iter().collect();
1650+
assert_ne!(m1, m2);
1651+
}
16271652
}

src/set.rs

+15-7
Original file line numberDiff line numberDiff line change
@@ -820,7 +820,7 @@ where
820820
S2: BuildHasher,
821821
{
822822
fn eq(&self, other: &IndexSet<T, S2>) -> bool {
823-
self.len() == other.len() && self.is_subset(other)
823+
self.len() == other.len() && self.iter().zip(other.iter()).all(|(v1, v2)| v1 == v2)
824824
}
825825
}
826826

@@ -863,6 +863,14 @@ where
863863
{
864864
other.is_subset(self)
865865
}
866+
867+
/// Performs an equality comparison without accounting for ordering.
868+
pub fn unordered_eq<S2>(&self, other: &IndexSet<T, S2>) -> bool
869+
where
870+
S2: BuildHasher,
871+
{
872+
self.len() == other.len() && self.is_subset(other)
873+
}
866874
}
867875

868876
/// A lazy iterator producing elements in the difference of `IndexSet`s.
@@ -1580,9 +1588,9 @@ mod tests {
15801588
assert_eq!(&set_a & &set_b, empty);
15811589
assert_eq!(&set_b & &set_a, empty);
15821590
assert_eq!(&set_a | &set_b, set_c);
1583-
assert_eq!(&set_b | &set_a, set_c);
1591+
assert_ne!(&set_b | &set_a, set_c);
15841592
assert_eq!(&set_a ^ &set_b, set_c);
1585-
assert_eq!(&set_b ^ &set_a, set_c);
1593+
assert_ne!(&set_b ^ &set_a, set_c);
15861594
assert_eq!(&set_a - &set_b, set_a);
15871595
assert_eq!(&set_b - &set_a, set_b);
15881596

@@ -1596,11 +1604,11 @@ mod tests {
15961604
assert_eq!(&set_c - &set_a, set_b);
15971605

15981606
assert_eq!(&set_c & &set_d, set_b);
1599-
assert_eq!(&set_d & &set_c, set_b);
1600-
assert_eq!(&set_c | &set_d, &set_a | &set_d);
1601-
assert_eq!(&set_d | &set_c, &set_a | &set_d);
1607+
assert_ne!(&set_d & &set_c, set_b);
1608+
assert_ne!(&set_c | &set_d, &set_a | &set_d);
1609+
assert_ne!(&set_d | &set_c, &set_a | &set_d);
16021610
assert_eq!(&set_c ^ &set_d, &set_a | &(&set_d - &set_b));
1603-
assert_eq!(&set_d ^ &set_c, &set_a | &(&set_d - &set_b));
1611+
assert_ne!(&set_d ^ &set_c, &set_a | &(&set_d - &set_b));
16041612
assert_eq!(&set_c - &set_d, set_a);
16051613
assert_eq!(&set_d - &set_c, &set_d - &set_b);
16061614
}

tests/quick.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,7 @@ quickcheck! {
319319
let mut map2 = IndexMapFnv::default();
320320
let mut reference2 = HashMap::new();
321321
do_ops(&ops2, &mut map2, &mut reference2);
322-
assert_eq!(map == map2, reference == reference2);
322+
assert_eq!(map.unordered_eq(&map2), reference == reference2);
323323
true
324324
}
325325

0 commit comments

Comments
 (0)