Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(99)

Side by Side Diff: runtime/lib/collection_patch.dart

Issue 289353002: Add SetBase/SetMixin. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | sdk/lib/_internal/lib/collection_patch.dart » ('j') | sdk/lib/collection/set.dart » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 patch class HashMap<K, V> { 5 patch class HashMap<K, V> {
6 /* patch */ factory HashMap({ bool equals(K key1, K key2), 6 /* patch */ factory HashMap({ bool equals(K key1, K key2),
7 int hashCode(K key), 7 int hashCode(K key),
8 bool isValidKey(potentialKey) }) { 8 bool isValidKey(potentialKey) }) {
9 if (isValidKey == null) { 9 if (isValidKey == null) {
10 if (hashCode == null) { 10 if (hashCode == null) {
(...skipping 522 matching lines...) Expand 10 before | Expand all | Expand 10 after
533 if (equals == null) { 533 if (equals == null) {
534 equals = _defaultEquals; 534 equals = _defaultEquals;
535 } 535 }
536 } 536 }
537 return new _CustomHashSet<E>(equals, hashCode, isValidKey); 537 return new _CustomHashSet<E>(equals, hashCode, isValidKey);
538 } 538 }
539 539
540 /* patch */ factory HashSet.identity() = _IdentityHashSet<E>; 540 /* patch */ factory HashSet.identity() = _IdentityHashSet<E>;
541 } 541 }
542 542
543 class _HashSet<E> extends _HashSetBase<E> implements HashSet<E> { 543 class _HashSet<E> extends SetBase<E> implements HashSet<E> {
544 static const int _INITIAL_CAPACITY = 8; 544 static const int _INITIAL_CAPACITY = 8;
545 545
546 List<_HashSetEntry> _buckets = new List(_INITIAL_CAPACITY); 546 List<_HashSetEntry> _buckets = new List(_INITIAL_CAPACITY);
547 int _elementCount = 0; 547 int _elementCount = 0;
548 int _modificationCount = 0; 548 int _modificationCount = 0;
549 549
550 bool _equals(e1, e2) => e1 == e2; 550 bool _equals(e1, e2) => e1 == e2;
551 int _hashCode(e) => e.hashCode; 551 int _hashCode(e) => e.hashCode;
552 552
553 // Iterable. 553 // Iterable.
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
627 } 627 }
628 628
629 bool remove(Object object) => _remove(object, _hashCode(object)); 629 bool remove(Object object) => _remove(object, _hashCode(object));
630 630
631 void removeAll(Iterable<Object> objectsToRemove) { 631 void removeAll(Iterable<Object> objectsToRemove) {
632 for (Object object in objectsToRemove) { 632 for (Object object in objectsToRemove) {
633 _remove(object, _hashCode(object)); 633 _remove(object, _hashCode(object));
634 } 634 }
635 } 635 }
636 636
637 void retainAll(Iterable<Object> objectsToRetain) {
638 super._retainAll(objectsToRetain, (o) => o is E);
639 }
640
641 void _filterWhere(bool test(E element), bool removeMatching) { 637 void _filterWhere(bool test(E element), bool removeMatching) {
642 int length = _buckets.length; 638 int length = _buckets.length;
643 for (int index = 0; index < length; index++) { 639 for (int index = 0; index < length; index++) {
644 _HashSetEntry entry = _buckets[index]; 640 _HashSetEntry entry = _buckets[index];
645 _HashSetEntry previous = null; 641 _HashSetEntry previous = null;
646 while (entry != null) { 642 while (entry != null) {
647 int modificationCount = _modificationCount; 643 int modificationCount = _modificationCount;
648 bool testResult = test(entry.key); 644 bool testResult = test(entry.key);
649 if (modificationCount != _modificationCount) { 645 if (modificationCount != _modificationCount) {
650 throw new ConcurrentModificationError(this); 646 throw new ConcurrentModificationError(this);
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
704 _HashSetEntry next = entry.next; 700 _HashSetEntry next = entry.next;
705 int newIndex = entry.hashCode & (newLength - 1); 701 int newIndex = entry.hashCode & (newLength - 1);
706 entry.next = newBuckets[newIndex]; 702 entry.next = newBuckets[newIndex];
707 newBuckets[newIndex] = entry; 703 newBuckets[newIndex] = entry;
708 entry = next; 704 entry = next;
709 } 705 }
710 } 706 }
711 _buckets = newBuckets; 707 _buckets = newBuckets;
712 } 708 }
713 709
714 HashSet<E> _newSet() => new _HashSet<E>(); 710 HashSet<E> cloneEmpty() => new _HashSet<E>();
715 } 711 }
716 712
717 class _IdentityHashSet<E> extends _HashSet<E> { 713 class _IdentityHashSet<E> extends _HashSet<E> {
718 int _hashCode(e) => identityHashCode(e); 714 int _hashCode(e) => identityHashCode(e);
719 bool _equals(e1, e2) => identical(e1, e2); 715 bool _equals(e1, e2) => identical(e1, e2);
720 HashSet<E> _newSet() => new _IdentityHashSet<E>(); 716 HashSet<E> cloneEmpty() => new _IdentityHashSet<E>();
721 } 717 }
722 718
723 class _CustomHashSet<E> extends _HashSet<E> { 719 class _CustomHashSet<E> extends _HashSet<E> {
724 final _Equality<E> _equality; 720 final _Equality<E> _equality;
725 final _Hasher<E> _hasher; 721 final _Hasher<E> _hasher;
726 final _Predicate _validKey; 722 final _Predicate _validKey;
727 _CustomHashSet(this._equality, this._hasher, bool validKey(Object o)) 723 _CustomHashSet(this._equality, this._hasher, bool validKey(Object o))
728 : _validKey = (validKey != null) ? validKey : new _TypeTest<E>().test; 724 : _validKey = (validKey != null) ? validKey : new _TypeTest<E>().test;
729 725
730 bool remove(Object element) { 726 bool remove(Object element) {
(...skipping 19 matching lines...) Expand all
750 } 746 }
751 747
752 void removeAll(Iterable<Object> elements) { 748 void removeAll(Iterable<Object> elements) {
753 for (Object element in elements) { 749 for (Object element in elements) {
754 if (_validKey(element)) { 750 if (_validKey(element)) {
755 super._remove(element, _hasher(element)); 751 super._remove(element, _hasher(element));
756 } 752 }
757 } 753 }
758 } 754 }
759 755
760 void retainAll(Iterable<Object> elements) {
761 super._retainAll(elements, _validKey);
762 }
763
764 bool _equals(e1, e2) => _equality(e1, e2); 756 bool _equals(e1, e2) => _equality(e1, e2);
765 int _hashCode(e) => _hasher(e); 757 int _hashCode(e) => _hasher(e);
766 758
767 HashSet<E> _newSet() => new _CustomHashSet<E>(_equality, _hasher, _validKey); 759 HashSet<E> cloneEmpty() =>
760 new _CustomHashSet<E>(_equality, _hasher, _validKey);
768 } 761 }
769 762
770 class _HashSetEntry { 763 class _HashSetEntry {
771 final key; 764 final key;
772 final int hashCode; 765 final int hashCode;
773 _HashSetEntry next; 766 _HashSetEntry next;
774 _HashSetEntry(this.key, this.hashCode, this.next); 767 _HashSetEntry(this.key, this.hashCode, this.next);
775 768
776 _HashSetEntry remove() { 769 _HashSetEntry remove() {
777 _HashSetEntry result = next; 770 _HashSetEntry result = next;
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after
1167 // resize the backing store. 1160 // resize the backing store.
1168 if ((newElements << 2) > ((length << 1) + length)) _resize(); 1161 if ((newElements << 2) > ((length << 1) + length)) _resize();
1169 _modificationCount = (_modificationCount + 1) & _MODIFICATION_COUNT_MASK; 1162 _modificationCount = (_modificationCount + 1) & _MODIFICATION_COUNT_MASK;
1170 } 1163 }
1171 1164
1172 void clear() { 1165 void clear() {
1173 _nextEntry = _previousEntry = this; 1166 _nextEntry = _previousEntry = this;
1174 super.clear(); 1167 super.clear();
1175 } 1168 }
1176 1169
1177 HashSet<E> _newSet() => new _LinkedHashSet<E>(); 1170 HashSet<E> cloneEmpty() => new _LinkedHashSet<E>();
1178 } 1171 }
1179 1172
1180 class _LinkedIdentityHashSet<E> extends _LinkedHashSet<E> { 1173 class _LinkedIdentityHashSet<E> extends _LinkedHashSet<E> {
1181 int _hashCode(e) => identityHashCode(e); 1174 int _hashCode(e) => identityHashCode(e);
1182 bool _equals(e1, e2) => identical(e1, e2); 1175 bool _equals(e1, e2) => identical(e1, e2);
1183 HashSet<E> _newSet() => new _LinkedIdentityHashSet<E>(); 1176 HashSet<E> cloneEmpty() => new _LinkedIdentityHashSet<E>();
1184 } 1177 }
1185 1178
1186 class _LinkedCustomHashSet<E> extends _LinkedHashSet<E> { 1179 class _LinkedCustomHashSet<E> extends _LinkedHashSet<E> {
1187 final _Equality<E> _equality; 1180 final _Equality<E> _equality;
1188 final _Hasher<E> _hasher; 1181 final _Hasher<E> _hasher;
1189 final _Predicate _validKey; 1182 final _Predicate _validKey;
1190 1183
1191 _LinkedCustomHashSet(this._equality, this._hasher, bool validKey(Object o)) 1184 _LinkedCustomHashSet(this._equality, this._hasher, bool validKey(Object o))
1192 : _validKey = (validKey != null) ? validKey : new _TypeTest<E>().test; 1185 : _validKey = (validKey != null) ? validKey : new _TypeTest<E>().test;
1193 1186
(...skipping 24 matching lines...) Expand all
1218 } 1211 }
1219 1212
1220 void removeAll(Iterable<Object> elements) { 1213 void removeAll(Iterable<Object> elements) {
1221 for (Object element in elements) { 1214 for (Object element in elements) {
1222 if (_validKey(element)) { 1215 if (_validKey(element)) {
1223 super._remove(element, _hasher(element)); 1216 super._remove(element, _hasher(element));
1224 } 1217 }
1225 } 1218 }
1226 } 1219 }
1227 1220
1228 void retainAll(Iterable<Object> elements) { 1221 HashSet<E> cloneEmpty() =>
1229 super._retainAll(elements, _validKey);
1230 }
1231
1232 HashSet<E> _newSet() =>
1233 new _LinkedCustomHashSet<E>(_equality, _hasher, _validKey); 1222 new _LinkedCustomHashSet<E>(_equality, _hasher, _validKey);
1234 } 1223 }
1235 1224
1236 class _LinkedHashSetIterator<E> implements Iterator<E> { 1225 class _LinkedHashSetIterator<E> implements Iterator<E> {
1237 final _LinkedHashSet _set; 1226 final _LinkedHashSet _set;
1238 final int _modificationCount; 1227 final int _modificationCount;
1239 var _next; 1228 var _next;
1240 E _current; 1229 E _current;
1241 1230
1242 _LinkedHashSetIterator(_LinkedHashSet hashSet) 1231 _LinkedHashSetIterator(_LinkedHashSet hashSet)
(...skipping 10 matching lines...) Expand all
1253 return false; 1242 return false;
1254 } 1243 }
1255 _LinkedHashSetEntry entry = _next; 1244 _LinkedHashSetEntry entry = _next;
1256 _current = entry.key; 1245 _current = entry.key;
1257 _next = entry._nextEntry; 1246 _next = entry._nextEntry;
1258 return true; 1247 return true;
1259 } 1248 }
1260 1249
1261 E get current => _current; 1250 E get current => _current;
1262 } 1251 }
OLDNEW
« no previous file with comments | « no previous file | sdk/lib/_internal/lib/collection_patch.dart » ('j') | sdk/lib/collection/set.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698