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

Side by Side Diff: sdk/lib/collection/splay_tree.dart

Issue 2877683002: Adjust types in SplayTree implementation and some strong tests to (Closed)
Patch Set: Bind to variable to enable promotion Created 3 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
OLDNEW
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 226 matching lines...) Expand 10 before | Expand all | Expand 10 after
237 _root = null; 237 _root = null;
238 _count = 0; 238 _count = 0;
239 _modificationCount++; 239 _modificationCount++;
240 } 240 }
241 } 241 }
242 242
243 class _TypeTest<T> { 243 class _TypeTest<T> {
244 bool test(v) => v is T; 244 bool test(v) => v is T;
245 } 245 }
246 246
247 int _dynamicCompare(dynamic a, dynamic b) => Comparable.compare(a, b);
248
249 Comparator<K> _defaultCompare<K>() {
250 // If K <: Comparable, then we can just use Comparable.compare
251 // with no casts.
252 Object compare = Comparable.compare;
253 if (compare is Comparator<K>) {
254 return compare;
255 }
256 // Otherwise wrap and cast the arguments on each call.
257 return _dynamicCompare;
258 }
259
247 /** 260 /**
248 * A [Map] of objects that can be ordered relative to each other. 261 * A [Map] of objects that can be ordered relative to each other.
249 * 262 *
250 * The map is based on a self-balancing binary tree. It allows most operations 263 * The map is based on a self-balancing binary tree. It allows most operations
251 * in amortized logarithmic time. 264 * in amortized logarithmic time.
252 * 265 *
253 * Keys of the map are compared using the `compare` function passed in 266 * Keys of the map are compared using the `compare` function passed in
254 * the constructor, both for ordering and for equality. 267 * the constructor, both for ordering and for equality.
255 * If the map contains only the key `a`, then `map.containsKey(b)` 268 * If the map contains only the key `a`, then `map.containsKey(b)`
256 * will return `true` if and only if `compare(a, b) == 0`, 269 * will return `true` if and only if `compare(a, b) == 0`,
(...skipping 13 matching lines...) Expand all
270 class SplayTreeMap<K, V> extends _SplayTree<K, _SplayTreeMapNode<K, V>> 283 class SplayTreeMap<K, V> extends _SplayTree<K, _SplayTreeMapNode<K, V>>
271 implements Map<K, V> { 284 implements Map<K, V> {
272 _SplayTreeMapNode<K, V> _root; 285 _SplayTreeMapNode<K, V> _root;
273 final _SplayTreeMapNode<K, V> _dummy = 286 final _SplayTreeMapNode<K, V> _dummy =
274 new _SplayTreeMapNode<K, V>(null, null); 287 new _SplayTreeMapNode<K, V>(null, null);
275 288
276 Comparator<K> _comparator; 289 Comparator<K> _comparator;
277 _Predicate _validKey; 290 _Predicate _validKey;
278 291
279 SplayTreeMap([int compare(K key1, K key2), bool isValidKey(potentialKey)]) 292 SplayTreeMap([int compare(K key1, K key2), bool isValidKey(potentialKey)])
280 : _comparator = compare ?? Comparable.compare as Comparator<K>, 293 : _comparator = compare ?? _defaultCompare<K>(),
281 _validKey = isValidKey ?? ((v) => v is K); 294 _validKey = isValidKey ?? ((v) => v is K);
282 295
283 /** 296 /**
284 * Creates a [SplayTreeMap] that contains all key/value pairs of [other]. 297 * Creates a [SplayTreeMap] that contains all key/value pairs of [other].
285 */ 298 */
286 factory SplayTreeMap.from(Map other, 299 factory SplayTreeMap.from(Map other,
287 [int compare(K key1, K key2), bool isValidKey(potentialKey)]) { 300 [int compare(K key1, K key2), bool isValidKey(potentialKey)]) {
288 SplayTreeMap<K, V> result = new SplayTreeMap<K, V>(compare, isValidKey); 301 SplayTreeMap<K, V> result = new SplayTreeMap<K, V>(compare, isValidKey);
289 other.forEach((k, v) { 302 other.forEach((k, v) {
290 result[k as Object/*=K*/] = v as Object/*=V*/; 303 result[k as Object/*=K*/] = v as Object/*=V*/;
(...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after
698 * 711 *
699 * If [isValidKey] is provided, only values satisfying `isValidKey(other)` 712 * If [isValidKey] is provided, only values satisfying `isValidKey(other)`
700 * are compared using the `compare` method in the methods mentioned above. 713 * 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 714 * If the `isValidKey` function returns false for an object, it is assumed to
702 * not be in the set. 715 * not be in the set.
703 * 716 *
704 * If omitted, the `isValidKey` function defaults to checking against the 717 * If omitted, the `isValidKey` function defaults to checking against the
705 * type parameter: `other is E`. 718 * type parameter: `other is E`.
706 */ 719 */
707 SplayTreeSet([int compare(E key1, E key2), bool isValidKey(potentialKey)]) 720 SplayTreeSet([int compare(E key1, E key2), bool isValidKey(potentialKey)])
708 : _comparator = 721 : _comparator = compare ?? _defaultCompare<E>(),
709 compare ?? Comparable.compare as dynamic/*=Comparator<E>*/,
710 _validKey = isValidKey ?? ((v) => v is E); 722 _validKey = isValidKey ?? ((v) => v is E);
711 723
712 /** 724 /**
713 * Creates a [SplayTreeSet] that contains all [elements]. 725 * Creates a [SplayTreeSet] that contains all [elements].
714 * 726 *
715 * The set works as if created by `new SplayTreeSet<E>(compare, isValidKey)`. 727 * The set works as if created by `new SplayTreeSet<E>(compare, isValidKey)`.
716 * 728 *
717 * All the [elements] should be valid as arguments to the [compare] function. 729 * All the [elements] should be valid as arguments to the [compare] function.
718 */ 730 */
719 factory SplayTreeSet.from(Iterable elements, 731 factory SplayTreeSet.from(Iterable elements,
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
850 } 862 }
851 863
852 void clear() { 864 void clear() {
853 _clear(); 865 _clear();
854 } 866 }
855 867
856 Set<E> toSet() => _clone(); 868 Set<E> toSet() => _clone();
857 869
858 String toString() => IterableBase.iterableToFullString(this, '{', '}'); 870 String toString() => IterableBase.iterableToFullString(this, '{', '}');
859 } 871 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698