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

Unified Diff: sdk/lib/collection/splay_tree.dart

Issue 1937103002: Make dart:collection strong-mode clean. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: rebase Created 4 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 side-by-side diff with in-line comments
Download patch
Index: sdk/lib/collection/splay_tree.dart
diff --git a/sdk/lib/collection/splay_tree.dart b/sdk/lib/collection/splay_tree.dart
index 223e58ca30d5b7f19a9d90f6be89e14d9d8ec646..72a2f5293b90c4c9879b273d24afe07ed9bc9b7d 100644
--- a/sdk/lib/collection/splay_tree.dart
+++ b/sdk/lib/collection/splay_tree.dart
@@ -36,14 +36,15 @@ class _SplayTreeMapNode<K, V> extends _SplayTreeNode<K> {
* It performs basic operations such as insertion, look-up and
* removal, in O(log(n)) amortized time.
*/
-abstract class _SplayTree<K> {
+abstract class _SplayTree<K, Node extends _SplayTreeNode<K>> {
// The root node of the splay tree. It will contain either the last
// element inserted or the last element looked up.
- _SplayTreeNode<K> _root;
+ Node get _root;
+ set _root(Node newValue);
// The dummy node used when performing a splay on the tree. Reusing it
// avoids allocating a node each time a splay is performed.
- _SplayTreeNode<K> _dummy = new _SplayTreeNode<K>(null);
+ Node get _dummy;
// Number of elements in the splay tree.
int _count = 0;
@@ -63,6 +64,12 @@ abstract class _SplayTree<K> {
*/
int _splayCount = 0;
+ /** The comparator that is used for this splay tree. */
+ Comparator<K> get _comparator;
+
+ /** The predicate to determine that a given object is a valid key. */
+ _Predicate get _validKey;
+
/** Comparison used to compare keys. */
int _compare(K key1, K key2);
@@ -83,9 +90,9 @@ abstract class _SplayTree<K> {
// the L tree of the algorithm. The left child of the dummy node
// will hold the R tree of the algorithm. Using a dummy node, left
// and right will always be nodes and we avoid special cases.
- _SplayTreeNode<K> left = _dummy;
- _SplayTreeNode<K> right = _dummy;
- _SplayTreeNode<K> current = _root;
+ Node left = _dummy;
+ Node right = _dummy;
+ Node current = _root;
int comp;
while (true) {
comp = _compare(current.key, key);
@@ -109,7 +116,7 @@ abstract class _SplayTree<K> {
comp = _compare(current.right.key, key);
if (comp < 0) {
// Rotate left.
- _SplayTreeNode<K> tmp = current.right;
+ Node tmp = current.right;
current.right = tmp.left;
tmp.left = current;
current = tmp;
@@ -140,10 +147,10 @@ abstract class _SplayTree<K> {
// anchored at [node].
// and that node is returned. It should replace the reference to [node]
// in any parent tree or root pointer.
- _SplayTreeNode<K> _splayMin(_SplayTreeNode<K> node) {
- _SplayTreeNode current = node;
+ Node _splayMin(Node node) {
+ Node current = node;
while (current.left != null) {
- _SplayTreeNode left = current.left;
+ Node left = current.left;
current.left = left.right;
left.right = current;
current = left;
@@ -156,10 +163,10 @@ abstract class _SplayTree<K> {
// After this, the largest element in the tree is the root of the subtree,
// and that node is returned. It should replace the reference to [node]
// in any parent tree or root pointer.
- _SplayTreeNode<K> _splayMax(_SplayTreeNode<K> node) {
- _SplayTreeNode current = node;
+ Node _splayMax(Node node) {
+ Node current = node;
while (current.right != null) {
- _SplayTreeNode right = current.right;
+ Node right = current.right;
current.right = right.left;
right.left = current;
current = right;
@@ -167,17 +174,17 @@ abstract class _SplayTree<K> {
return current;
}
- _SplayTreeNode _remove(K key) {
+ Node _remove(K key) {
if (_root == null) return null;
int comp = _splay(key);
if (comp != 0) return null;
- _SplayTreeNode result = _root;
+ Node result = _root;
_count--;
// assert(_count >= 0);
if (_root.left == null) {
_root = _root.right;
} else {
- _SplayTreeNode<K> right = _root.right;
+ Node right = _root.right;
// Splay to make sure that the new root has an empty right child.
_root = _splayMax(_root.left);
// Insert the original right child as the right child of the new
@@ -194,7 +201,7 @@ abstract class _SplayTree<K> {
* The [comp] value is the result of comparing the existing root's key
* with key.
*/
- void _addNewRoot(_SplayTreeNode<K> node, int comp) {
+ void _addNewRoot(Node node, int comp) {
_count++;
_modificationCount++;
if (_root == null) {
@@ -214,13 +221,13 @@ abstract class _SplayTree<K> {
_root = node;
}
- _SplayTreeNode get _first {
+ Node get _first {
if (_root == null) return null;
_root = _splayMin(_root);
return _root;
}
- _SplayTreeNode get _last {
+ Node get _last {
if (_root == null) return null;
_root = _splayMax(_root);
return _root;
@@ -260,13 +267,18 @@ class _TypeTest<T> {
* value. If omitted, the `isValidKey` function defaults to testing if the
* value is a [K].
*/
-class SplayTreeMap<K, V> extends _SplayTree<K> implements Map<K, V> {
+class SplayTreeMap<K, V> extends _SplayTree<K, _SplayTreeMapNode<K, V>>
+ implements Map<K, V> {
+ _SplayTreeMapNode<K, V> _root;
+ final _SplayTreeMapNode<K, V> _dummy =
+ new _SplayTreeMapNode<K, V>(null, null);
+
Comparator<K> _comparator;
_Predicate _validKey;
SplayTreeMap([int compare(K key1, K key2), bool isValidKey(potentialKey)])
- : _comparator = (compare == null) ? Comparable.compare : compare,
- _validKey = (isValidKey != null) ? isValidKey : ((v) => v is K);
+ : _comparator = compare ?? Comparable.compare as Comparator<K>,
+ _validKey = isValidKey ?? ((v) => v is K);
/**
* Creates a [SplayTreeMap] that contains all key/value pairs of [other].
@@ -275,7 +287,7 @@ class SplayTreeMap<K, V> extends _SplayTree<K> implements Map<K, V> {
[int compare(K key1, K key2),
bool isValidKey(potentialKey)]) {
SplayTreeMap<K, V> result = new SplayTreeMap<K, V>(compare, isValidKey);
- other.forEach((k, v) { result[k] = v; });
+ other.forEach((k, v) { result[k as Object/*=K*/] = v as Object/*=V*/; });
return result;
}
@@ -327,10 +339,9 @@ class SplayTreeMap<K, V> extends _SplayTree<K> implements Map<K, V> {
V operator [](Object key) {
if (!_validKey(key)) return null;
if (_root != null) {
- int comp = _splay(key);
+ int comp = _splay(key as dynamic/*=K*/);
if (comp == 0) {
- _SplayTreeMapNode mapRoot = _root;
- return mapRoot.value;
+ return _root.value;
}
}
return null;
@@ -338,7 +349,7 @@ class SplayTreeMap<K, V> extends _SplayTree<K> implements Map<K, V> {
V remove(Object key) {
if (!_validKey(key)) return null;
- _SplayTreeMapNode mapRoot = _remove(key);
+ _SplayTreeMapNode<K, V> mapRoot = _remove(key as dynamic/*=K*/);
if (mapRoot != null) return mapRoot.value;
return null;
}
@@ -349,8 +360,7 @@ class SplayTreeMap<K, V> extends _SplayTree<K> implements Map<K, V> {
// the key to the root of the tree.
int comp = _splay(key);
if (comp == 0) {
- _SplayTreeMapNode mapRoot = _root;
- mapRoot.value = value;
+ _root.value = value;
return;
}
_addNewRoot(new _SplayTreeMapNode(key, value), comp);
@@ -361,8 +371,7 @@ class SplayTreeMap<K, V> extends _SplayTree<K> implements Map<K, V> {
if (key == null) throw new ArgumentError(key);
int comp = _splay(key);
if (comp == 0) {
- _SplayTreeMapNode mapRoot = _root;
- return mapRoot.value;
+ return _root.value;
}
int modificationCount = _modificationCount;
int splayCount = _splayCount;
@@ -407,7 +416,7 @@ class SplayTreeMap<K, V> extends _SplayTree<K> implements Map<K, V> {
}
bool containsKey(Object key) {
- return _validKey(key) && _splay(key) == 0;
+ return _validKey(key) && _splay(key as dynamic/*=K*/) == 0;
}
bool containsValue(Object value) {
@@ -486,8 +495,8 @@ class SplayTreeMap<K, V> extends _SplayTree<K> implements Map<K, V> {
}
}
-abstract class _SplayTreeIterator<T> implements Iterator<T> {
- final _SplayTree _tree;
+abstract class _SplayTreeIterator<K, T> implements Iterator<T> {
+ final _SplayTree<K, _SplayTreeNode<K>> _tree;
/**
* Worklist of nodes to visit.
*
@@ -498,7 +507,7 @@ abstract class _SplayTreeIterator<T> implements Iterator<T> {
*
* Only valid as long as the original tree isn't reordered.
*/
- final List<_SplayTreeNode> _workList = <_SplayTreeNode>[];
+ final List<_SplayTreeNode<K>> _workList = <_SplayTreeNode<K>>[];
/**
* Original modification counter of [_tree].
@@ -519,16 +528,16 @@ abstract class _SplayTreeIterator<T> implements Iterator<T> {
int _splayCount;
/** Current node. */
- _SplayTreeNode _currentNode;
+ _SplayTreeNode<K> _currentNode;
- _SplayTreeIterator(_SplayTree tree)
+ _SplayTreeIterator(_SplayTree<K, _SplayTreeNode<K>> tree)
: _tree = tree,
_modificationCount = tree._modificationCount,
_splayCount = tree._splayCount {
_findLeftMostDescendent(tree._root);
}
- _SplayTreeIterator.startAt(_SplayTree tree, var startKey)
+ _SplayTreeIterator.startAt(_SplayTree<K, _SplayTreeNode<K>> tree, K startKey)
: _tree = tree,
_modificationCount = tree._modificationCount {
if (tree._root == null) return;
@@ -547,7 +556,7 @@ abstract class _SplayTreeIterator<T> implements Iterator<T> {
return _getValue(_currentNode);
}
- void _findLeftMostDescendent(_SplayTreeNode node) {
+ void _findLeftMostDescendent(_SplayTreeNode<K> node) {
while (node != null) {
_workList.add(node);
node = node.left;
@@ -562,7 +571,7 @@ abstract class _SplayTreeIterator<T> implements Iterator<T> {
* here, so we know that the keys are the same as before, it's
* only the tree that has been reordered.
*/
- void _rebuildWorkList(_SplayTreeNode currentNode) {
+ void _rebuildWorkList(_SplayTreeNode<K> currentNode) {
assert(!_workList.isEmpty);
_workList.clear();
if (currentNode == null) {
@@ -595,21 +604,20 @@ abstract class _SplayTreeIterator<T> implements Iterator<T> {
return true;
}
- T _getValue(_SplayTreeNode node);
+ T _getValue(_SplayTreeNode<K> node);
}
class _SplayTreeKeyIterable<K> extends Iterable<K>
implements EfficientLength {
- _SplayTree<K> _tree;
+ _SplayTree<K, _SplayTreeNode<K>> _tree;
_SplayTreeKeyIterable(this._tree);
int get length => _tree._count;
bool get isEmpty => _tree._count == 0;
Iterator<K> get iterator => new _SplayTreeKeyIterator<K>(_tree);
Set<K> toSet() {
- var setOrMap = _tree; // Both have _comparator and _validKey.
SplayTreeSet<K> set =
- new SplayTreeSet<K>(setOrMap._comparator, setOrMap._validKey);
+ new SplayTreeSet<K>(_tree._comparator, _tree._validKey);
set._count = _tree._count;
set._root = set._copyNode(_tree._root);
return set;
@@ -625,22 +633,27 @@ class _SplayTreeValueIterable<K, V> extends Iterable<V>
Iterator<V> get iterator => new _SplayTreeValueIterator<K, V>(_map);
}
-class _SplayTreeKeyIterator<K> extends _SplayTreeIterator<K> {
- _SplayTreeKeyIterator(_SplayTree<K> map): super(map);
- K _getValue(_SplayTreeNode node) => node.key;
+class _SplayTreeKeyIterator<K> extends _SplayTreeIterator<K, K> {
+ _SplayTreeKeyIterator(_SplayTree<K, _SplayTreeNode<K>> map): super(map);
+ K _getValue(_SplayTreeNode<K> node) => node.key;
}
-class _SplayTreeValueIterator<K, V> extends _SplayTreeIterator<V> {
+class _SplayTreeValueIterator<K, V> extends _SplayTreeIterator<K, V> {
_SplayTreeValueIterator(SplayTreeMap<K, V> map): super(map);
- V _getValue(_SplayTreeMapNode node) => node.value;
+ V _getValue(_SplayTreeNode<K> node) {
+ _SplayTreeMapNode<K, V> mapNode =
+ node as dynamic/*=_SplayTreeMapNode<K, V>*/;
+ return mapNode.value;
+ }
}
class _SplayTreeNodeIterator<K>
- extends _SplayTreeIterator<_SplayTreeNode<K>> {
- _SplayTreeNodeIterator(_SplayTree<K> tree): super(tree);
- _SplayTreeNodeIterator.startAt(_SplayTree<K> tree, var startKey)
+ extends _SplayTreeIterator<K, _SplayTreeNode<K>> {
+ _SplayTreeNodeIterator(_SplayTree<K, _SplayTreeNode<K>> tree): super(tree);
+ _SplayTreeNodeIterator.startAt(
+ _SplayTree<K, _SplayTreeNode<K>> tree, K startKey)
: super.startAt(tree, startKey);
- _SplayTreeNode<K> _getValue(_SplayTreeNode node) => node;
+ _SplayTreeNode<K> _getValue(_SplayTreeNode<K> node) => node;
}
@@ -660,8 +673,12 @@ class _SplayTreeNodeIterator<K>
* Non-comparable objects (including `null`) will not work as an element
* in that case.
*/
-class SplayTreeSet<E> extends _SplayTree<E> with IterableMixin<E>, SetMixin<E> {
- Comparator _comparator;
+class SplayTreeSet<E> extends _SplayTree<E, _SplayTreeNode<E>>
+ with IterableMixin<E>, SetMixin<E> {
+ _SplayTreeNode<E> _root;
+ final _SplayTreeNode<E> _dummy = new _SplayTreeNode<E>(null);
+
+ Comparator<E> _comparator;
_Predicate _validKey;
/**
@@ -689,8 +706,9 @@ class SplayTreeSet<E> extends _SplayTree<E> with IterableMixin<E>, SetMixin<E> {
* type parameter: `other is E`.
*/
SplayTreeSet([int compare(E key1, E key2), bool isValidKey(potentialKey)])
- : _comparator = (compare == null) ? Comparable.compare : compare,
- _validKey = (isValidKey != null) ? isValidKey : ((v) => v is E);
+ : _comparator =
+ compare ?? Comparable.compare as dynamic/*=Comparator<E>*/,
+ _validKey = isValidKey ?? ((v) => v is E);
/**
* Creates a [SplayTreeSet] that contains all [elements].
@@ -703,8 +721,9 @@ class SplayTreeSet<E> extends _SplayTree<E> with IterableMixin<E>, SetMixin<E> {
[int compare(E key1, E key2),
bool isValidKey(potentialKey)]) {
SplayTreeSet<E> result = new SplayTreeSet<E>(compare, isValidKey);
- for (final E element in elements) {
- result.add(element);
+ for (final element in elements) {
+ E e = element as Object/*=E*/;
+ result.add(e);
}
return result;
}
@@ -737,7 +756,7 @@ class SplayTreeSet<E> extends _SplayTree<E> with IterableMixin<E>, SetMixin<E> {
// From Set.
bool contains(Object object) {
- return _validKey(object) && _splay(object) == 0;
+ return _validKey(object) && _splay(object as dynamic/*=E*/) == 0;
}
bool add(E element) {
@@ -749,7 +768,7 @@ class SplayTreeSet<E> extends _SplayTree<E> with IterableMixin<E>, SetMixin<E> {
bool remove(Object object) {
if (!_validKey(object)) return false;
- return _remove(object) != null;
+ return _remove(object as dynamic/*=E*/) != null;
}
void addAll(Iterable<E> elements) {
@@ -763,7 +782,7 @@ class SplayTreeSet<E> extends _SplayTree<E> with IterableMixin<E>, SetMixin<E> {
void removeAll(Iterable<Object> elements) {
for (Object element in elements) {
- if (_validKey(element)) _remove(element);
+ if (_validKey(element)) _remove(element as dynamic/*=E*/);
}
}
@@ -777,7 +796,9 @@ class SplayTreeSet<E> extends _SplayTree<E> with IterableMixin<E>, SetMixin<E> {
throw new ConcurrentModificationError(this);
}
// Equivalent to this.contains(object).
- if (_validKey(object) && _splay(object) == 0) retainSet.add(_root.key);
+ if (_validKey(object) && _splay(object as dynamic/*=E*/) == 0) {
+ retainSet.add(_root.key);
+ }
}
// Take over the elements from the retained set, if it differs.
if (retainSet._count != _count) {
@@ -789,12 +810,12 @@ class SplayTreeSet<E> extends _SplayTree<E> with IterableMixin<E>, SetMixin<E> {
E lookup(Object object) {
if (!_validKey(object)) return null;
- int comp = _splay(object);
+ int comp = _splay(object as dynamic/*=E*/);
if (comp != 0) return null;
return _root.key;
}
- Set<E> intersection(Set<E> other) {
+ Set<E> intersection(Set<Object> other) {
Set<E> result = new SplayTreeSet<E>(_comparator, _validKey);
for (E element in this) {
if (other.contains(element)) result.add(element);
@@ -802,7 +823,7 @@ class SplayTreeSet<E> extends _SplayTree<E> with IterableMixin<E>, SetMixin<E> {
return result;
}
- Set<E> difference(Set<E> other) {
+ Set<E> difference(Set<Object> other) {
Set<E> result = new SplayTreeSet<E>(_comparator, _validKey);
for (E element in this) {
if (!other.contains(element)) result.add(element);

Powered by Google App Engine
This is Rietveld 408576698