Improve output: distinguish between failed assertions (failures) and unexpected exceptions (errors), and print a filtered stack trace for any exception.
This commit is contained in:
commit
4f2e303079
1839 changed files with 235630 additions and 0 deletions
146
webapp/web/src/collections/ArrayList.js
Normal file
146
webapp/web/src/collections/ArrayList.js
Normal file
|
@ -0,0 +1,146 @@
|
|||
/*
|
||||
Copyright (c) 2004-2006, The Dojo Foundation
|
||||
All Rights Reserved.
|
||||
|
||||
Licensed under the Academic Free License version 2.1 or above OR the
|
||||
modified BSD license. For more information on Dojo licensing, see:
|
||||
|
||||
http://dojotoolkit.org/community/licensing.shtml
|
||||
*/
|
||||
|
||||
dojo.provide("dojo.collections.ArrayList");
|
||||
dojo.require("dojo.collections.Collections");
|
||||
|
||||
dojo.collections.ArrayList=function(/* array? */arr){
|
||||
// summary
|
||||
// Returns a new object of type dojo.collections.ArrayList
|
||||
var items=[];
|
||||
if(arr) items=items.concat(arr);
|
||||
this.count=items.length;
|
||||
this.add=function(/* object */obj){
|
||||
// summary
|
||||
// Add an element to the collection.
|
||||
items.push(obj);
|
||||
this.count=items.length;
|
||||
};
|
||||
this.addRange=function(/* array */a){
|
||||
// summary
|
||||
// Add a range of objects to the ArrayList
|
||||
if(a.getIterator){
|
||||
var e=a.getIterator();
|
||||
while(!e.atEnd()){
|
||||
this.add(e.get());
|
||||
}
|
||||
this.count=items.length;
|
||||
}else{
|
||||
for(var i=0; i<a.length; i++){
|
||||
items.push(a[i]);
|
||||
}
|
||||
this.count=items.length;
|
||||
}
|
||||
};
|
||||
this.clear=function(){
|
||||
// summary
|
||||
// Clear all elements out of the collection, and reset the count.
|
||||
items.splice(0, items.length);
|
||||
this.count=0;
|
||||
};
|
||||
this.clone=function(){
|
||||
// summary
|
||||
// Clone the array list
|
||||
return new dojo.collections.ArrayList(items); // dojo.collections.ArrayList
|
||||
};
|
||||
this.contains=function(/* object */obj){
|
||||
// summary
|
||||
// Check to see if the passed object is a member in the ArrayList
|
||||
for(var i=0; i < items.length; i++){
|
||||
if(items[i] == obj) {
|
||||
return true; // bool
|
||||
}
|
||||
}
|
||||
return false; // bool
|
||||
};
|
||||
this.forEach=function(/* function */ fn, /* object? */ scope){
|
||||
// summary
|
||||
// functional iterator, following the mozilla spec.
|
||||
var s=scope||dj_global;
|
||||
if(Array.forEach){
|
||||
Array.forEach(items, fn, s);
|
||||
}else{
|
||||
for(var i=0; i<items.length; i++){
|
||||
fn.call(s, items[i], i, items);
|
||||
}
|
||||
}
|
||||
};
|
||||
this.getIterator=function(){
|
||||
// summary
|
||||
// Get an Iterator for this object
|
||||
return new dojo.collections.Iterator(items); // dojo.collections.Iterator
|
||||
};
|
||||
this.indexOf=function(/* object */obj){
|
||||
// summary
|
||||
// Return the numeric index of the passed object; will return -1 if not found.
|
||||
for(var i=0; i < items.length; i++){
|
||||
if(items[i] == obj) {
|
||||
return i; // int
|
||||
}
|
||||
}
|
||||
return -1; // int
|
||||
};
|
||||
this.insert=function(/* int */ i, /* object */ obj){
|
||||
// summary
|
||||
// Insert the passed object at index i
|
||||
items.splice(i,0,obj);
|
||||
this.count=items.length;
|
||||
};
|
||||
this.item=function(/* int */ i){
|
||||
// summary
|
||||
// return the element at index i
|
||||
return items[i]; // object
|
||||
};
|
||||
this.remove=function(/* object */obj){
|
||||
// summary
|
||||
// Look for the passed object, and if found, remove it from the internal array.
|
||||
var i=this.indexOf(obj);
|
||||
if(i >=0) {
|
||||
items.splice(i,1);
|
||||
}
|
||||
this.count=items.length;
|
||||
};
|
||||
this.removeAt=function(/* int */ i){
|
||||
// summary
|
||||
// return an array with function applied to all elements
|
||||
items.splice(i,1);
|
||||
this.count=items.length;
|
||||
};
|
||||
this.reverse=function(){
|
||||
// summary
|
||||
// Reverse the internal array
|
||||
items.reverse();
|
||||
};
|
||||
this.sort=function(/* function? */ fn){
|
||||
// summary
|
||||
// sort the internal array
|
||||
if(fn){
|
||||
items.sort(fn);
|
||||
}else{
|
||||
items.sort();
|
||||
}
|
||||
};
|
||||
this.setByIndex=function(/* int */ i, /* object */ obj){
|
||||
// summary
|
||||
// Set an element in the array by the passed index.
|
||||
items[i]=obj;
|
||||
this.count=items.length;
|
||||
};
|
||||
this.toArray=function(){
|
||||
// summary
|
||||
// Return a new array with all of the items of the internal array concatenated.
|
||||
return [].concat(items);
|
||||
}
|
||||
this.toString=function(/* string */ delim){
|
||||
// summary
|
||||
// implementation of toString, follows [].toString();
|
||||
return items.join((delim||","));
|
||||
};
|
||||
};
|
203
webapp/web/src/collections/BinaryTree.js
Normal file
203
webapp/web/src/collections/BinaryTree.js
Normal file
|
@ -0,0 +1,203 @@
|
|||
/*
|
||||
Copyright (c) 2004-2006, The Dojo Foundation
|
||||
All Rights Reserved.
|
||||
|
||||
Licensed under the Academic Free License version 2.1 or above OR the
|
||||
modified BSD license. For more information on Dojo licensing, see:
|
||||
|
||||
http://dojotoolkit.org/community/licensing.shtml
|
||||
*/
|
||||
|
||||
dojo.provide("dojo.collections.BinaryTree");
|
||||
dojo.require("dojo.collections.Collections");
|
||||
dojo.require("dojo.experimental");
|
||||
|
||||
dojo.experimental("dojo.collections.BinaryTree");
|
||||
|
||||
dojo.collections.BinaryTree=function(data){
|
||||
function node(data, rnode, lnode){
|
||||
this.value=data||null;
|
||||
this.right=rnode||null;
|
||||
this.left=lnode||null;
|
||||
this.clone=function(){
|
||||
var c=new node();
|
||||
if (this.value.value) c.value=this.value.clone();
|
||||
else c.value=this.value;
|
||||
if (this.left) c.left=this.left.clone();
|
||||
if (this.right) c.right=this.right.clone();
|
||||
}
|
||||
this.compare=function(n){
|
||||
if (this.value > n.value) return 1;
|
||||
if (this.value < n.value) return -1;
|
||||
return 0;
|
||||
}
|
||||
this.compareData=function(d){
|
||||
if (this.value > d) return 1;
|
||||
if (this.value < d) return -1;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
function inorderTraversalBuildup(current, a){
|
||||
if (current){
|
||||
inorderTraversalBuildup(current.left, a);
|
||||
a.add(current);
|
||||
inorderTraversalBuildup(current.right, a);
|
||||
}
|
||||
}
|
||||
|
||||
function preorderTraversal(current, sep){
|
||||
var s="";
|
||||
if (current){
|
||||
s=current.value.toString() + sep;
|
||||
s += preorderTraversal(current.left, sep);
|
||||
s += preorderTraversal(current.right, sep);
|
||||
}
|
||||
return s;
|
||||
}
|
||||
function inorderTraversal(current, sep){
|
||||
var s="";
|
||||
if (current){
|
||||
s=inorderTraversal(current.left, sep);
|
||||
s += current.value.toString() + sep;
|
||||
s += inorderTraversal(current.right, sep);
|
||||
}
|
||||
return s;
|
||||
}
|
||||
function postorderTraversal(current, sep){
|
||||
var s="";
|
||||
if (current){
|
||||
s=postorderTraversal(current.left, sep);
|
||||
s += postorderTraversal(current.right, sep);
|
||||
s += current.value.toString() + sep;
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
function searchHelper(current, data){
|
||||
if (!current) return null;
|
||||
var i=current.compareData(data);
|
||||
if (i==0) return current;
|
||||
if (i>0) return searchHelper(current.left, data);
|
||||
else return searchHelper(current.right, data);
|
||||
}
|
||||
|
||||
this.add=function(data){
|
||||
var n=new node(data);
|
||||
var i;
|
||||
var current=root;
|
||||
var parent=null;
|
||||
while (current){
|
||||
i=current.compare(n);
|
||||
if (i == 0) return;
|
||||
parent=current;
|
||||
if (i > 0) current=current.left;
|
||||
else current=current.right;
|
||||
}
|
||||
this.count++;
|
||||
if (!parent) root=n;
|
||||
else {
|
||||
i=parent.compare(n);
|
||||
if (i > 0) parent.left=n;
|
||||
else parent.right=n;
|
||||
}
|
||||
};
|
||||
this.clear=function(){
|
||||
root=null;
|
||||
this.count=0;
|
||||
};
|
||||
this.clone=function(){
|
||||
var c=new dojo.collections.BinaryTree();
|
||||
c.root=root.clone();
|
||||
c.count=this.count;
|
||||
return c;
|
||||
};
|
||||
this.contains=function(data){
|
||||
return this.search(data) != null;
|
||||
};
|
||||
this.deleteData=function(data){
|
||||
var current=root;
|
||||
var parent=null;
|
||||
var i=current.compareData(data);
|
||||
while (i != 0 && current != null){
|
||||
if (i > 0){
|
||||
parent=current;
|
||||
current=current.left;
|
||||
} else if (i < 0) {
|
||||
parent=current;
|
||||
current=current.right;
|
||||
}
|
||||
i=current.compareData(data);
|
||||
}
|
||||
if (!current) return;
|
||||
this.count--;
|
||||
if (!current.right) {
|
||||
if (!parent) root=current.left;
|
||||
else {
|
||||
i=parent.compare(current);
|
||||
if (i > 0) parent.left=current.left;
|
||||
else if (i < 0) parent.right=current.left;
|
||||
}
|
||||
} else if (!current.right.left){
|
||||
if (!parent) root=current.right;
|
||||
else {
|
||||
i=parent.compare(current);
|
||||
if (i > 0) parent.left=current.right;
|
||||
else if (i < 0) parent.right=current.right;
|
||||
}
|
||||
} else {
|
||||
var leftmost=current.right.left;
|
||||
var lmParent=current.right;
|
||||
while (leftmost.left != null){
|
||||
lmParent=leftmost;
|
||||
leftmost=leftmost.left;
|
||||
}
|
||||
lmParent.left=leftmost.right;
|
||||
leftmost.left=current.left;
|
||||
leftmost.right=current.right;
|
||||
if (!parent) root=leftmost;
|
||||
else {
|
||||
i=parent.compare(current);
|
||||
if (i > 0) parent.left=leftmost;
|
||||
else if (i < 0) parent.right=leftmost;
|
||||
}
|
||||
}
|
||||
};
|
||||
this.getIterator=function(){
|
||||
var a=[];
|
||||
inorderTraversalBuildup(root, a);
|
||||
return new dojo.collections.Iterator(a);
|
||||
};
|
||||
this.search=function(data){
|
||||
return searchHelper(root, data);
|
||||
};
|
||||
this.toString=function(order, sep){
|
||||
if (!order) var order=dojo.collections.BinaryTree.TraversalMethods.Inorder;
|
||||
if (!sep) var sep=" ";
|
||||
var s="";
|
||||
switch (order){
|
||||
case dojo.collections.BinaryTree.TraversalMethods.Preorder:
|
||||
s=preorderTraversal(root, sep);
|
||||
break;
|
||||
case dojo.collections.BinaryTree.TraversalMethods.Inorder:
|
||||
s=inorderTraversal(root, sep);
|
||||
break;
|
||||
case dojo.collections.BinaryTree.TraversalMethods.Postorder:
|
||||
s=postorderTraversal(root, sep);
|
||||
break;
|
||||
};
|
||||
if (s.length == 0) return "";
|
||||
else return s.substring(0, s.length - sep.length);
|
||||
};
|
||||
|
||||
this.count=0;
|
||||
var root=this.root=null;
|
||||
if (data) {
|
||||
this.add(data);
|
||||
}
|
||||
}
|
||||
dojo.collections.BinaryTree.TraversalMethods={
|
||||
Preorder : 0,
|
||||
Inorder : 1,
|
||||
Postorder : 2
|
||||
};
|
125
webapp/web/src/collections/Collections.js
Normal file
125
webapp/web/src/collections/Collections.js
Normal file
|
@ -0,0 +1,125 @@
|
|||
/*
|
||||
Copyright (c) 2004-2006, The Dojo Foundation
|
||||
All Rights Reserved.
|
||||
|
||||
Licensed under the Academic Free License version 2.1 or above OR the
|
||||
modified BSD license. For more information on Dojo licensing, see:
|
||||
|
||||
http://dojotoolkit.org/community/licensing.shtml
|
||||
*/
|
||||
|
||||
dojo.provide("dojo.collections.Collections");
|
||||
|
||||
dojo.collections={Collections:true};
|
||||
dojo.collections.DictionaryEntry=function(/* string */k, /* object */v){
|
||||
// summary
|
||||
// return an object of type dojo.collections.DictionaryEntry
|
||||
this.key=k;
|
||||
this.value=v;
|
||||
this.valueOf=function(){
|
||||
return this.value; // object
|
||||
};
|
||||
this.toString=function(){
|
||||
return String(this.value); // string
|
||||
};
|
||||
}
|
||||
|
||||
/* Iterators
|
||||
* The collections.Iterators (Iterator and DictionaryIterator) are built to
|
||||
* work with the Collections included in this namespace. However, they *can*
|
||||
* be used with arrays and objects, respectively, should one choose to do so.
|
||||
*/
|
||||
dojo.collections.Iterator=function(/* array */arr){
|
||||
// summary
|
||||
// return an object of type dojo.collections.Iterator
|
||||
var a=arr;
|
||||
var position=0;
|
||||
this.element=a[position]||null;
|
||||
this.atEnd=function(){
|
||||
// summary
|
||||
// Test to see if the internal cursor has reached the end of the internal collection.
|
||||
return (position>=a.length); // bool
|
||||
};
|
||||
this.get=function(){
|
||||
// summary
|
||||
// Test to see if the internal cursor has reached the end of the internal collection.
|
||||
if(this.atEnd()){
|
||||
return null; // object
|
||||
}
|
||||
this.element=a[position++];
|
||||
return this.element; // object
|
||||
};
|
||||
this.map=function(/* function */fn, /* object? */scope){
|
||||
// summary
|
||||
// Functional iteration with optional scope.
|
||||
var s=scope||dj_global;
|
||||
if(Array.map){
|
||||
return Array.map(a,fn,s); // array
|
||||
}else{
|
||||
var arr=[];
|
||||
for(var i=0; i<a.length; i++){
|
||||
arr.push(fn.call(s,a[i]));
|
||||
}
|
||||
return arr; // array
|
||||
}
|
||||
};
|
||||
this.reset=function(){
|
||||
// summary
|
||||
// reset the internal cursor.
|
||||
position=0;
|
||||
this.element=a[position];
|
||||
};
|
||||
}
|
||||
|
||||
/* Notes:
|
||||
* The DictionaryIterator no longer supports a key and value property;
|
||||
* the reality is that you can use this to iterate over a JS object
|
||||
* being used as a hashtable.
|
||||
*/
|
||||
dojo.collections.DictionaryIterator=function(/* object */obj){
|
||||
// summary
|
||||
// return an object of type dojo.collections.DictionaryIterator
|
||||
var a=[]; // Create an indexing array
|
||||
var testObject={};
|
||||
for(var p in obj){
|
||||
if(!testObject[p]){
|
||||
a.push(obj[p]); // fill it up
|
||||
}
|
||||
}
|
||||
var position=0;
|
||||
this.element=a[position]||null;
|
||||
this.atEnd=function(){
|
||||
// summary
|
||||
// Test to see if the internal cursor has reached the end of the internal collection.
|
||||
return (position>=a.length); // bool
|
||||
};
|
||||
this.get=function(){
|
||||
// summary
|
||||
// Test to see if the internal cursor has reached the end of the internal collection.
|
||||
if(this.atEnd()){
|
||||
return null; // object
|
||||
}
|
||||
this.element=a[position++];
|
||||
return this.element; // object
|
||||
};
|
||||
this.map=function(/* function */fn, /* object? */scope){
|
||||
// summary
|
||||
// Functional iteration with optional scope.
|
||||
var s=scope||dj_global;
|
||||
if(Array.map){
|
||||
return Array.map(a,fn,s); // array
|
||||
}else{
|
||||
var arr=[];
|
||||
for(var i=0; i<a.length; i++){
|
||||
arr.push(fn.call(s,a[i]));
|
||||
}
|
||||
return arr; // array
|
||||
}
|
||||
};
|
||||
this.reset=function() {
|
||||
// summary
|
||||
// reset the internal cursor.
|
||||
position=0;
|
||||
this.element=a[position];
|
||||
};
|
||||
};
|
129
webapp/web/src/collections/Dictionary.js
Normal file
129
webapp/web/src/collections/Dictionary.js
Normal file
|
@ -0,0 +1,129 @@
|
|||
/*
|
||||
Copyright (c) 2004-2006, The Dojo Foundation
|
||||
All Rights Reserved.
|
||||
|
||||
Licensed under the Academic Free License version 2.1 or above OR the
|
||||
modified BSD license. For more information on Dojo licensing, see:
|
||||
|
||||
http://dojotoolkit.org/community/licensing.shtml
|
||||
*/
|
||||
|
||||
dojo.provide("dojo.collections.Dictionary");
|
||||
dojo.require("dojo.collections.Collections");
|
||||
|
||||
dojo.collections.Dictionary=function(/* dojo.collections.Dictionary? */dictionary){
|
||||
// summary
|
||||
// Returns an object of type dojo.collections.Dictionary
|
||||
var items={};
|
||||
this.count=0;
|
||||
|
||||
// comparator for property addition and access.
|
||||
var testObject={};
|
||||
|
||||
this.add=function(/* string */k, /* object */v){
|
||||
// summary
|
||||
// Add a new item to the Dictionary.
|
||||
var b=(k in items);
|
||||
items[k]=new dojo.collections.DictionaryEntry(k,v);
|
||||
if(!b){
|
||||
this.count++;
|
||||
}
|
||||
};
|
||||
this.clear=function(){
|
||||
// summary
|
||||
// Clears the internal dictionary.
|
||||
items={};
|
||||
this.count=0;
|
||||
};
|
||||
this.clone=function(){
|
||||
// summary
|
||||
// Returns a new instance of dojo.collections.Dictionary; note the the dictionary is a clone but items might not be.
|
||||
return new dojo.collections.Dictionary(this); // dojo.collections.Dictionary
|
||||
};
|
||||
this.contains=this.containsKey=function(/* string */k){
|
||||
// summary
|
||||
// Check to see if the dictionary has an entry at key "k".
|
||||
if(testObject[k]){
|
||||
return false; // bool
|
||||
}
|
||||
return (items[k]!=null); // bool
|
||||
};
|
||||
this.containsValue=function(/* object */v){
|
||||
// summary
|
||||
// Check to see if the dictionary has an entry with value "v".
|
||||
var e=this.getIterator();
|
||||
while(e.get()){
|
||||
if(e.element.value==v){
|
||||
return true; // bool
|
||||
}
|
||||
}
|
||||
return false; // bool
|
||||
};
|
||||
this.entry=function(/* string */k){
|
||||
// summary
|
||||
// Accessor method; similar to dojo.collections.Dictionary.item but returns the actual Entry object.
|
||||
return items[k]; // dojo.collections.DictionaryEntry
|
||||
};
|
||||
this.forEach=function(/* function */ fn, /* object? */ scope){
|
||||
// summary
|
||||
// functional iterator, following the mozilla spec.
|
||||
var a=[]; // Create an indexing array
|
||||
for(var p in items) {
|
||||
if(!testObject[p]){
|
||||
a.push(items[p]); // fill it up
|
||||
}
|
||||
}
|
||||
var s=scope||dj_global;
|
||||
if(Array.forEach){
|
||||
Array.forEach(a, fn, s);
|
||||
}else{
|
||||
for(var i=0; i<a.length; i++){
|
||||
fn.call(s, a[i], i, a);
|
||||
}
|
||||
}
|
||||
};
|
||||
this.getKeyList=function(){
|
||||
// summary
|
||||
// Returns an array of the keys in the dictionary.
|
||||
return (this.getIterator()).map(function(entry){
|
||||
return entry.key;
|
||||
}); // array
|
||||
};
|
||||
this.getValueList=function(){
|
||||
// summary
|
||||
// Returns an array of the values in the dictionary.
|
||||
return (this.getIterator()).map(function(entry){
|
||||
return entry.value;
|
||||
}); // array
|
||||
};
|
||||
this.item=function(/* string */k){
|
||||
// summary
|
||||
// Accessor method.
|
||||
if(k in items){
|
||||
return items[k].valueOf(); // object
|
||||
}
|
||||
return undefined; // object
|
||||
};
|
||||
this.getIterator=function(){
|
||||
// summary
|
||||
// Gets a dojo.collections.DictionaryIterator for iteration purposes.
|
||||
return new dojo.collections.DictionaryIterator(items); // dojo.collections.DictionaryIterator
|
||||
};
|
||||
this.remove=function(/* string */k){
|
||||
// summary
|
||||
// Removes the item at k from the internal collection.
|
||||
if(k in items && !testObject[k]){
|
||||
delete items[k];
|
||||
this.count--;
|
||||
return true; // bool
|
||||
}
|
||||
return false; // bool
|
||||
};
|
||||
|
||||
if (dictionary){
|
||||
var e=dictionary.getIterator();
|
||||
while(e.get()) {
|
||||
this.add(e.element.key, e.element.value);
|
||||
}
|
||||
}
|
||||
};
|
153
webapp/web/src/collections/Graph.js
Normal file
153
webapp/web/src/collections/Graph.js
Normal file
|
@ -0,0 +1,153 @@
|
|||
/*
|
||||
Copyright (c) 2004-2006, The Dojo Foundation
|
||||
All Rights Reserved.
|
||||
|
||||
Licensed under the Academic Free License version 2.1 or above OR the
|
||||
modified BSD license. For more information on Dojo licensing, see:
|
||||
|
||||
http://dojotoolkit.org/community/licensing.shtml
|
||||
*/
|
||||
|
||||
dojo.provide("dojo.collections.Graph");
|
||||
dojo.require("dojo.collections.Collections");
|
||||
|
||||
dojo.experimental("dojo.collections.Graph");
|
||||
|
||||
dojo.collections.Graph=function(nodes){
|
||||
function node(key, data, neighbors) {
|
||||
this.key=key;
|
||||
this.data=data;
|
||||
this.neighbors=neighbors||new adjacencyList();
|
||||
this.addDirected=function(){
|
||||
if (arguments[0].constructor==edgeToNeighbor){
|
||||
this.neighbors.add(arguments[0]);
|
||||
}else{
|
||||
var n=arguments[0];
|
||||
var cost=arguments[1]||0;
|
||||
this.neighbors.add(new edgeToNeighbor(n, cost));
|
||||
}
|
||||
}
|
||||
}
|
||||
function nodeList(){
|
||||
var d=new dojo.collections.Dictionary();
|
||||
function nodelistiterator(){
|
||||
var o=[] ; // Create an indexing array
|
||||
var e=d.getIterator();
|
||||
while(e.get()){
|
||||
o[o.length]=e.element;
|
||||
}
|
||||
|
||||
var position=0;
|
||||
this.element=o[position]||null;
|
||||
this.atEnd=function(){
|
||||
return (position>=o.length);
|
||||
}
|
||||
this.get=function(){
|
||||
if(this.atEnd()){
|
||||
return null; // object
|
||||
}
|
||||
this.element=o[position++];
|
||||
return this.element; // object
|
||||
};
|
||||
this.map=function(/* function */fn, /* object? */scope){
|
||||
var s=scope||dj_global;
|
||||
if(Array.map){
|
||||
return Array.map(o,fn,s); // array
|
||||
}else{
|
||||
var arr=[];
|
||||
for(var i=0; i<o.length; i++){
|
||||
arr.push(fn.call(s,o[i]));
|
||||
}
|
||||
return arr; // array
|
||||
}
|
||||
};
|
||||
this.reset=function(){
|
||||
position=0;
|
||||
this.element=o[position];
|
||||
};
|
||||
}
|
||||
|
||||
this.add=function(node){
|
||||
d.add(node.key, node);
|
||||
};
|
||||
this.clear=function(){
|
||||
d.clear();
|
||||
};
|
||||
this.containsKey=function(key){
|
||||
return d.containsKey(key);
|
||||
};
|
||||
this.getIterator=function(){
|
||||
return new nodelistiterator(this);
|
||||
};
|
||||
this.item=function(key){
|
||||
return d.item(key);
|
||||
};
|
||||
this.remove=function(node){
|
||||
d.remove(node.key);
|
||||
};
|
||||
}
|
||||
function edgeToNeighbor(node, cost){
|
||||
this.neighbor=node;
|
||||
this.cost=cost;
|
||||
}
|
||||
function adjacencyList(){
|
||||
var d=[];
|
||||
this.add=function(o){
|
||||
d.push(o);
|
||||
};
|
||||
this.item=function(i){
|
||||
return d[i];
|
||||
};
|
||||
this.getIterator=function(){
|
||||
return new dojo.collections.Iterator([].concat(d));
|
||||
};
|
||||
}
|
||||
|
||||
this.nodes=nodes||new nodeList();
|
||||
this.count=this.nodes.count;
|
||||
this.clear=function(){
|
||||
this.nodes.clear();
|
||||
this.count=0;
|
||||
};
|
||||
this.addNode=function(){
|
||||
var n=arguments[0];
|
||||
if(arguments.length > 1){
|
||||
n=new node(arguments[0],arguments[1]);
|
||||
}
|
||||
if(!this.nodes.containsKey(n.key)){
|
||||
this.nodes.add(n);
|
||||
this.count++;
|
||||
}
|
||||
};
|
||||
this.addDirectedEdge=function(uKey, vKey, cost){
|
||||
var uNode,vNode;
|
||||
if(uKey.constructor!= node){
|
||||
uNode=this.nodes.item(uKey);
|
||||
vNode=this.nodes.item(vKey);
|
||||
}else{
|
||||
uNode=uKey;
|
||||
vNode=vKey;
|
||||
}
|
||||
var c=cost||0;
|
||||
uNode.addDirected(vNode,c);
|
||||
};
|
||||
this.addUndirectedEdge=function(uKey, vKey, cost){
|
||||
var uNode, vNode;
|
||||
if(uKey.constructor!=node){
|
||||
uNode=this.nodes.item(uKey);
|
||||
vNode=this.nodes.item(vKey);
|
||||
}else{
|
||||
uNode=uKey;
|
||||
vNode=vKey;
|
||||
}
|
||||
var c=cost||0;
|
||||
uNode.addDirected(vNode,c);
|
||||
vNode.addDirected(uNode,c);
|
||||
};
|
||||
this.contains=function(n){
|
||||
return this.nodes.containsKey(n.key);
|
||||
};
|
||||
this.containsKey=function(k){
|
||||
return this.nodes.containsKey(k);
|
||||
};
|
||||
}
|
87
webapp/web/src/collections/Queue.js
Normal file
87
webapp/web/src/collections/Queue.js
Normal file
|
@ -0,0 +1,87 @@
|
|||
/*
|
||||
Copyright (c) 2004-2006, The Dojo Foundation
|
||||
All Rights Reserved.
|
||||
|
||||
Licensed under the Academic Free License version 2.1 or above OR the
|
||||
modified BSD license. For more information on Dojo licensing, see:
|
||||
|
||||
http://dojotoolkit.org/community/licensing.shtml
|
||||
*/
|
||||
|
||||
dojo.provide("dojo.collections.Queue");
|
||||
dojo.require("dojo.collections.Collections");
|
||||
|
||||
dojo.collections.Queue=function(/* array? */arr){
|
||||
// summary
|
||||
// return an object of type dojo.collections.Queue
|
||||
var q=[];
|
||||
if (arr){
|
||||
q=q.concat(arr);
|
||||
}
|
||||
this.count=q.length;
|
||||
this.clear=function(){
|
||||
// summary
|
||||
// clears the internal collection
|
||||
q=[];
|
||||
this.count=q.length;
|
||||
};
|
||||
this.clone=function(){
|
||||
// summary
|
||||
// creates a new Queue based on this one
|
||||
return new dojo.collections.Queue(q); // dojo.collections.Queue
|
||||
};
|
||||
this.contains=function(/* object */ o){
|
||||
// summary
|
||||
// Check to see if the passed object is an element in this queue
|
||||
for(var i=0; i<q.length; i++){
|
||||
if (q[i]==o){
|
||||
return true; // bool
|
||||
}
|
||||
}
|
||||
return false; // bool
|
||||
};
|
||||
this.copyTo=function(/* array */ arr, /* int */ i){
|
||||
// summary
|
||||
// Copy the contents of this queue into the passed array at index i.
|
||||
arr.splice(i,0,q);
|
||||
};
|
||||
this.dequeue=function(){
|
||||
// summary
|
||||
// shift the first element off the queue and return it
|
||||
var r=q.shift();
|
||||
this.count=q.length;
|
||||
return r; // object
|
||||
};
|
||||
this.enqueue=function(/* object */ o){
|
||||
// summary
|
||||
// put the passed object at the end of the queue
|
||||
this.count=q.push(o);
|
||||
};
|
||||
this.forEach=function(/* function */ fn, /* object? */ scope){
|
||||
// summary
|
||||
// functional iterator, following the mozilla spec.
|
||||
var s=scope||dj_global;
|
||||
if(Array.forEach){
|
||||
Array.forEach(q, fn, s);
|
||||
}else{
|
||||
for(var i=0; i<q.length; i++){
|
||||
fn.call(s, q[i], i, q);
|
||||
}
|
||||
}
|
||||
};
|
||||
this.getIterator=function(){
|
||||
// summary
|
||||
// get an Iterator based on this queue.
|
||||
return new dojo.collections.Iterator(q); // dojo.collections.Iterator
|
||||
};
|
||||
this.peek=function(){
|
||||
// summary
|
||||
// get the next element in the queue without altering the queue.
|
||||
return q[0];
|
||||
};
|
||||
this.toArray=function(){
|
||||
// summary
|
||||
// return an array based on the internal array of the queue.
|
||||
return [].concat(q);
|
||||
};
|
||||
};
|
84
webapp/web/src/collections/Set.js
Normal file
84
webapp/web/src/collections/Set.js
Normal file
|
@ -0,0 +1,84 @@
|
|||
/*
|
||||
Copyright (c) 2004-2006, The Dojo Foundation
|
||||
All Rights Reserved.
|
||||
|
||||
Licensed under the Academic Free License version 2.1 or above OR the
|
||||
modified BSD license. For more information on Dojo licensing, see:
|
||||
|
||||
http://dojotoolkit.org/community/licensing.shtml
|
||||
*/
|
||||
|
||||
dojo.provide("dojo.collections.Set");
|
||||
dojo.require("dojo.collections.Collections");
|
||||
dojo.require("dojo.collections.ArrayList");
|
||||
|
||||
// straight up sets are based on arrays or array-based collections.
|
||||
dojo.collections.Set = new function(){
|
||||
this.union = function(setA, setB){
|
||||
if (setA.constructor == Array) var setA = new dojo.collections.ArrayList(setA);
|
||||
if (setB.constructor == Array) var setB = new dojo.collections.ArrayList(setB);
|
||||
if (!setA.toArray || !setB.toArray) dojo.raise("Set operations can only be performed on array-based collections.");
|
||||
var result = new dojo.collections.ArrayList(setA.toArray());
|
||||
var e = setB.getIterator();
|
||||
while(!e.atEnd()){
|
||||
var item=e.get();
|
||||
if(!result.contains(item)){
|
||||
result.add(item);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
};
|
||||
this.intersection = function(setA, setB){
|
||||
if (setA.constructor == Array) var setA = new dojo.collections.ArrayList(setA);
|
||||
if (setB.constructor == Array) var setB = new dojo.collections.ArrayList(setB);
|
||||
if (!setA.toArray || !setB.toArray) dojo.raise("Set operations can only be performed on array-based collections.");
|
||||
var result = new dojo.collections.ArrayList();
|
||||
var e = setB.getIterator();
|
||||
while(!e.atEnd()){
|
||||
var item=e.get();
|
||||
if(setA.contains(item)){
|
||||
result.add(item);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
};
|
||||
// returns everything in setA that is not in setB.
|
||||
this.difference = function(setA, setB){
|
||||
if (setA.constructor == Array) var setA = new dojo.collections.ArrayList(setA);
|
||||
if (setB.constructor == Array) var setB = new dojo.collections.ArrayList(setB);
|
||||
if (!setA.toArray || !setB.toArray) dojo.raise("Set operations can only be performed on array-based collections.");
|
||||
var result = new dojo.collections.ArrayList();
|
||||
var e=setA.getIterator();
|
||||
while(!e.atEnd()){
|
||||
var item=e.get();
|
||||
if(!setB.contains(item)){
|
||||
result.add(item);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
};
|
||||
this.isSubSet = function(setA, setB) {
|
||||
if (setA.constructor == Array) var setA = new dojo.collections.ArrayList(setA);
|
||||
if (setB.constructor == Array) var setB = new dojo.collections.ArrayList(setB);
|
||||
if (!setA.toArray || !setB.toArray) dojo.raise("Set operations can only be performed on array-based collections.");
|
||||
var e = setA.getIterator();
|
||||
while(!e.atEnd()){
|
||||
if(!setB.contains(e.get())){
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
};
|
||||
this.isSuperSet = function(setA, setB){
|
||||
if (setA.constructor == Array) var setA = new dojo.collections.ArrayList(setA);
|
||||
if (setB.constructor == Array) var setB = new dojo.collections.ArrayList(setB);
|
||||
if (!setA.toArray || !setB.toArray) dojo.raise("Set operations can only be performed on array-based collections.");
|
||||
var e = setB.getIterator();
|
||||
while(!e.atEnd()){
|
||||
if(!setA.contains(e.get())){
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
};
|
||||
}();
|
146
webapp/web/src/collections/SkipList.js
Normal file
146
webapp/web/src/collections/SkipList.js
Normal file
|
@ -0,0 +1,146 @@
|
|||
/*
|
||||
Copyright (c) 2004-2006, The Dojo Foundation
|
||||
All Rights Reserved.
|
||||
|
||||
Licensed under the Academic Free License version 2.1 or above OR the
|
||||
modified BSD license. For more information on Dojo licensing, see:
|
||||
|
||||
http://dojotoolkit.org/community/licensing.shtml
|
||||
*/
|
||||
|
||||
dojo.provide("dojo.collections.SkipList");
|
||||
dojo.require("dojo.collections.Collections");
|
||||
dojo.require("dojo.experimental");
|
||||
|
||||
dojo.experimental("dojo.collections.SkipList");
|
||||
|
||||
dojo.collections.SkipList = function(){
|
||||
function node(height, val){
|
||||
this.value = val;
|
||||
this.height = height;
|
||||
this.nodes = new nodeList(height);
|
||||
this.compare = function(val){
|
||||
if (this.value > val) return 1;
|
||||
if (this.value < val) return -1;
|
||||
return 0;
|
||||
}
|
||||
this.incrementHeight = function(){
|
||||
this.nodes.incrementHeight();
|
||||
this.height++;
|
||||
};
|
||||
this.decrementHeight = function(){
|
||||
this.nodes.decrementHeight();
|
||||
this.height--;
|
||||
};
|
||||
}
|
||||
function nodeList(height){
|
||||
var arr = [];
|
||||
this.height = height;
|
||||
for (var i = 0; i < height; i++) arr[i] = null;
|
||||
this.item = function(i){
|
||||
return arr[i];
|
||||
};
|
||||
this.incrementHeight = function(){
|
||||
this.height++;
|
||||
arr[this.height] = null;
|
||||
};
|
||||
this.decrementHeight = function(){
|
||||
arr.splice(arr.length - 1, 1);
|
||||
this.height--;
|
||||
};
|
||||
}
|
||||
function iterator(list){
|
||||
this.current = list.head;
|
||||
this.atEnd = false;
|
||||
this.moveNext = function(){
|
||||
if (this.atEnd) return !this.atEnd;
|
||||
this.current = this.current.nodes[0];
|
||||
this.atEnd = (this.current == null);
|
||||
return !this.atEnd;
|
||||
};
|
||||
this.reset = function(){
|
||||
this.current = null;
|
||||
};
|
||||
}
|
||||
|
||||
function chooseRandomHeight(max){
|
||||
var level = 1;
|
||||
while (Math.random() < PROB && level < max) level++;
|
||||
return level;
|
||||
}
|
||||
|
||||
var PROB = 0.5;
|
||||
var comparisons = 0;
|
||||
|
||||
this.head = new node(1);
|
||||
this.count = 0;
|
||||
this.add = function(val){
|
||||
var updates = [];
|
||||
var current = this.head;
|
||||
for (var i = this.head.height; i >= 0; i--){
|
||||
if (!(current.nodes[i] != null && current.nodes[i].compare(val) < 0)) comparisons++;
|
||||
while (current.nodes[i] != null && current.nodes[i].compare(val) < 0){
|
||||
current = current.nodes[i];
|
||||
comparisons++;
|
||||
}
|
||||
updates[i] = current;
|
||||
}
|
||||
if (current.nodes[0] != null && current.nodes[0].compare(val) == 0) return;
|
||||
var n = new node(val, chooseRandomHeight(this.head.height + 1));
|
||||
this.count++;
|
||||
if (n.height > this.head.height){
|
||||
this.head.incrementHeight();
|
||||
this.head.nodes[this.head.height - 1] = n;
|
||||
}
|
||||
for (i = 0; i < n.height; i++){
|
||||
if (i < updates.length) {
|
||||
n.nodes[i] = updates[i].nodes[i];
|
||||
updates[i].nodes[i] = n;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
this.contains = function(val){
|
||||
var current = this.head;
|
||||
var i;
|
||||
for (i = this.head.height - 1; i >= 0; i--) {
|
||||
while (current.item(i) != null) {
|
||||
comparisons++;
|
||||
var result = current.nodes[i].compare(val);
|
||||
if (result == 0) return true;
|
||||
else if (result < 0) current = current.nodes[i];
|
||||
else break;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
this.getIterator = function(){
|
||||
return new iterator(this);
|
||||
};
|
||||
|
||||
this.remove = function(val){
|
||||
var updates = [];
|
||||
var current = this.head;
|
||||
for (var i = this.head.height - 1; i >= 0; i--){
|
||||
if (!(current.nodes[i] != null && current.nodes[i].compare(val) < 0)) comparisons++;
|
||||
while (current.nodes[i] != null && current.nodes[i].compare(val) < 0) {
|
||||
current = current.nodes[i];
|
||||
comparisons++;
|
||||
}
|
||||
updates[i] = current;
|
||||
}
|
||||
|
||||
current = current.nodes[0];
|
||||
if (current != null && current.compare(val) == 0){
|
||||
this.count--;
|
||||
for (var i = 0; i < this.head.height; i++){
|
||||
if (updates[i].nodes[i] != current) break;
|
||||
else updates[i].nodes[i] = current.nodes[i];
|
||||
}
|
||||
if (this.head.nodes[this.head.height - 1] == null) this.head.decrementHeight();
|
||||
}
|
||||
};
|
||||
this.resetComparisons = function(){
|
||||
comparisons = 0;
|
||||
};
|
||||
}
|
211
webapp/web/src/collections/SortedList.js
Normal file
211
webapp/web/src/collections/SortedList.js
Normal file
|
@ -0,0 +1,211 @@
|
|||
/*
|
||||
Copyright (c) 2004-2006, The Dojo Foundation
|
||||
All Rights Reserved.
|
||||
|
||||
Licensed under the Academic Free License version 2.1 or above OR the
|
||||
modified BSD license. For more information on Dojo licensing, see:
|
||||
|
||||
http://dojotoolkit.org/community/licensing.shtml
|
||||
*/
|
||||
|
||||
dojo.provide("dojo.collections.SortedList");
|
||||
dojo.require("dojo.collections.Collections");
|
||||
|
||||
dojo.collections.SortedList=function(/* object? */ dictionary){
|
||||
// summary
|
||||
// creates a collection that acts like a dictionary but is also internally sorted.
|
||||
// Note that the act of adding any elements forces an internal resort, making this object potentially slow.
|
||||
var _this=this;
|
||||
var items={};
|
||||
var q=[];
|
||||
var sorter=function(a,b){
|
||||
if (a.key > b.key) return 1;
|
||||
if (a.key < b.key) return -1;
|
||||
return 0;
|
||||
};
|
||||
var build=function(){
|
||||
q=[];
|
||||
var e=_this.getIterator();
|
||||
while (!e.atEnd()){
|
||||
q.push(e.get());
|
||||
}
|
||||
q.sort(sorter);
|
||||
};
|
||||
var testObject={};
|
||||
|
||||
this.count=q.length;
|
||||
this.add=function(/* string */ k,/* object */v){
|
||||
// summary
|
||||
// add the passed value to the dictionary at location k
|
||||
if (!items[k]) {
|
||||
items[k]=new dojo.collections.DictionaryEntry(k,v);
|
||||
this.count=q.push(items[k]);
|
||||
q.sort(sorter);
|
||||
}
|
||||
};
|
||||
this.clear=function(){
|
||||
// summary
|
||||
// clear the internal collections
|
||||
items={};
|
||||
q=[];
|
||||
this.count=q.length;
|
||||
};
|
||||
this.clone=function(){
|
||||
// summary
|
||||
// create a clone of this sorted list
|
||||
return new dojo.collections.SortedList(this); // dojo.collections.SortedList
|
||||
};
|
||||
this.contains=this.containsKey=function(/* string */ k){
|
||||
// summary
|
||||
// Check to see if the list has a location k
|
||||
if(testObject[k]){
|
||||
return false; // bool
|
||||
}
|
||||
return (items[k]!=null); // bool
|
||||
};
|
||||
this.containsValue=function(/* object */ o){
|
||||
// summary
|
||||
// Check to see if this list contains the passed object
|
||||
var e=this.getIterator();
|
||||
while (!e.atEnd()){
|
||||
var item=e.get();
|
||||
if(item.value==o){
|
||||
return true; // bool
|
||||
}
|
||||
}
|
||||
return false; // bool
|
||||
};
|
||||
this.copyTo=function(/* array */ arr, /* int */ i){
|
||||
// summary
|
||||
// copy the contents of the list into array arr at index i
|
||||
var e=this.getIterator();
|
||||
var idx=i;
|
||||
while(!e.atEnd()){
|
||||
arr.splice(idx,0,e.get());
|
||||
idx++;
|
||||
}
|
||||
};
|
||||
this.entry=function(/* string */ k){
|
||||
// summary
|
||||
// return the object at location k
|
||||
return items[k]; // dojo.collections.DictionaryEntry
|
||||
};
|
||||
this.forEach=function(/* function */ fn, /* object? */ scope){
|
||||
// summary
|
||||
// functional iterator, following the mozilla spec.
|
||||
var s=scope||dj_global;
|
||||
if(Array.forEach){
|
||||
Array.forEach(q, fn, s);
|
||||
}else{
|
||||
for(var i=0; i<q.length; i++){
|
||||
fn.call(s, q[i], i, q);
|
||||
}
|
||||
}
|
||||
};
|
||||
this.getByIndex=function(/* int */ i){
|
||||
// summary
|
||||
// return the item at index i
|
||||
return q[i].valueOf(); // object
|
||||
};
|
||||
this.getIterator=function(){
|
||||
// summary
|
||||
// get an iterator for this object
|
||||
return new dojo.collections.DictionaryIterator(items); // dojo.collections.DictionaryIterator
|
||||
};
|
||||
this.getKey=function(/* int */ i){
|
||||
// summary
|
||||
// return the key of the item at index i
|
||||
return q[i].key;
|
||||
};
|
||||
this.getKeyList=function(){
|
||||
// summary
|
||||
// return an array of the keys set in this list
|
||||
var arr=[];
|
||||
var e=this.getIterator();
|
||||
while (!e.atEnd()){
|
||||
arr.push(e.get().key);
|
||||
}
|
||||
return arr; // array
|
||||
};
|
||||
this.getValueList=function(){
|
||||
// summary
|
||||
// return an array of values in this list
|
||||
var arr=[];
|
||||
var e=this.getIterator();
|
||||
while (!e.atEnd()){
|
||||
arr.push(e.get().value);
|
||||
}
|
||||
return arr; // array
|
||||
};
|
||||
this.indexOfKey=function(/* string */ k){
|
||||
// summary
|
||||
// return the index of the passed key.
|
||||
for (var i=0; i<q.length; i++){
|
||||
if (q[i].key==k){
|
||||
return i; // int
|
||||
}
|
||||
}
|
||||
return -1; // int
|
||||
};
|
||||
this.indexOfValue=function(/* object */ o){
|
||||
// summary
|
||||
// return the first index of object o
|
||||
for (var i=0; i<q.length; i++){
|
||||
if (q[i].value==o){
|
||||
return i; // int
|
||||
}
|
||||
}
|
||||
return -1; // int
|
||||
};
|
||||
this.item=function(/* string */ k){
|
||||
// summary
|
||||
// return the value of the object at location k.
|
||||
if(k in items && !testObject[k]){
|
||||
return items[k].valueOf(); // object
|
||||
}
|
||||
return undefined; // object
|
||||
};
|
||||
this.remove=function(/* string */k){
|
||||
// summary
|
||||
// remove the item at location k and rebuild the internal collections.
|
||||
delete items[k];
|
||||
build();
|
||||
this.count=q.length;
|
||||
};
|
||||
this.removeAt=function(/* int */ i){
|
||||
// summary
|
||||
// remove the item at index i, and rebuild the internal collections.
|
||||
delete items[q[i].key];
|
||||
build();
|
||||
this.count=q.length;
|
||||
};
|
||||
this.replace=function(/* string */ k, /* object */ v){
|
||||
// summary
|
||||
// Replace an existing item if it's there, and add a new one if not.
|
||||
if (!items[k]){
|
||||
// we're adding a new object, return false
|
||||
this.add(k,v);
|
||||
return false; // bool
|
||||
}else{
|
||||
// we're replacing an object, return true
|
||||
items[k]=new dojo.collections.DictionaryEntry(k,v);
|
||||
q.sort(sorter);
|
||||
return true; // bool
|
||||
}
|
||||
};
|
||||
this.setByIndex=function(/* int */ i, /* object */ o){
|
||||
// summary
|
||||
// set an item by index
|
||||
items[q[i].key].value=o;
|
||||
build();
|
||||
this.count=q.length;
|
||||
};
|
||||
if (dictionary){
|
||||
var e=dictionary.getIterator();
|
||||
while (!e.atEnd()){
|
||||
var item=e.get();
|
||||
q[q.length]=items[item.key]=new dojo.collections.DictionaryEntry(item.key,item.value);
|
||||
}
|
||||
q.sort(sorter);
|
||||
}
|
||||
}
|
85
webapp/web/src/collections/Stack.js
Normal file
85
webapp/web/src/collections/Stack.js
Normal file
|
@ -0,0 +1,85 @@
|
|||
/*
|
||||
Copyright (c) 2004-2006, The Dojo Foundation
|
||||
All Rights Reserved.
|
||||
|
||||
Licensed under the Academic Free License version 2.1 or above OR the
|
||||
modified BSD license. For more information on Dojo licensing, see:
|
||||
|
||||
http://dojotoolkit.org/community/licensing.shtml
|
||||
*/
|
||||
|
||||
dojo.provide("dojo.collections.Stack");
|
||||
dojo.require("dojo.collections.Collections");
|
||||
|
||||
dojo.collections.Stack=function(/* array? */arr){
|
||||
// summary
|
||||
// returns an object of type dojo.collections.Stack
|
||||
var q=[];
|
||||
if (arr) q=q.concat(arr);
|
||||
this.count=q.length;
|
||||
this.clear=function(){
|
||||
// summary
|
||||
// Clear the internal array and reset the count
|
||||
q=[];
|
||||
this.count=q.length;
|
||||
};
|
||||
this.clone=function(){
|
||||
// summary
|
||||
// Create and return a clone of this Stack
|
||||
return new dojo.collections.Stack(q);
|
||||
};
|
||||
this.contains=function(/* object */o){
|
||||
// summary
|
||||
// check to see if the stack contains object o
|
||||
for (var i=0; i<q.length; i++){
|
||||
if (q[i] == o){
|
||||
return true; // bool
|
||||
}
|
||||
}
|
||||
return false; // bool
|
||||
};
|
||||
this.copyTo=function(/* array */ arr, /* int */ i){
|
||||
// summary
|
||||
// copy the stack into array arr at index i
|
||||
arr.splice(i,0,q);
|
||||
};
|
||||
this.forEach=function(/* function */ fn, /* object? */ scope){
|
||||
// summary
|
||||
// functional iterator, following the mozilla spec.
|
||||
var s=scope||dj_global;
|
||||
if(Array.forEach){
|
||||
Array.forEach(q, fn, s);
|
||||
}else{
|
||||
for(var i=0; i<q.length; i++){
|
||||
fn.call(s, q[i], i, q);
|
||||
}
|
||||
}
|
||||
};
|
||||
this.getIterator=function(){
|
||||
// summary
|
||||
// get an iterator for this collection
|
||||
return new dojo.collections.Iterator(q); // dojo.collections.Iterator
|
||||
};
|
||||
this.peek=function(){
|
||||
// summary
|
||||
// Return the next item without altering the stack itself.
|
||||
return q[(q.length-1)]; // object
|
||||
};
|
||||
this.pop=function(){
|
||||
// summary
|
||||
// pop and return the next item on the stack
|
||||
var r=q.pop();
|
||||
this.count=q.length;
|
||||
return r; // object
|
||||
};
|
||||
this.push=function(/* object */ o){
|
||||
// summary
|
||||
// Push object o onto the stack
|
||||
this.count=q.push(o);
|
||||
};
|
||||
this.toArray=function(){
|
||||
// summary
|
||||
// create and return an array based on the internal collection
|
||||
return [].concat(q); // array
|
||||
};
|
||||
}
|
22
webapp/web/src/collections/__package__.js
Normal file
22
webapp/web/src/collections/__package__.js
Normal file
|
@ -0,0 +1,22 @@
|
|||
/*
|
||||
Copyright (c) 2004-2006, The Dojo Foundation
|
||||
All Rights Reserved.
|
||||
|
||||
Licensed under the Academic Free License version 2.1 or above OR the
|
||||
modified BSD license. For more information on Dojo licensing, see:
|
||||
|
||||
http://dojotoolkit.org/community/licensing.shtml
|
||||
*/
|
||||
|
||||
dojo.kwCompoundRequire({
|
||||
common: [
|
||||
"dojo.collections.Collections",
|
||||
"dojo.collections.SortedList",
|
||||
"dojo.collections.Dictionary",
|
||||
"dojo.collections.Queue",
|
||||
"dojo.collections.ArrayList",
|
||||
"dojo.collections.Stack",
|
||||
"dojo.collections.Set"
|
||||
]
|
||||
});
|
||||
dojo.provide("dojo.collections.*");
|
Loading…
Add table
Add a link
Reference in a new issue