Skip to content

Commit

Permalink
use values iterator
Browse files Browse the repository at this point in the history
  • Loading branch information
jakemac53 committed Nov 5, 2024
1 parent 6b19fb0 commit 314c1e1
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 7 deletions.
6 changes: 2 additions & 4 deletions pkgs/collection/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,8 @@

- Add `IterableMapEntryExtension` for working on `Map` as a list of pairs, using
`Map.entries`.
- Use `entries` and `update` in map equality implementations.
- Speeds up all equality checks.
- Speeds up implementations for maps with slow lookup, at a slight cost for
other implementations.
- Optimize equality and hash code for maps by using `update` and a `values`
iterator to avoid extra lookups.

## 1.19.1

Expand Down
12 changes: 9 additions & 3 deletions pkgs/collection/lib/src/equality.dart
Original file line number Diff line number Diff line change
Expand Up @@ -325,11 +325,15 @@ class MapEquality<K, V> implements Equality<Map<K, V>> {
var length = map1.length;
if (length != map2.length) return false;
Map<_MapEntry, int> equalElementCounts = HashMap();
for (var MapEntry(:key, :value) in map1.entries) {
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, (i) => i + 1, ifAbsent: () => 1);
}
for (var MapEntry(:key, :value) in map2.entries) {
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, (i) => i - 1, ifAbsent: () => -1);
Expand All @@ -342,7 +346,9 @@ class MapEquality<K, V> implements Equality<Map<K, V>> {
int hash(Map<K, V>? map) {
if (map == null) return null.hashCode;
var hash = 0;
for (var MapEntry(:key, :value) in map.entries) {
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);
hash = (hash + 3 * keyHash + 7 * valueHash) & _hashMask;
Expand Down

0 comments on commit 314c1e1

Please sign in to comment.