| OLD | NEW |
| 1 <!DOCTYPE html> | 1 <!DOCTYPE html> |
| 2 <!-- | 2 <!-- |
| 3 Copyright (c) 2014 The Chromium Authors. All rights reserved. | 3 Copyright (c) 2014 The Chromium Authors. All rights reserved. |
| 4 Use of this source code is governed by a BSD-style license that can be | 4 Use of this source code is governed by a BSD-style license that can be |
| 5 found in the LICENSE file. | 5 found in the LICENSE file. |
| 6 --> | 6 --> |
| 7 <link rel="import" href="/tracing/base/base.html"> | 7 <link rel="import" href="/tracing/base/base.html"> |
| 8 <script> | 8 <script> |
| 9 'use strict'; | 9 'use strict'; |
| 10 | 10 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 * | 23 * |
| 24 * @param {Array} ary An array of arbitrary objects. | 24 * @param {Array} ary An array of arbitrary objects. |
| 25 * @param {function():*} mapFn Callback that produces a key value | 25 * @param {function():*} mapFn Callback that produces a key value |
| 26 * from an element in ary. | 26 * from an element in ary. |
| 27 * @param {number} loVal Value for which to search. | 27 * @param {number} loVal Value for which to search. |
| 28 * @return {Number} Offset o into ary where all ary[i] for i <= o | 28 * @return {Number} Offset o into ary where all ary[i] for i <= o |
| 29 * are < loVal, or ary.length if loVal is greater than all elements in | 29 * are < loVal, or ary.length if loVal is greater than all elements in |
| 30 * the array. | 30 * the array. |
| 31 */ | 31 */ |
| 32 function findLowIndexInSortedArray(ary, mapFn, loVal) { | 32 function findLowIndexInSortedArray(ary, mapFn, loVal) { |
| 33 if (ary.length == 0) | 33 if (ary.length === 0) |
| 34 return 1; | 34 return 1; |
| 35 | 35 |
| 36 var low = 0; | 36 var low = 0; |
| 37 var high = ary.length - 1; | 37 var high = ary.length - 1; |
| 38 var i, comparison; | 38 var i, comparison; |
| 39 var hitPos = -1; | 39 var hitPos = -1; |
| 40 while (low <= high) { | 40 while (low <= high) { |
| 41 i = Math.floor((low + high) / 2); | 41 i = Math.floor((low + high) / 2); |
| 42 comparison = mapFn(ary[i]) - loVal; | 42 comparison = mapFn(ary[i]) - loVal; |
| 43 if (comparison < 0) { | 43 if (comparison < 0) { |
| 44 low = i + 1; continue; | 44 low = i + 1; continue; |
| 45 } else if (comparison > 0) { | 45 } else if (comparison > 0) { |
| 46 high = i - 1; continue; | 46 high = i - 1; continue; |
| 47 } else { | 47 } else { |
| 48 hitPos = i; | 48 hitPos = i; |
| 49 high = i - 1; | 49 high = i - 1; |
| 50 } | 50 } |
| 51 } | 51 } |
| 52 // return where we hit, or failing that the low pos | 52 // return where we hit, or failing that the low pos |
| 53 return hitPos != -1 ? hitPos : low; | 53 return hitPos !== -1 ? hitPos : low; |
| 54 } | 54 } |
| 55 | 55 |
| 56 // From devtools/front_end/platform/utilities.js upperBound | 56 // From devtools/front_end/platform/utilities.js upperBound |
| 57 function findHighIndexInSortedArray(ary, mapFn, loVal, hiVal) { | 57 function findHighIndexInSortedArray(ary, mapFn, loVal, hiVal) { |
| 58 var lo = loVal || 0; | 58 var lo = loVal || 0; |
| 59 var hi = hiVal !== undefined ? hiVal : ary.length; | 59 var hi = hiVal !== undefined ? hiVal : ary.length; |
| 60 while (lo < hi) { | 60 while (lo < hi) { |
| 61 var mid = (lo + hi) >> 1; | 61 var mid = (lo + hi) >> 1; |
| 62 if (mapFn(ary[mid]) >= 0) | 62 if (mapFn(ary[mid]) >= 0) |
| 63 lo = mid + 1; | 63 lo = mid + 1; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 84 * interval represented by an element in the array. | 84 * interval represented by an element in the array. |
| 85 * @param {function():*} mapWidthFn Callback that produces the width for the | 85 * @param {function():*} mapWidthFn Callback that produces the width for the |
| 86 * interval represented by an element in the array. | 86 * interval represented by an element in the array. |
| 87 * @param {number} loVal The low value for the search. | 87 * @param {number} loVal The low value for the search. |
| 88 * @return {Number} An index in the array that intersects or is first-above | 88 * @return {Number} An index in the array that intersects or is first-above |
| 89 * loVal, -1 if none found and loVal is below than all the intervals, | 89 * loVal, -1 if none found and loVal is below than all the intervals, |
| 90 * ary.length if loVal is greater than all the intervals. | 90 * ary.length if loVal is greater than all the intervals. |
| 91 */ | 91 */ |
| 92 function findIndexInSortedIntervals(ary, mapLoFn, mapWidthFn, loVal) { | 92 function findIndexInSortedIntervals(ary, mapLoFn, mapWidthFn, loVal) { |
| 93 var first = findLowIndexInSortedArray(ary, mapLoFn, loVal); | 93 var first = findLowIndexInSortedArray(ary, mapLoFn, loVal); |
| 94 if (first == 0) { | 94 if (first === 0) { |
| 95 if (loVal >= mapLoFn(ary[0]) && | 95 if (loVal >= mapLoFn(ary[0]) && |
| 96 loVal < mapLoFn(ary[0]) + mapWidthFn(ary[0], 0)) { | 96 loVal < mapLoFn(ary[0]) + mapWidthFn(ary[0], 0)) { |
| 97 return 0; | 97 return 0; |
| 98 } else { | 98 } else { |
| 99 return -1; | 99 return -1; |
| 100 } | 100 } |
| 101 } else if (first < ary.length) { | 101 } else if (first < ary.length) { |
| 102 if (loVal >= mapLoFn(ary[first]) && | 102 if (loVal >= mapLoFn(ary[first]) && |
| 103 loVal < mapLoFn(ary[first]) + mapWidthFn(ary[first], first)) { | 103 loVal < mapLoFn(ary[first]) + mapWidthFn(ary[first], first)) { |
| 104 return first; | 104 return first; |
| 105 } else if (loVal >= mapLoFn(ary[first - 1]) && | 105 } else if (loVal >= mapLoFn(ary[first - 1]) && |
| 106 loVal < mapLoFn(ary[first - 1]) + | 106 loVal < mapLoFn(ary[first - 1]) + |
| 107 mapWidthFn(ary[first - 1], first - 1)) { | 107 mapWidthFn(ary[first - 1], first - 1)) { |
| 108 return first - 1; | 108 return first - 1; |
| 109 } else { | 109 } else { |
| 110 return ary.length; | 110 return ary.length; |
| 111 } | 111 } |
| 112 } else if (first == ary.length) { | 112 } else if (first === ary.length) { |
| 113 if (loVal >= mapLoFn(ary[first - 1]) && | 113 if (loVal >= mapLoFn(ary[first - 1]) && |
| 114 loVal < mapLoFn(ary[first - 1]) + | 114 loVal < mapLoFn(ary[first - 1]) + |
| 115 mapWidthFn(ary[first - 1], first - 1)) { | 115 mapWidthFn(ary[first - 1], first - 1)) { |
| 116 return first - 1; | 116 return first - 1; |
| 117 } else { | 117 } else { |
| 118 return ary.length; | 118 return ary.length; |
| 119 } | 119 } |
| 120 } else { | 120 } else { |
| 121 return ary.length; | 121 return ary.length; |
| 122 } | 122 } |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 158 } else if (i < ary.length) { | 158 } else if (i < ary.length) { |
| 159 if (val >= mapLoFn(ary[i - 1], i - 1) && | 159 if (val >= mapLoFn(ary[i - 1], i - 1) && |
| 160 val <= mapHiFn(ary[i - 1], i - 1)) { | 160 val <= mapHiFn(ary[i - 1], i - 1)) { |
| 161 return i - 1; | 161 return i - 1; |
| 162 } else if (val >= mapLoFn(ary[i], i) && | 162 } else if (val >= mapLoFn(ary[i], i) && |
| 163 val <= mapHiFn(ary[i], i)) { | 163 val <= mapHiFn(ary[i], i)) { |
| 164 return i; | 164 return i; |
| 165 } else { | 165 } else { |
| 166 return ary.length; | 166 return ary.length; |
| 167 } | 167 } |
| 168 } else if (i == ary.length) { | 168 } else if (i === ary.length) { |
| 169 if (val >= mapLoFn(ary[i - 1], i - 1) && | 169 if (val >= mapLoFn(ary[i - 1], i - 1) && |
| 170 val <= mapHiFn(ary[i - 1], i - 1)) { | 170 val <= mapHiFn(ary[i - 1], i - 1)) { |
| 171 return i - 1; | 171 return i - 1; |
| 172 } else { | 172 } else { |
| 173 return ary.length; | 173 return ary.length; |
| 174 } | 174 } |
| 175 } else { | 175 } else { |
| 176 return ary.length; | 176 return ary.length; |
| 177 } | 177 } |
| 178 } | 178 } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 191 * @param {function():*} mapLoFn Callback that produces the low value for the | 191 * @param {function():*} mapLoFn Callback that produces the low value for the |
| 192 * interval represented by an element in the array. | 192 * interval represented by an element in the array. |
| 193 * @param {function():*} mapWidthFn Callback that produces the width for the | 193 * @param {function():*} mapWidthFn Callback that produces the width for the |
| 194 * interval represented by an element in the array. | 194 * interval represented by an element in the array. |
| 195 * @param {number} loVal The low value for the search, inclusive. | 195 * @param {number} loVal The low value for the search, inclusive. |
| 196 * @param {number} hiVal The high value for the search, non inclusive. | 196 * @param {number} hiVal The high value for the search, non inclusive. |
| 197 * @param {function():*} cb The function to run for intersecting intervals. | 197 * @param {function():*} cb The function to run for intersecting intervals. |
| 198 */ | 198 */ |
| 199 function iterateOverIntersectingIntervals(ary, mapLoFn, mapWidthFn, loVal, | 199 function iterateOverIntersectingIntervals(ary, mapLoFn, mapWidthFn, loVal, |
| 200 hiVal, cb) { | 200 hiVal, cb) { |
| 201 if (ary.length == 0) | 201 if (ary.length === 0) |
| 202 return; | 202 return; |
| 203 | 203 |
| 204 if (loVal > hiVal) return; | 204 if (loVal > hiVal) return; |
| 205 | 205 |
| 206 var i = findLowIndexInSortedArray(ary, mapLoFn, loVal); | 206 var i = findLowIndexInSortedArray(ary, mapLoFn, loVal); |
| 207 if (i == -1) { | 207 if (i === -1) { |
| 208 return; | 208 return; |
| 209 } | 209 } |
| 210 if (i > 0) { | 210 if (i > 0) { |
| 211 var hi = mapLoFn(ary[i - 1]) + mapWidthFn(ary[i - 1], i - 1); | 211 var hi = mapLoFn(ary[i - 1]) + mapWidthFn(ary[i - 1], i - 1); |
| 212 if (hi >= loVal) { | 212 if (hi >= loVal) { |
| 213 cb(ary[i - 1], i - 1); | 213 cb(ary[i - 1], i - 1); |
| 214 } | 214 } |
| 215 } | 215 } |
| 216 if (i == ary.length) { | 216 if (i === ary.length) { |
| 217 return; | 217 return; |
| 218 } | 218 } |
| 219 | 219 |
| 220 for (var n = ary.length; i < n; i++) { | 220 for (var n = ary.length; i < n; i++) { |
| 221 var lo = mapLoFn(ary[i]); | 221 var lo = mapLoFn(ary[i]); |
| 222 if (lo >= hiVal) | 222 if (lo >= hiVal) |
| 223 break; | 223 break; |
| 224 cb(ary[i], i); | 224 cb(ary[i], i); |
| 225 } | 225 } |
| 226 } | 226 } |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 325 findHighIndexInSortedArray: findHighIndexInSortedArray, | 325 findHighIndexInSortedArray: findHighIndexInSortedArray, |
| 326 findIndexInSortedIntervals: findIndexInSortedIntervals, | 326 findIndexInSortedIntervals: findIndexInSortedIntervals, |
| 327 findIndexInSortedClosedIntervals: findIndexInSortedClosedIntervals, | 327 findIndexInSortedClosedIntervals: findIndexInSortedClosedIntervals, |
| 328 iterateOverIntersectingIntervals: iterateOverIntersectingIntervals, | 328 iterateOverIntersectingIntervals: iterateOverIntersectingIntervals, |
| 329 getIntersectingIntervals: getIntersectingIntervals, | 329 getIntersectingIntervals: getIntersectingIntervals, |
| 330 findClosestElementInSortedArray: findClosestElementInSortedArray, | 330 findClosestElementInSortedArray: findClosestElementInSortedArray, |
| 331 findClosestIntervalInSortedIntervals: findClosestIntervalInSortedIntervals | 331 findClosestIntervalInSortedIntervals: findClosestIntervalInSortedIntervals |
| 332 }; | 332 }; |
| 333 }); | 333 }); |
| 334 </script> | 334 </script> |
| OLD | NEW |