Index: Source/devtools/front_end/utilities.js |
diff --git a/Source/devtools/front_end/utilities.js b/Source/devtools/front_end/utilities.js |
index f94e3b94f01b04fcbad3698b861384ae85400258..98ca021c6d65df2a14e9e3da9d774c2731a78e26 100644 |
--- a/Source/devtools/front_end/utilities.js |
+++ b/Source/devtools/front_end/utilities.js |
@@ -330,30 +330,6 @@ Object.defineProperty(Array.prototype, "keySet", |
} |
}); |
-Object.defineProperty(Array.prototype, "upperBound", |
-{ |
- /** |
- * @param {number} value |
- * @return {number} |
- * @this {Array.<number>} |
- */ |
- value: function(value) |
- { |
- var first = 0; |
- var count = this.length; |
- while (count > 0) { |
- var step = count >> 1; |
- var middle = first + step; |
- if (value >= this[middle]) { |
- first = middle + 1; |
- count -= step + 1; |
- } else |
- count = step; |
- } |
- return first; |
- } |
-}); |
- |
Object.defineProperty(Array.prototype, "rotate", |
{ |
/** |
@@ -470,45 +446,84 @@ Object.defineProperty(Array.prototype, "qselect", |
} |
}); |
-/** |
- * @param {*} object |
- * @param {Array.<*>} array |
- * @param {function(*, *): number} comparator |
- * @return {number} |
- */ |
-function binarySearch(object, array, comparator) |
+Object.defineProperty(Array.prototype, "lowerBound", |
{ |
- var first = 0; |
- var last = array.length - 1; |
- |
- while (first <= last) { |
- var mid = (first + last) >> 1; |
- var c = comparator(object, array[mid]); |
- if (c > 0) |
- first = mid + 1; |
- else if (c < 0) |
- last = mid - 1; |
- else |
- return mid; |
+ /** |
+ * Return index of the leftmost element that is equal or greater |
+ * than the specimen object. If there's no such element (i.e. all |
+ * elements are smaller than the specimen) returns array.length. |
+ * The function works for sorted array. |
+ * |
+ * @this {Array.<*>} |
+ * @param {*} object |
+ * @param {function(*,*):number=} comparator |
+ * @return {number} |
+ */ |
+ value: function(object, comparator) |
+ { |
+ function defaultComparator(a, b) |
+ { |
+ return a - b; |
+ } |
+ comparator = comparator || defaultComparator; |
+ var l = 0; |
+ var r = this.length; |
+ while (l < r) { |
+ var m = (l + r) >> 1; |
+ if (comparator(object, this[m]) > 0) |
+ l = m + 1; |
+ else |
+ r = m; |
+ } |
+ return r; |
} |
+}); |
- // Return the nearest lesser index negated minus 2, i.e.: |
- // "-1" means "-1", "-2" means "0, "-3" means "1", etc. |
- return -(first + 1); |
-} |
+Object.defineProperty(Array.prototype, "upperBound", |
+{ |
+ /** |
+ * Return index of the leftmost element that is greater |
+ * than the specimen object. If there's no such element (i.e. all |
+ * elements are smaller than the specimen) returns array.length. |
+ * The function works for sorted array. |
+ * |
+ * @this {Array.<*>} |
+ * @param {*} object |
+ * @param {function(*,*):number=} comparator |
+ * @return {number} |
+ */ |
+ value: function(object, comparator) |
+ { |
+ function defaultComparator(a, b) |
+ { |
+ return a - b; |
+ } |
+ comparator = comparator || defaultComparator; |
+ var l = 0; |
+ var r = this.length; |
+ while (l < r) { |
+ var m = (l + r) >> 1; |
+ if (comparator(object, this[m]) >= 0) |
+ l = m + 1; |
+ else |
+ r = m; |
+ } |
+ return r; |
+ } |
+}); |
Object.defineProperty(Array.prototype, "binaryIndexOf", |
{ |
/** |
+ * @this {Array.<*>} |
* @param {*} value |
- * @param {function(*, *): number} comparator |
+ * @param {function(*,*):number} comparator |
* @return {number} |
- * @this {Array.<*>} |
*/ |
value: function(value, comparator) |
{ |
- var result = binarySearch(value, this, comparator); |
- return result >= 0 ? result : -1; |
+ var index = this.lowerBound(value, comparator); |
+ return index < this.length && comparator(value, this[index]) === 0 ? index : -1; |
} |
}); |
@@ -541,30 +556,18 @@ Object.defineProperty(Array.prototype, "peekLast", |
}); |
/** |
- * @param {*} anObject |
- * @param {Array.<*>} aList |
- * @param {function(*, *)} aFunction |
+ * @param {*} object |
+ * @param {Array.<*>} list |
+ * @param {function(*,*):number=} comparator |
* @param {boolean=} insertionIndexAfter |
* @return {number} |
*/ |
-function insertionIndexForObjectInListSortedByFunction(anObject, aList, aFunction, insertionIndexAfter) |
+function insertionIndexForObjectInListSortedByFunction(object, list, comparator, insertionIndexAfter) |
{ |
- var index = binarySearch(anObject, aList, aFunction); |
- if (index < 0) { |
- // See binarySearch implementation. |
- return -index - 1; |
- } |
- |
- if (!insertionIndexAfter) { |
- // Return the first occurence of an item in the list. |
- while (index > 0 && aFunction(anObject, aList[index - 1]) === 0) |
- index--; |
- return index; |
- } |
- // Return the last occurence of an item in the list. |
- while (index < aList.length && aFunction(anObject, aList[index]) === 0) |
- index++; |
- return index; |
+ if (insertionIndexAfter) |
+ return list.upperBound(object, comparator); |
+ else |
+ return list.lowerBound(object, comparator); |
} |
/** |