aboutsummaryrefslogtreecommitdiff
path: root/contexts/data/lib/closure-library/closure/goog/structs/treenode.js
diff options
context:
space:
mode:
Diffstat (limited to 'contexts/data/lib/closure-library/closure/goog/structs/treenode.js')
-rw-r--r--contexts/data/lib/closure-library/closure/goog/structs/treenode.js428
1 files changed, 0 insertions, 428 deletions
diff --git a/contexts/data/lib/closure-library/closure/goog/structs/treenode.js b/contexts/data/lib/closure-library/closure/goog/structs/treenode.js
deleted file mode 100644
index 8e58c12..0000000
--- a/contexts/data/lib/closure-library/closure/goog/structs/treenode.js
+++ /dev/null
@@ -1,428 +0,0 @@
-// Copyright 2010 The Closure Library Authors. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS-IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-/**
- * @fileoverview Generic tree node data structure with arbitrary number of child
- * nodes.
- *
- */
-
-goog.provide('goog.structs.TreeNode');
-
-goog.require('goog.array');
-goog.require('goog.asserts');
-goog.require('goog.structs.Node');
-
-
-
-/**
- * Generic tree node data structure with arbitrary number of child nodes.
- * It is possible to create a dynamic tree structure by overriding
- * {@link #getParent} and {@link #getChildren} in a subclass. All other getters
- * will automatically work.
- *
- * @param {*} key Key.
- * @param {*} value Value.
- * @constructor
- * @extends {goog.structs.Node}
- */
-goog.structs.TreeNode = function(key, value) {
- goog.structs.Node.call(this, key, value);
-};
-goog.inherits(goog.structs.TreeNode, goog.structs.Node);
-
-
-/**
- * Constant for empty array to avoid unnecessary allocations.
- * @private
- */
-goog.structs.TreeNode.EMPTY_ARRAY_ = [];
-
-
-/**
- * Reference to the parent node or null if it has no parent.
- * @type {goog.structs.TreeNode}
- * @private
- */
-goog.structs.TreeNode.prototype.parent_ = null;
-
-
-/**
- * Child nodes or null in case of leaf node.
- * @type {Array.<!goog.structs.TreeNode>}
- * @private
- */
-goog.structs.TreeNode.prototype.children_ = null;
-
-
-/**
- * @return {!goog.structs.TreeNode} Clone of the tree node without its parent
- * and child nodes. The key and the value are copied by reference.
- * @override
- */
-goog.structs.TreeNode.prototype.clone = function() {
- return new goog.structs.TreeNode(this.getKey(), this.getValue());
-};
-
-
-/**
- * @return {!goog.structs.TreeNode} Clone of the subtree with this node as root.
- */
-goog.structs.TreeNode.prototype.deepClone = function() {
- var clone = this.clone();
- this.forEachChild(function(child) {
- clone.addChild(child.deepClone());
- });
- return clone;
-};
-
-
-/**
- * @return {goog.structs.TreeNode} Parent node or null if it has no parent.
- */
-goog.structs.TreeNode.prototype.getParent = function() {
- return this.parent_;
-};
-
-
-/**
- * @return {boolean} Whether the node is a leaf node.
- */
-goog.structs.TreeNode.prototype.isLeaf = function() {
- return !this.getChildCount();
-};
-
-
-/**
- * Tells if the node is the last child of its parent. This method helps how to
- * connect the tree nodes with lines: L shapes should be used before the last
- * children and |- shapes before the rest. Schematic tree visualization:
- *
- * <pre>
- * Node1
- * |-Node2
- * | L-Node3
- * | |-Node4
- * | L-Node5
- * L-Node6
- * </pre>
- *
- * @return {boolean} Whether the node has parent and is the last child of it.
- */
-goog.structs.TreeNode.prototype.isLastChild = function() {
- var parent = this.getParent();
- return Boolean(parent && this == goog.array.peek(parent.getChildren()));
-};
-
-
-/**
- * @return {!Array.<!goog.structs.TreeNode>} Immutable child nodes.
- */
-goog.structs.TreeNode.prototype.getChildren = function() {
- return this.children_ || goog.structs.TreeNode.EMPTY_ARRAY_;
-};
-
-
-/**
- * Gets the child node of this node at the given index.
- * @param {number} index Child index.
- * @return {goog.structs.TreeNode} The node at the given index or null if not
- * found.
- */
-goog.structs.TreeNode.prototype.getChildAt = function(index) {
- return this.getChildren()[index] || null;
-};
-
-
-/**
- * @return {number} The number of children.
- */
-goog.structs.TreeNode.prototype.getChildCount = function() {
- return this.getChildren().length;
-};
-
-
-/**
- * @return {number} The number of ancestors of the node.
- */
-goog.structs.TreeNode.prototype.getDepth = function() {
- var depth = 0;
- var node = this;
- while (node.getParent()) {
- depth++;
- node = node.getParent();
- }
- return depth;
-};
-
-
-/**
- * @return {!Array.<!goog.structs.TreeNode>} All ancestor nodes in bottom-up
- * order.
- */
-goog.structs.TreeNode.prototype.getAncestors = function() {
- var ancestors = [];
- var node = this.getParent();
- while (node) {
- ancestors.push(node);
- node = node.getParent();
- }
- return ancestors;
-};
-
-
-/**
- * @return {!goog.structs.TreeNode} The root of the tree structure, i.e. the
- * farthest ancestor of the node or the node itself if it has no parents.
- */
-goog.structs.TreeNode.prototype.getRoot = function() {
- var root = this;
- while (root.getParent()) {
- root = root.getParent();
- }
- return root;
-};
-
-
-/**
- * Builds a nested array structure from the node keys in this node's subtree to
- * facilitate testing tree operations that change the hierarchy.
- * @return {!Array} The structure of this node's descendants as nested array
- * of node keys. The number of unclosed opening brackets up to a particular
- * node is proportional to the indentation of that node in the graphical
- * representation of the tree. Example:
- * <pre>
- * this
- * |- child1
- * | L- grandchild
- * L- child2
- * </pre>
- * is represented as ['child1', ['grandchild'], 'child2'].
- */
-goog.structs.TreeNode.prototype.getSubtreeKeys = function() {
- var ret = [];
- this.forEachChild(function(child) {
- ret.push(child.getKey());
- if (!child.isLeaf()) {
- ret.push(child.getSubtreeKeys());
- }
- });
- return ret;
-};
-
-
-/**
- * Tells whether this node is the ancestor of the given node.
- * @param {!goog.structs.TreeNode} node A node.
- * @return {boolean} Whether this node is the ancestor of {@code node}.
- */
-goog.structs.TreeNode.prototype.contains = function(node) {
- var current = node;
- do {
- current = current.getParent();
- } while (current && current != this);
- return Boolean(current);
-};
-
-
-/**
- * Finds the deepest common ancestor of the given nodes. The concept of
- * ancestor is not strict in this case, it includes the node itself.
- * @param {...!goog.structs.TreeNode} var_args The nodes.
- * @return {goog.structs.TreeNode} The common ancestor of the nodes or null if
- * they are from different trees.
- */
-goog.structs.TreeNode.findCommonAncestor = function(var_args) {
- var ret = arguments[0];
- if (!ret) {
- return null;
- }
-
- var retDepth = ret.getDepth();
- for (var i = 1; i < arguments.length; i++) {
- var node = arguments[i];
- var depth = node.getDepth();
- while (node != ret) {
- if (depth <= retDepth) {
- ret = ret.getParent();
- retDepth--;
- }
- if (depth > retDepth) {
- node = node.getParent();
- depth--;
- }
- }
- }
-
- return ret;
-};
-
-
-/**
- * Traverses all child nodes.
- * @param {function(!goog.structs.TreeNode, number,
- * !Array.<!goog.structs.TreeNode>)} f Callback function. It takes the
- * node, its index and the array of all child nodes as arguments.
- * @param {Object=} opt_this The object to be used as the value of {@code this}
- * within {@code f}.
- */
-goog.structs.TreeNode.prototype.forEachChild = function(f, opt_this) {
- goog.array.forEach(this.getChildren(), f, opt_this);
-};
-
-
-/**
- * Traverses all child nodes recursively in preorder.
- * @param {function(!goog.structs.TreeNode)} f Callback function. It takes the
- * node as argument.
- * @param {Object=} opt_this The object to be used as the value of {@code this}
- * within {@code f}.
- */
-goog.structs.TreeNode.prototype.forEachDescendant = function(f, opt_this) {
- goog.array.forEach(this.getChildren(), function(child) {
- f.call(opt_this, child);
- child.forEachDescendant(f, opt_this);
- });
-};
-
-
-/**
- * Traverses the subtree with the possibility to skip branches. Starts with
- * this node, and visits the descendant nodes depth-first, in preorder.
- * @param {function(!goog.structs.TreeNode): (boolean|undefined)} f Callback
- * function. It takes the node as argument. The children of this node will
- * be visited if the callback returns true or undefined, and will be
- * skipped if the callback returns false.
- * @param {Object=} opt_this The object to be used as the value of {@code this}
- * within {@code f}.
- */
-goog.structs.TreeNode.prototype.traverse = function(f, opt_this) {
- if (f.call(opt_this, this) !== false) {
- goog.array.forEach(this.getChildren(), function(child) {
- child.traverse(f, opt_this);
- });
- }
-};
-
-
-/**
- * Sets the parent node of this node. The callers must ensure that the parent
- * node and only that has this node among its children.
- * @param {goog.structs.TreeNode} parent The parent to set. If null, the node
- * will be detached from the tree.
- * @protected
- */
-goog.structs.TreeNode.prototype.setParent = function(parent) {
- this.parent_ = parent;
-};
-
-
-/**
- * Appends a child node to this node.
- * @param {!goog.structs.TreeNode} child Orphan child node.
- */
-goog.structs.TreeNode.prototype.addChild = function(child) {
- this.addChildAt(child, this.children_ ? this.children_.length : 0);
-};
-
-
-/**
- * Inserts a child node at the given index.
- * @param {!goog.structs.TreeNode} child Orphan child node.
- * @param {number} index The position to insert at.
- */
-goog.structs.TreeNode.prototype.addChildAt = function(child, index) {
- goog.asserts.assert(!child.getParent());
- child.setParent(this);
- this.children_ = this.children_ || [];
- goog.asserts.assert(index >= 0 && index <= this.children_.length);
- goog.array.insertAt(this.children_, child, index);
-};
-
-
-/**
- * Replaces a child node at the given index.
- * @param {!goog.structs.TreeNode} newChild Child node to set. It must not have
- * parent node.
- * @param {number} index Valid index of the old child to replace.
- * @return {!goog.structs.TreeNode} The original child node, detached from its
- * parent.
- */
-goog.structs.TreeNode.prototype.replaceChildAt = function(newChild, index) {
- goog.asserts.assert(!newChild.getParent(),
- 'newChild must not have parent node');
- var children = this.getChildren();
- var oldChild = children[index];
- goog.asserts.assert(oldChild, 'Invalid child or child index is given.');
- oldChild.setParent(null);
- children[index] = newChild;
- newChild.setParent(this);
- return oldChild;
-};
-
-
-/**
- * Replaces the given child node.
- * @param {!goog.structs.TreeNode} newChild New node to replace
- * {@code oldChild}. It must not have parent node.
- * @param {!goog.structs.TreeNode} oldChild Existing child node to be replaced.
- * @return {!goog.structs.TreeNode} The replaced child node detached from its
- * parent.
- */
-goog.structs.TreeNode.prototype.replaceChild = function(newChild, oldChild) {
- return this.replaceChildAt(newChild,
- goog.array.indexOf(this.getChildren(), oldChild));
-};
-
-
-/**
- * Removes the child node at the given index.
- * @param {number} index The position to remove from.
- * @return {goog.structs.TreeNode} The removed node if any.
- */
-goog.structs.TreeNode.prototype.removeChildAt = function(index) {
- var child = this.children_ && this.children_[index];
- if (child) {
- child.setParent(null);
- goog.array.removeAt(this.children_, index);
- if (this.children_.length == 0) {
- delete this.children_;
- }
- return child;
- }
- return null;
-};
-
-
-/**
- * Removes the given child node of this node.
- * @param {goog.structs.TreeNode} child The node to remove.
- * @return {goog.structs.TreeNode} The removed node if any.
- */
-goog.structs.TreeNode.prototype.removeChild = function(child) {
- return this.removeChildAt(goog.array.indexOf(this.getChildren(), child));
-};
-
-
-/**
- * Removes all child nodes of this node.
- */
-goog.structs.TreeNode.prototype.removeChildren = function() {
- if (this.children_) {
- goog.array.forEach(this.children_, function(child) {
- child.setParent(null);
- });
- }
- delete this.children_;
-};