1 <!DOCTYPE html> 2 <!-- 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 5 found in the LICENSE file. 6 --> 7 8 <link rel="import" href="/base/base.html"> 9 10 <script> 11 'use strict'; 12 13 /** 14 * @fileoverview Quick range computations. 15 */ 16 tr.exportTo('tr.b', function() { 17 18 function Range() { 19 this.isEmpty_ = true; 20 this.min_ = undefined; 21 this.max_ = undefined; 22 }; 23 24 Range.prototype = { 25 __proto__: Object.prototype, 26 27 reset: function() { 28 this.isEmpty_ = true; 29 this.min_ = undefined; 30 this.max_ = undefined; 31 }, 32 33 get isEmpty() { 34 return this.isEmpty_; 35 }, 36 37 addRange: function(range) { 38 if (range.isEmpty) 39 return; 40 this.addValue(range.min); 41 this.addValue(range.max); 42 }, 43 44 addValue: function(value) { 45 if (this.isEmpty_) { 46 this.max_ = value; 47 this.min_ = value; 48 this.isEmpty_ = false; 49 return; 50 } 51 this.max_ = Math.max(this.max_, value); 52 this.min_ = Math.min(this.min_, value); 53 }, 54 55 set min(min) { 56 this.isEmpty_ = false; 57 this.min_ = min; 58 }, 59 60 get min() { 61 if (this.isEmpty_) 62 return undefined; 63 return this.min_; 64 }, 65 66 get max() { 67 if (this.isEmpty_) 68 return undefined; 69 return this.max_; 70 }, 71 72 set max(max) { 73 this.isEmpty_ = false; 74 this.max_ = max; 75 }, 76 77 get range() { 78 if (this.isEmpty_) 79 return undefined; 80 return this.max_ - this.min_; 81 }, 82 83 get center() { 84 return (this.min_ + this.max_) * 0.5; 85 }, 86 87 equals: function(that) { 88 if (this.isEmpty && that.isEmpty) 89 return true; 90 if (this.isEmpty != that.isEmpty) 91 return false; 92 return this.min === that.min && 93 this.max === that.max; 94 }, 95 96 containsRange: function(range) { 97 if (this.isEmpty || range.isEmpty) 98 return false; 99 return this.min <= range.min && this.max >= range.max; 100 }, 101 102 containsExplicitRange: function(min, max) { 103 if (this.isEmpty) 104 return false; 105 return this.min <= min && this.max >= max; 106 }, 107 108 intersectsRange: function(range) { 109 if (this.isEmpty || range.isEmpty) 110 return false; 111 return !(range.max < this.min || 112 range.min > this.max); 113 }, 114 115 intersectsExplicitRange: function(min, max) { 116 if (this.isEmpty) 117 return false; 118 return !(max < this.min || 119 min > this.max); 120 } 121 }; 122 123 Range.fromExplicitRange = function(min, max) { 124 var range = new Range(); 125 range.min = min; 126 range.max = max; 127 return range; 128 }; 129 130 Range.compareByMinTimes = function(a, b) { 131 if (!a.isEmpty && !b.isEmpty) 132 return a.min_ - b.min_; 133 134 if (a.isEmpty && !b.isEmpty) 135 return -1; 136 137 if (!a.isEmpty && b.isEmpty) 138 return 1; 139 140 return 0; 141 }; 142 143 return { 144 Range: Range 145 }; 146 }); 147 </script> 148