| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 part of dart.collection; | 5 part of dart.collection; |
| 6 | 6 |
| 7 typedef bool _Predicate<T>(T value); | 7 typedef bool _Predicate<T>(T value); |
| 8 | 8 |
| 9 /** | 9 /** |
| 10 * A node in a splay tree. It holds the sorting key and the left | 10 * A node in a splay tree. It holds the sorting key and the left |
| (...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 280 : _comparator = compare ?? Comparable.compare as Comparator<K>, | 280 : _comparator = compare ?? Comparable.compare as Comparator<K>, |
| 281 _validKey = isValidKey ?? ((v) => v is K); | 281 _validKey = isValidKey ?? ((v) => v is K); |
| 282 | 282 |
| 283 /** | 283 /** |
| 284 * Creates a [SplayTreeMap] that contains all key/value pairs of [other]. | 284 * Creates a [SplayTreeMap] that contains all key/value pairs of [other]. |
| 285 */ | 285 */ |
| 286 factory SplayTreeMap.from(Map other, | 286 factory SplayTreeMap.from(Map other, |
| 287 [int compare(K key1, K key2), | 287 [int compare(K key1, K key2), |
| 288 bool isValidKey(potentialKey)]) { | 288 bool isValidKey(potentialKey)]) { |
| 289 SplayTreeMap<K, V> result = new SplayTreeMap<K, V>(compare, isValidKey); | 289 SplayTreeMap<K, V> result = new SplayTreeMap<K, V>(compare, isValidKey); |
| 290 other.forEach((k, v) { result[k as K] = v as V; }); | 290 other.forEach((k, v) { result[k as Object/*=K*/] = v as Object/*=V*/; }); |
| 291 return result; | 291 return result; |
| 292 } | 292 } |
| 293 | 293 |
| 294 /** | 294 /** |
| 295 * Creates a [SplayTreeMap] where the keys and values are computed from the | 295 * Creates a [SplayTreeMap] where the keys and values are computed from the |
| 296 * [iterable]. | 296 * [iterable]. |
| 297 * | 297 * |
| 298 * For each element of the [iterable] this constructor computes a key/value | 298 * For each element of the [iterable] this constructor computes a key/value |
| 299 * pair, by applying [key] and [value] respectively. | 299 * pair, by applying [key] and [value] respectively. |
| 300 * | 300 * |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 332 return map; | 332 return map; |
| 333 } | 333 } |
| 334 | 334 |
| 335 int _compare(K key1, K key2) => _comparator(key1, key2); | 335 int _compare(K key1, K key2) => _comparator(key1, key2); |
| 336 | 336 |
| 337 SplayTreeMap._internal(); | 337 SplayTreeMap._internal(); |
| 338 | 338 |
| 339 V operator [](Object key) { | 339 V operator [](Object key) { |
| 340 if (!_validKey(key)) return null; | 340 if (!_validKey(key)) return null; |
| 341 if (_root != null) { | 341 if (_root != null) { |
| 342 int comp = _splay(key as K); | 342 int comp = _splay(key as dynamic/*=K*/); |
| 343 if (comp == 0) { | 343 if (comp == 0) { |
| 344 return _root.value; | 344 return _root.value; |
| 345 } | 345 } |
| 346 } | 346 } |
| 347 return null; | 347 return null; |
| 348 } | 348 } |
| 349 | 349 |
| 350 V remove(Object key) { | 350 V remove(Object key) { |
| 351 if (!_validKey(key)) return null; | 351 if (!_validKey(key)) return null; |
| 352 _SplayTreeMapNode<K, V> mapRoot = _remove(key as K); | 352 _SplayTreeMapNode<K, V> mapRoot = _remove(key as dynamic/*=K*/); |
| 353 if (mapRoot != null) return mapRoot.value; | 353 if (mapRoot != null) return mapRoot.value; |
| 354 return null; | 354 return null; |
| 355 } | 355 } |
| 356 | 356 |
| 357 void operator []=(K key, V value) { | 357 void operator []=(K key, V value) { |
| 358 if (key == null) throw new ArgumentError(key); | 358 if (key == null) throw new ArgumentError(key); |
| 359 // Splay on the key to move the last node on the search path for | 359 // Splay on the key to move the last node on the search path for |
| 360 // the key to the root of the tree. | 360 // the key to the root of the tree. |
| 361 int comp = _splay(key); | 361 int comp = _splay(key); |
| 362 if (comp == 0) { | 362 if (comp == 0) { |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 409 | 409 |
| 410 int get length { | 410 int get length { |
| 411 return _count; | 411 return _count; |
| 412 } | 412 } |
| 413 | 413 |
| 414 void clear() { | 414 void clear() { |
| 415 _clear(); | 415 _clear(); |
| 416 } | 416 } |
| 417 | 417 |
| 418 bool containsKey(Object key) { | 418 bool containsKey(Object key) { |
| 419 return _validKey(key) && _splay(key as K) == 0; | 419 return _validKey(key) && _splay(key as dynamic/*=K*/) == 0; |
| 420 } | 420 } |
| 421 | 421 |
| 422 bool containsValue(Object value) { | 422 bool containsValue(Object value) { |
| 423 bool found = false; | 423 bool found = false; |
| 424 int initialSplayCount = _splayCount; | 424 int initialSplayCount = _splayCount; |
| 425 bool visit(_SplayTreeMapNode node) { | 425 bool visit(_SplayTreeMapNode node) { |
| 426 while (node != null) { | 426 while (node != null) { |
| 427 if (node.value == value) return true; | 427 if (node.value == value) return true; |
| 428 if (initialSplayCount != _splayCount) { | 428 if (initialSplayCount != _splayCount) { |
| 429 throw new ConcurrentModificationError(this); | 429 throw new ConcurrentModificationError(this); |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 634 } | 634 } |
| 635 | 635 |
| 636 class _SplayTreeKeyIterator<K> extends _SplayTreeIterator<K, K> { | 636 class _SplayTreeKeyIterator<K> extends _SplayTreeIterator<K, K> { |
| 637 _SplayTreeKeyIterator(_SplayTree<K, _SplayTreeNode<K>> map): super(map); | 637 _SplayTreeKeyIterator(_SplayTree<K, _SplayTreeNode<K>> map): super(map); |
| 638 K _getValue(_SplayTreeNode<K> node) => node.key; | 638 K _getValue(_SplayTreeNode<K> node) => node.key; |
| 639 } | 639 } |
| 640 | 640 |
| 641 class _SplayTreeValueIterator<K, V> extends _SplayTreeIterator<K, V> { | 641 class _SplayTreeValueIterator<K, V> extends _SplayTreeIterator<K, V> { |
| 642 _SplayTreeValueIterator(SplayTreeMap<K, V> map): super(map); | 642 _SplayTreeValueIterator(SplayTreeMap<K, V> map): super(map); |
| 643 V _getValue(_SplayTreeNode<K> node) { | 643 V _getValue(_SplayTreeNode<K> node) { |
| 644 _SplayTreeMapNode<K, V> mapNode = node as _SplayTreeMapNode<K, V>; | 644 _SplayTreeMapNode<K, V> mapNode = |
| 645 node as dynamic/*=_SplayTreeMapNode<K, V>*/; |
| 645 return mapNode.value; | 646 return mapNode.value; |
| 646 } | 647 } |
| 647 } | 648 } |
| 648 | 649 |
| 649 class _SplayTreeNodeIterator<K> | 650 class _SplayTreeNodeIterator<K> |
| 650 extends _SplayTreeIterator<K, _SplayTreeNode<K>> { | 651 extends _SplayTreeIterator<K, _SplayTreeNode<K>> { |
| 651 _SplayTreeNodeIterator(_SplayTree<K, _SplayTreeNode<K>> tree): super(tree); | 652 _SplayTreeNodeIterator(_SplayTree<K, _SplayTreeNode<K>> tree): super(tree); |
| 652 _SplayTreeNodeIterator.startAt( | 653 _SplayTreeNodeIterator.startAt( |
| 653 _SplayTree<K, _SplayTreeNode<K>> tree, K startKey) | 654 _SplayTree<K, _SplayTreeNode<K>> tree, K startKey) |
| 654 : super.startAt(tree, startKey); | 655 : super.startAt(tree, startKey); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 698 * | 699 * |
| 699 * If [isValidKey] is provided, only values satisfying `isValidKey(other)` | 700 * If [isValidKey] is provided, only values satisfying `isValidKey(other)` |
| 700 * are compared using the `compare` method in the methods mentioned above. | 701 * are compared using the `compare` method in the methods mentioned above. |
| 701 * If the `isValidKey` function returns false for an object, it is assumed to | 702 * If the `isValidKey` function returns false for an object, it is assumed to |
| 702 * not be in the set. | 703 * not be in the set. |
| 703 * | 704 * |
| 704 * If omitted, the `isValidKey` function defaults to checking against the | 705 * If omitted, the `isValidKey` function defaults to checking against the |
| 705 * type parameter: `other is E`. | 706 * type parameter: `other is E`. |
| 706 */ | 707 */ |
| 707 SplayTreeSet([int compare(E key1, E key2), bool isValidKey(potentialKey)]) | 708 SplayTreeSet([int compare(E key1, E key2), bool isValidKey(potentialKey)]) |
| 708 : _comparator = compare ?? Comparable.compare as Comparator<E>, | 709 : _comparator = |
| 710 compare ?? Comparable.compare as dynamic/*=Comparator<E>*/, |
| 709 _validKey = isValidKey ?? ((v) => v is E); | 711 _validKey = isValidKey ?? ((v) => v is E); |
| 710 | 712 |
| 711 /** | 713 /** |
| 712 * Creates a [SplayTreeSet] that contains all [elements]. | 714 * Creates a [SplayTreeSet] that contains all [elements]. |
| 713 * | 715 * |
| 714 * The set works as if created by `new SplayTreeSet<E>(compare, isValidKey)`. | 716 * The set works as if created by `new SplayTreeSet<E>(compare, isValidKey)`. |
| 715 * | 717 * |
| 716 * All the [elements] should be valid as arguments to the [compare] function. | 718 * All the [elements] should be valid as arguments to the [compare] function. |
| 717 */ | 719 */ |
| 718 factory SplayTreeSet.from(Iterable elements, | 720 factory SplayTreeSet.from(Iterable elements, |
| 719 [int compare(E key1, E key2), | 721 [int compare(E key1, E key2), |
| 720 bool isValidKey(potentialKey)]) { | 722 bool isValidKey(potentialKey)]) { |
| 721 SplayTreeSet<E> result = new SplayTreeSet<E>(compare, isValidKey); | 723 SplayTreeSet<E> result = new SplayTreeSet<E>(compare, isValidKey); |
| 722 for (final element in elements) { | 724 for (final element in elements) { |
| 723 result.add(element as E); | 725 E e = element as Object/*=E*/; |
| 726 result.add(e); |
| 724 } | 727 } |
| 725 return result; | 728 return result; |
| 726 } | 729 } |
| 727 | 730 |
| 728 int _compare(E e1, E e2) => _comparator(e1, e2); | 731 int _compare(E e1, E e2) => _comparator(e1, e2); |
| 729 | 732 |
| 730 // From Iterable. | 733 // From Iterable. |
| 731 | 734 |
| 732 Iterator<E> get iterator => new _SplayTreeKeyIterator<E>(this); | 735 Iterator<E> get iterator => new _SplayTreeKeyIterator<E>(this); |
| 733 | 736 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 746 } | 749 } |
| 747 | 750 |
| 748 E get single { | 751 E get single { |
| 749 if (_count == 0) throw IterableElementError.noElement(); | 752 if (_count == 0) throw IterableElementError.noElement(); |
| 750 if (_count > 1) throw IterableElementError.tooMany(); | 753 if (_count > 1) throw IterableElementError.tooMany(); |
| 751 return _root.key; | 754 return _root.key; |
| 752 } | 755 } |
| 753 | 756 |
| 754 // From Set. | 757 // From Set. |
| 755 bool contains(Object object) { | 758 bool contains(Object object) { |
| 756 return _validKey(object) && _splay(object as E) == 0; | 759 return _validKey(object) && _splay(object as dynamic/*=E*/) == 0; |
| 757 } | 760 } |
| 758 | 761 |
| 759 bool add(E element) { | 762 bool add(E element) { |
| 760 int compare = _splay(element); | 763 int compare = _splay(element); |
| 761 if (compare == 0) return false; | 764 if (compare == 0) return false; |
| 762 _addNewRoot(new _SplayTreeNode(element), compare); | 765 _addNewRoot(new _SplayTreeNode(element), compare); |
| 763 return true; | 766 return true; |
| 764 } | 767 } |
| 765 | 768 |
| 766 bool remove(Object object) { | 769 bool remove(Object object) { |
| 767 if (!_validKey(object)) return false; | 770 if (!_validKey(object)) return false; |
| 768 return _remove(object as E) != null; | 771 return _remove(object as dynamic/*=E*/) != null; |
| 769 } | 772 } |
| 770 | 773 |
| 771 void addAll(Iterable<E> elements) { | 774 void addAll(Iterable<E> elements) { |
| 772 for (E element in elements) { | 775 for (E element in elements) { |
| 773 int compare = _splay(element); | 776 int compare = _splay(element); |
| 774 if (compare != 0) { | 777 if (compare != 0) { |
| 775 _addNewRoot(new _SplayTreeNode(element), compare); | 778 _addNewRoot(new _SplayTreeNode(element), compare); |
| 776 } | 779 } |
| 777 } | 780 } |
| 778 } | 781 } |
| 779 | 782 |
| 780 void removeAll(Iterable<Object> elements) { | 783 void removeAll(Iterable<Object> elements) { |
| 781 for (Object element in elements) { | 784 for (Object element in elements) { |
| 782 if (_validKey(element)) _remove(element as E); | 785 if (_validKey(element)) _remove(element as dynamic/*=E*/); |
| 783 } | 786 } |
| 784 } | 787 } |
| 785 | 788 |
| 786 void retainAll(Iterable<Object> elements) { | 789 void retainAll(Iterable<Object> elements) { |
| 787 // Build a set with the same sense of equality as this set. | 790 // Build a set with the same sense of equality as this set. |
| 788 SplayTreeSet<E> retainSet = new SplayTreeSet<E>(_comparator, _validKey); | 791 SplayTreeSet<E> retainSet = new SplayTreeSet<E>(_comparator, _validKey); |
| 789 int modificationCount = _modificationCount; | 792 int modificationCount = _modificationCount; |
| 790 for (Object object in elements) { | 793 for (Object object in elements) { |
| 791 if (modificationCount != _modificationCount) { | 794 if (modificationCount != _modificationCount) { |
| 792 // The iterator should not have side effects. | 795 // The iterator should not have side effects. |
| 793 throw new ConcurrentModificationError(this); | 796 throw new ConcurrentModificationError(this); |
| 794 } | 797 } |
| 795 // Equivalent to this.contains(object). | 798 // Equivalent to this.contains(object). |
| 796 if (_validKey(object) && _splay(object as E) == 0) { | 799 if (_validKey(object) && _splay(object as dynamic/*=E*/) == 0) { |
| 797 retainSet.add(_root.key); | 800 retainSet.add(_root.key); |
| 798 } | 801 } |
| 799 } | 802 } |
| 800 // Take over the elements from the retained set, if it differs. | 803 // Take over the elements from the retained set, if it differs. |
| 801 if (retainSet._count != _count) { | 804 if (retainSet._count != _count) { |
| 802 _root = retainSet._root; | 805 _root = retainSet._root; |
| 803 _count = retainSet._count; | 806 _count = retainSet._count; |
| 804 _modificationCount++; | 807 _modificationCount++; |
| 805 } | 808 } |
| 806 } | 809 } |
| 807 | 810 |
| 808 E lookup(Object object) { | 811 E lookup(Object object) { |
| 809 if (!_validKey(object)) return null; | 812 if (!_validKey(object)) return null; |
| 810 int comp = _splay(object as E); | 813 int comp = _splay(object as dynamic/*=E*/); |
| 811 if (comp != 0) return null; | 814 if (comp != 0) return null; |
| 812 return _root.key; | 815 return _root.key; |
| 813 } | 816 } |
| 814 | 817 |
| 815 Set<E> intersection(Set<Object> other) { | 818 Set<E> intersection(Set<Object> other) { |
| 816 Set<E> result = new SplayTreeSet<E>(_comparator, _validKey); | 819 Set<E> result = new SplayTreeSet<E>(_comparator, _validKey); |
| 817 for (E element in this) { | 820 for (E element in this) { |
| 818 if (other.contains(element)) result.add(element); | 821 if (other.contains(element)) result.add(element); |
| 819 } | 822 } |
| 820 return result; | 823 return result; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 846 return new _SplayTreeNode<E>(node.key)..left = _copyNode(node.left) | 849 return new _SplayTreeNode<E>(node.key)..left = _copyNode(node.left) |
| 847 ..right = _copyNode(node.right); | 850 ..right = _copyNode(node.right); |
| 848 } | 851 } |
| 849 | 852 |
| 850 void clear() { _clear(); } | 853 void clear() { _clear(); } |
| 851 | 854 |
| 852 Set<E> toSet() => _clone(); | 855 Set<E> toSet() => _clone(); |
| 853 | 856 |
| 854 String toString() => IterableBase.iterableToFullString(this, '{', '}'); | 857 String toString() => IterableBase.iterableToFullString(this, '{', '}'); |
| 855 } | 858 } |
| OLD | NEW |