Skip to content

Commit 0b2bd3f

Browse files
authored
Revert "Use values iterator and update in map equality/hash (#718)" (#858)
1 parent a896913 commit 0b2bd3f

File tree

2 files changed

+9
-20
lines changed

2 files changed

+9
-20
lines changed

Diff for: pkgs/collection/CHANGELOG.md

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1+
12
## 1.20.0-wip
23

34
- Add `IterableMapEntryExtension` for working on `Map` as a list of pairs, using
45
`Map.entries`.
5-
- Optimize equality and hash code for maps by using `update` and a `values`
6-
iterator to avoid extra lookups.
76
- Address diagnostics from `strict_top_level_inference`.
87

98
## 1.19.1

Diff for: pkgs/collection/lib/src/equality.dart

+8-18
Original file line numberDiff line numberDiff line change
@@ -325,19 +325,16 @@ class MapEquality<K, V> implements Equality<Map<K, V>> {
325325
var length = map1.length;
326326
if (length != map2.length) return false;
327327
Map<_MapEntry, int> equalElementCounts = HashMap();
328-
var values1 = map1.values.iterator;
329328
for (var key in map1.keys) {
330-
var value = (values1..moveNext()).current;
331-
var entry = _MapEntry(this, key, value);
332-
equalElementCounts.update(entry, _addOne, ifAbsent: _one);
329+
var entry = _MapEntry(this, key, map1[key]);
330+
var count = equalElementCounts[entry] ?? 0;
331+
equalElementCounts[entry] = count + 1;
333332
}
334-
final values2 = map2.values.iterator;
335333
for (var key in map2.keys) {
336-
var value = (values2..moveNext()).current;
337-
var entry = _MapEntry(this, key, value);
338-
var count = equalElementCounts.update(entry, _subtractOne,
339-
ifAbsent: _negativeOne);
340-
if (count < 0) return false;
334+
var entry = _MapEntry(this, key, map2[key]);
335+
var count = equalElementCounts[entry];
336+
if (count == null || count == 0) return false;
337+
equalElementCounts[entry] = count - 1;
341338
}
342339
return true;
343340
}
@@ -346,11 +343,9 @@ class MapEquality<K, V> implements Equality<Map<K, V>> {
346343
int hash(Map<K, V>? map) {
347344
if (map == null) return null.hashCode;
348345
var hash = 0;
349-
var values = map.values.iterator;
350346
for (var key in map.keys) {
351-
var value = (values..moveNext()).current;
352347
var keyHash = _keyEquality.hash(key);
353-
var valueHash = _valueEquality.hash(value);
348+
var valueHash = _valueEquality.hash(map[key] as V);
354349
hash = (hash + 3 * keyHash + 7 * valueHash) & _hashMask;
355350
}
356351
hash = (hash + (hash << 3)) & _hashMask;
@@ -494,8 +489,3 @@ class CaseInsensitiveEquality implements Equality<String> {
494489
@override
495490
bool isValidKey(Object? object) => object is String;
496491
}
497-
498-
int _addOne(int i) => i + 1;
499-
int _subtractOne(int i) => i - 1;
500-
int _one() => 1;
501-
int _negativeOne() => -1;

0 commit comments

Comments
 (0)