Index: third_party/polymer/v0_8/components-chromium/observe-js/util/planner.js |
diff --git a/third_party/polymer/v0_8/components-chromium/observe-js/util/planner.js b/third_party/polymer/v0_8/components-chromium/observe-js/util/planner.js |
deleted file mode 100644 |
index b75f06d3c5ae238edc88f52588362f357248c6b8..0000000000000000000000000000000000000000 |
--- a/third_party/polymer/v0_8/components-chromium/observe-js/util/planner.js |
+++ /dev/null |
@@ -1,309 +0,0 @@ |
-// Copyright 2012 Google Inc. |
-// |
-// 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. |
- |
-(function(global) { |
- |
- "use strict"; |
- |
- function ArraySet() { |
- this.entries = []; |
- } |
- |
- ArraySet.prototype = { |
- add: function(key) { |
- if (this.entries.indexOf(key) >= 0) |
- return; |
- |
- this.entries.push(key); |
- }, |
- |
- delete: function(key) { |
- var i = this.entries.indexOf(key); |
- if (i < 0) |
- return; |
- |
- this.entries.splice(i, 1); |
- }, |
- |
- first: function() { |
- return this.entries[0]; |
- }, |
- |
- get size() { |
- return this.entries.length; |
- } |
- }; |
- |
- function UIDSet() { |
- this.entries = {}; |
- this.size = 0; |
- } |
- |
- UIDSet.prototype = { |
- add: function(key) { |
- if (this.entries[key.__UID__] !== undefined) |
- return; |
- |
- this.entries[key.__UID__] = key; |
- this.size++; |
- }, |
- |
- delete: function(key) { |
- if (this.entries[key.__UID__] === undefined) |
- return; |
- |
- this.entries[key.__UID__] = undefined; |
- this.size--; |
- } |
- }; |
- |
- function Heap(scoreFunction, populate) { |
- this.scoreFunction = scoreFunction; |
- this.content = populate || []; |
- if (this.content.length) |
- this.build(); |
- } |
- |
- Heap.prototype = { |
- get size() { |
- return this.content.length; |
- }, |
- |
- build: function() { |
- var lastNonLeaf = Math.floor(this.content.length / 2) - 1; |
- for (var i = lastNonLeaf; i >= 0; i--) |
- this.sinkDown(i); |
- }, |
- |
- push: function(element) { |
- this.content.push(element); |
- this.bubbleUp(this.content.length - 1); |
- }, |
- |
- pop: function() { |
- var result = this.content[0]; |
- var end = this.content.pop(); |
- if (this.content.length) { |
- this.content[0] = end; |
- this.sinkDown(0); |
- } |
- return result; |
- }, |
- |
- delete: function(element) { |
- var len = this.content.length; |
- for (var i = 0; i < len; i++) { |
- if (this.content[i] == element) { |
- var end = this.content.pop(); |
- if (i != len - 1) { |
- this.content[i] = end; |
- if (this.scoreFunction(end) < this.scoreFunction(node)) this.bubbleUp(i); |
- else this.sinkDown(i); |
- } |
- return; |
- } |
- } |
- }, |
- |
- bubbleUp: function(n) { |
- var element = this.content[n]; |
- while (n > 0) { |
- var parentN = Math.floor((n + 1) / 2) - 1, |
- parent = this.content[parentN]; |
- |
- if (this.scoreFunction(element) <= this.scoreFunction(parent)) |
- break; |
- |
- this.content[parentN] = element; |
- this.content[n] = parent; |
- n = parentN; |
- } |
- }, |
- |
- sinkDown: function(n) { |
- var length = this.content.length, |
- element = this.content[n], |
- elemScore = this.scoreFunction(element); |
- |
- do { |
- var child2N = (n + 1) * 2 |
- var child1N = child2N - 1; |
- |
- var swap = null; |
- var swapScore = elemScore; |
- |
- if (child1N < length) { |
- var child1 = this.content[child1N], |
- child1Score = this.scoreFunction(child1); |
- if (child1Score > elemScore) { |
- swap = child1N; |
- swapScore = child1Score; |
- } |
- } |
- |
- if (child2N < length) { |
- var child2 = this.content[child2N], |
- child2Score = this.scoreFunction(child2); |
- if (child2Score > swapScore) |
- swap = child2N; |
- } |
- |
- if (swap != null) { |
- this.content[n] = this.content[swap]; |
- this.content[swap] = element; |
- n = swap; |
- } |
- } while (swap != null); |
- } |
- }; |
- |
- function Variable(stayFunc) { |
- this.stayFunc = stayFunc; |
- this.methods = new ArraySet; |
- }; |
- |
- Variable.prototype = { |
- freeMethod: function() { |
- return this.methods.first(); |
- } |
- } |
- |
- function Method(constraint, variable) { |
- this.constraint = constraint; |
- this.variable = variable; |
- }; |
- |
- function Constraint(planner) { |
- this.planner = planner; |
- this.methods = []; |
- }; |
- |
- Constraint.prototype = { |
- addMethod: function(variable) { |
- var method = new Method(this, variable); |
- this.methods.push(method); |
- method.__UID__ = this.planner.methodUIDCounter++; |
- return method; |
- }, |
- |
- reset: function() { |
- this.methods.forEach(function(method) { |
- method.variable.methods.add(method); |
- }); |
- }, |
- |
- remove: function() { |
- this.methods.forEach(function(method) { |
- method.variable.methods.delete(method); |
- }); |
- } |
- }; |
- |
- function Planner() { |
- this.variables = []; |
- this.constraints = []; |
- this.variableUIDCounter = 1; |
- this.methodUIDCounter = 1; |
- }; |
- |
- Planner.prototype = { |
- addVariable: function(stayFunc) { |
- var variable = new Variable(stayFunc); |
- variable.__UID__ = this.variableUIDCounter++; |
- this.variables.push(variable); |
- return variable; |
- }, |
- |
- addConstraint: function() { |
- var constraint = new Constraint(this); |
- this.constraints.push(constraint); |
- return constraint; |
- }, |
- |
- removeConstraint: function(constraint) { |
- var index = this.constraints.indexOf(constraint); |
- if (index < 0) |
- return; |
- |
- constraint.remove(); |
- this.constraints.splice(index, 1); |
- |
- this.constraints.forEach(function(constraint) { |
- constraint.reset(); |
- }); |
- |
- this.variables = this.variables.filter(function(variable) { |
- return variable.methods.size; |
- }); |
- }, |
- |
- getPlan: function() { |
- this.variables.forEach(function(variable) { |
- variable.priority = variable.stayFunc(); |
- }); |
- |
- this.constraints.forEach(function(constraint) { |
- constraint.reset(); |
- }); |
- |
- var methods = []; |
- var free = []; |
- var overconstrained = new UIDSet; |
- |
- this.variables.forEach(function(variable) { |
- var methodCount = variable.methods.size; |
- |
- if (methodCount > 1) |
- overconstrained.add(variable); |
- else if (methodCount == 1) |
- free.push(variable); |
- }); |
- |
- free = new Heap(function(variable) { |
- return variable.priority; |
- }, free); |
- |
- while (free.size) { |
- var lowest; |
- do { |
- lowest = free.pop(); |
- } while (free.size && !lowest.methods.size); |
- |
- if (!lowest.methods.size) |
- break; |
- |
- var method = lowest.freeMethod(); |
- var constraint = method.constraint; |
- |
- constraint.remove(); |
- constraint.methods.forEach(function(method) { |
- var variable = method.variable; |
- if (variable.methods.size == 1) { |
- overconstrained.delete(variable); |
- free.push(variable); |
- } |
- }); |
- |
- methods.push(method); |
- } |
- |
- if (overconstrained.size) |
- return undefined; |
- |
- return methods.reverse(); |
- } |
- } |
- |
- global.Planner = Planner; |
-})(this); |