From 0b2bd3fcd7f3e082f4cc9b14c19ffa93894b85ae Mon Sep 17 00:00:00 2001 From: Jacob MacDonald Date: Tue, 11 Feb 2025 11:09:17 -0800 Subject: [PATCH] Revert "Use `values` iterator and `update` in map equality/hash (#718)" (#858) --- pkgs/collection/CHANGELOG.md | 3 +-- pkgs/collection/lib/src/equality.dart | 26 ++++++++------------------ 2 files changed, 9 insertions(+), 20 deletions(-) diff --git a/pkgs/collection/CHANGELOG.md b/pkgs/collection/CHANGELOG.md index 32318658..30f8c3f7 100644 --- a/pkgs/collection/CHANGELOG.md +++ b/pkgs/collection/CHANGELOG.md @@ -1,9 +1,8 @@ + ## 1.20.0-wip - Add `IterableMapEntryExtension` for working on `Map` as a list of pairs, using `Map.entries`. -- Optimize equality and hash code for maps by using `update` and a `values` - iterator to avoid extra lookups. - Address diagnostics from `strict_top_level_inference`. ## 1.19.1 diff --git a/pkgs/collection/lib/src/equality.dart b/pkgs/collection/lib/src/equality.dart index 1e2f02ae..0e1df23d 100644 --- a/pkgs/collection/lib/src/equality.dart +++ b/pkgs/collection/lib/src/equality.dart @@ -325,19 +325,16 @@ class MapEquality implements Equality> { var length = map1.length; if (length != map2.length) return false; Map<_MapEntry, int> equalElementCounts = HashMap(); - var values1 = map1.values.iterator; for (var key in map1.keys) { - var value = (values1..moveNext()).current; - var entry = _MapEntry(this, key, value); - equalElementCounts.update(entry, _addOne, ifAbsent: _one); + var entry = _MapEntry(this, key, map1[key]); + var count = equalElementCounts[entry] ?? 0; + equalElementCounts[entry] = count + 1; } - final values2 = map2.values.iterator; for (var key in map2.keys) { - var value = (values2..moveNext()).current; - var entry = _MapEntry(this, key, value); - var count = equalElementCounts.update(entry, _subtractOne, - ifAbsent: _negativeOne); - if (count < 0) return false; + var entry = _MapEntry(this, key, map2[key]); + var count = equalElementCounts[entry]; + if (count == null || count == 0) return false; + equalElementCounts[entry] = count - 1; } return true; } @@ -346,11 +343,9 @@ class MapEquality implements Equality> { int hash(Map? map) { if (map == null) return null.hashCode; var hash = 0; - var values = map.values.iterator; for (var key in map.keys) { - var value = (values..moveNext()).current; var keyHash = _keyEquality.hash(key); - var valueHash = _valueEquality.hash(value); + var valueHash = _valueEquality.hash(map[key] as V); hash = (hash + 3 * keyHash + 7 * valueHash) & _hashMask; } hash = (hash + (hash << 3)) & _hashMask; @@ -494,8 +489,3 @@ class CaseInsensitiveEquality implements Equality { @override bool isValidKey(Object? object) => object is String; } - -int _addOne(int i) => i + 1; -int _subtractOne(int i) => i - 1; -int _one() => 1; -int _negativeOne() => -1;