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

Unified Diff: lib/coreimpl/splay_tree.dart

Issue 11304007: Move SplayTreeMap from coreimpl to collection. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Fix two HTML tests. Created 8 years, 2 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
« no previous file with comments | « lib/coreimpl/corelib_impl_sources.gypi ('k') | tests/corelib/map_test.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: lib/coreimpl/splay_tree.dart
diff --git a/lib/coreimpl/splay_tree.dart b/lib/coreimpl/splay_tree.dart
deleted file mode 100644
index 974c2bcb78cbb28f0c3fd015ae3645cd26a525f8..0000000000000000000000000000000000000000
--- a/lib/coreimpl/splay_tree.dart
+++ /dev/null
@@ -1,306 +0,0 @@
-// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * A node in a splay tree. It holds the key, the value and the left
- * and right children in the tree.
- */
-class SplayTreeNode<K, V> {
- SplayTreeNode(K this.key, V this.value);
-
- K key;
- V value;
- SplayTreeNode<K, V> left;
- SplayTreeNode<K, V> right;
-}
-
-/**
- * A splay tree is a self-balancing binary
- * search tree with the additional property that recently accessed
- * elements are quick to access again. It performs basic operations
- * such as insertion, look-up and removal in O(log(n)) amortized time.
- *
- * This implementation is a Dart version of the JavaScript
- * implementation in the V8 project.
- */
-class SplayTreeMap<K extends Comparable, V> implements Map<K, V> {
-
- // The root node of the splay tree. It will contain either the last
- // element inserted, or the last element looked up.
- SplayTreeNode<K, V> _root;
-
- // The dummy node used when performing a splay on the tree. It is a
- // local field of the class to avoid allocating a node each time a
- // splay is performed.
- SplayTreeNode<K, V> _dummy;
-
- // Number of elements in the splay tree.
- int _count;
-
- SplayTreeMap() {
- _dummy = new SplayTreeNode<K, V>(null, null);
- _count = 0;
- }
-
- /**
- * Perform the splay operation for the given key. Moves the node with
- * the given key to the top of the tree. If no node has the given
- * key, the last node on the search path is moved to the top of the
- * tree. This is the simplified top-down splaying algorithm from:
- * "Self-adjusting Binary Search Trees" by Sleator and Tarjan.
- */
- void splay_(K key) {
- if (isEmpty) return;
-
- // The right child of the dummy node will hold
- // 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, V> left = _dummy;
- SplayTreeNode<K, V> right = _dummy;
- SplayTreeNode<K, V> current = _root;
- while (true) {
- int comp = key.compareTo(current.key);
- if (comp < 0) {
- if (current.left === null) break;
- if (key.compareTo(current.left.key) < 0) {
- // Rotate right.
- SplayTreeNode<K, V> tmp = current.left;
- current.left = tmp.right;
- tmp.right = current;
- current = tmp;
- if (current.left === null) break;
- }
- // Link right.
- right.left = current;
- right = current;
- current = current.left;
- } else if (comp > 0) {
- if (current.right === null) break;
- if (key.compareTo(current.right.key) > 0) {
- // Rotate left.
- SplayTreeNode<K, V> tmp = current.right;
- current.right = tmp.left;
- tmp.left = current;
- current = tmp;
- if (current.right === null) break;
- }
- // Link left.
- left.right = current;
- left = current;
- current = current.right;
- } else {
- break;
- }
- }
- // Assemble.
- left.right = current.left;
- right.left = current.right;
- current.left = _dummy.right;
- current.right = _dummy.left;
- _root = current;
-
- _dummy.right = null;
- _dummy.left = null;
- }
-
- V operator [](K key) {
- if (!isEmpty) {
- splay_(key);
- if (_root.key.compareTo(key) == 0) return _root.value;
- }
- return null;
- }
-
- V remove(K key) {
- if (isEmpty) return null;
- splay_(key);
- if (_root.key.compareTo(key) != 0) return null;
- V value = _root.value;
-
- _count--;
- // assert(_count >= 0);
- if (_root.left === null) {
- _root = _root.right;
- } else {
- SplayTreeNode<K, V> right = _root.right;
- _root = _root.left;
- // Splay to make sure that the new root has an empty right child.
- splay_(key);
- // Insert the original right child as the right child of the new
- // root.
- _root.right = right;
- }
- return value;
- }
-
- void operator []=(K key, V value) {
- if (isEmpty) {
- _count++;
- _root = new SplayTreeNode(key, value);
- return;
- }
- // Splay on the key to move the last node on the search path for
- // the key to the root of the tree.
- splay_(key);
- if (_root.key.compareTo(key) == 0) {
- _root.value = value;
- return;
- }
- SplayTreeNode<K, V> node = new SplayTreeNode(key, value);
- // assert(_count >= 0);
- _count++;
- if (key.compareTo(_root.key) > 0) {
- node.left = _root;
- node.right = _root.right;
- _root.right = null;
- } else {
- node.right = _root;
- node.left = _root.left;
- _root.left = null;
- }
- _root = node;
- }
-
- V putIfAbsent(K key, V ifAbsent()) {
- if (containsKey(key)) return this[key];
- V value = ifAbsent();
- this[key] = value;
- return value;
- }
-
- bool get isEmpty {
- // assert(!((_root === null) && (_count != 0)));
- // assert(!((_count == 0) && (_root !== null)));
- return (_root === null);
- }
-
- void forEach(void f(K key, V value)) {
- List<SplayTreeNode<K, V>> list = new List<SplayTreeNode<K, V>>();
- SplayTreeNode<K, V> current = _root;
- while (current !== null) {
- if (current.left !== null) {
- list.add(current);
- current = current.left;
- } else {
- f(current.key, current.value);
- while (current.right === null) {
- if (list.isEmpty) return;
- current = list.removeLast();
- f(current.key, current.value);
- }
- current = current.right;
- }
- }
- }
-
- int get length {
- return _count;
- }
-
- void clear() {
- _root = null;
- _count = 0;
- }
-
- bool containsKey(K key) {
- if (!isEmpty) {
- splay_(key);
- if (_root.key.compareTo(key) == 0) return true;
- }
- return false;
- }
-
- bool containsValue(V value) {
- bool found = false;
- bool visit(SplayTreeNode node) {
- if (node === null) return false;
- if (node.value == value) return true;
- return visit(node.left) || visit(node.right);
- }
- return visit(_root);
- }
-
- Collection<K> get keys {
- List<K> list = new List<K>();
- forEach((K k, V v) { list.add(k); });
- return list;
- }
-
- Collection<V> get values {
- List<V> list = new List<V>();
- forEach((K k, V v) { list.add(v); });
- return list;
- }
-
- String toString() {
- return Maps.mapToString(this);
- }
-
- /**
- * Get the first key in the map. Returns [null] if the map is empty.
- */
- K firstKey() {
- if (_root === null) return null;
- SplayTreeNode<K, V> node = _root;
- while (node.left !== null) {
- node = node.left;
- }
- // Maybe implement a splay-method that can splay the minimum without
- // performing comparisons.
- splay_(node.key);
- return node.key;
- }
-
- /**
- * Get the last key in the map. Returns [null] if the map is empty.
- */
- K lastKey() {
- if (_root === null) return null;
- SplayTreeNode<K, V> node = _root;
- while (node.right !== null) {
- node = node.right;
- }
- // Maybe implement a splay-method that can splay the maximum without
- // performing comparisons.
- splay_(node.key);
- return node.key;
- }
-
- /**
- * Get the last key in the map that is strictly smaller than [key]. Returns
- * [null] if no key was not found.
- */
- K lastKeyBefore(K key) {
- splay_(key);
- K visit(SplayTreeNode node, K ifEmpty) {
- if (node === null) return ifEmpty;
- if (node.key.compareTo(key) >= 0) {
- return visit(node.left, ifEmpty);
- }
- if (node.key.compareTo(key) < 0) {
- return visit(node.right, node.key);
- }
- }
- return visit(_root, null);
- }
-
- /**
- * Get the first key in the map that is strictly larger than [key]. Returns
- * [null] if no key was not found.
- */
- K firstKeyAfter(K key) {
- splay_(key);
- K visit(SplayTreeNode node, K ifEmpty) {
- if (node === null) return ifEmpty;
- if (node.key.compareTo(key) > 0) {
- return visit(node.left, node.key);
- }
- if (node.key.compareTo(key) <= 0) {
- return visit(node.right, ifEmpty);
- }
- }
- return visit(_root, null);
- }
-}
« no previous file with comments | « lib/coreimpl/corelib_impl_sources.gypi ('k') | tests/corelib/map_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698