OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 class _Double implements double { | 5 class _Double implements double { |
6 factory _Double.fromInteger(int value) | 6 factory _Double.fromInteger(int value) |
7 native "Double_doubleFromInteger"; | 7 native "Double_doubleFromInteger"; |
8 | 8 |
| 9 factory _Double.fromFraction(fraction value) { |
| 10 return _DoubleFromFraction(value._numerator, value._denominator); |
| 11 } |
| 12 static _Double _DoubleFromFraction(int numerator, int denominator) |
| 13 native "Double_doubleFromFraction"; |
| 14 |
9 Type get runtimeType => double; | 15 Type get runtimeType => double; |
10 | 16 |
11 // TODO: Make a stared static method for hashCode and _identityHashCode | 17 // TODO: Make a stared static method for hashCode and _identityHashCode |
12 // when semantics are corrected as described in: | 18 // when semantics are corrected as described in: |
13 // https://github.com/dart-lang/sdk/issues/2884 | 19 // https://github.com/dart-lang/sdk/issues/2884 |
14 int get hashCode => (isNaN || isInfinite) ? 0 : toInt(); | 20 int get hashCode => (isNaN || isInfinite) ? 0 : toInt(); |
15 int get _identityHashCode => (isNaN || isInfinite) ? 0 : toInt(); | 21 int get _identityHashCode => (isNaN || isInfinite) ? 0 : toInt(); |
16 | 22 |
17 double operator +(num other) { | 23 double operator +(num other) { |
18 return _add(other.toDouble()); | 24 return _add(other.toDouble()); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
50 double _remainder(double other) native "Double_remainder"; | 56 double _remainder(double other) native "Double_remainder"; |
51 | 57 |
52 double operator -() native "Double_flipSignBit"; | 58 double operator -() native "Double_flipSignBit"; |
53 | 59 |
54 bool operator ==(other) { | 60 bool operator ==(other) { |
55 if (!(other is num)) return false; | 61 if (!(other is num)) return false; |
56 return _equal(other.toDouble()); | 62 return _equal(other.toDouble()); |
57 } | 63 } |
58 bool _equal(double other) native "Double_equal"; | 64 bool _equal(double other) native "Double_equal"; |
59 bool _equalToInteger(int other) native "Double_equalToInteger"; | 65 bool _equalToInteger(int other) native "Double_equalToInteger"; |
| 66 bool _equalToFraction(fraction other) => _equal(other.toDouble()); |
60 bool operator <(num other) { | 67 bool operator <(num other) { |
61 return other > this; | 68 return other > this; |
62 } | 69 } |
63 bool operator >(num other) { | 70 bool operator >(num other) { |
64 return _greaterThan(other.toDouble()); | 71 return _greaterThan(other.toDouble()); |
65 } | 72 } |
66 bool _greaterThan(double other) native "Double_greaterThan"; | 73 bool _greaterThan(double other) native "Double_greaterThan"; |
67 bool operator >=(num other) { | 74 bool operator >=(num other) { |
68 return (this == other) || (this > other); | 75 return (this == other) || (this > other); |
69 } | 76 } |
(...skipping 14 matching lines...) Expand all Loading... |
84 } | 91 } |
85 double _moduloFromInteger(int other) { | 92 double _moduloFromInteger(int other) { |
86 return new _Double.fromInteger(other)._modulo(this); | 93 return new _Double.fromInteger(other)._modulo(this); |
87 } | 94 } |
88 double _remainderFromInteger(int other) { | 95 double _remainderFromInteger(int other) { |
89 return new _Double.fromInteger(other)._remainder(this); | 96 return new _Double.fromInteger(other)._remainder(this); |
90 } | 97 } |
91 bool _greaterThanFromInteger(int other) | 98 bool _greaterThanFromInteger(int other) |
92 native "Double_greaterThanFromInteger"; | 99 native "Double_greaterThanFromInteger"; |
93 | 100 |
| 101 double _addFromFraction(fraction other) { |
| 102 return new _Double.fromFraction(other)._add(this); |
| 103 } |
| 104 double _subFromFraction(fraction other) { |
| 105 return new _Double.fromFraction(other)._sub(this); |
| 106 } |
| 107 double _mulFromFraction(fraction other) { |
| 108 return new _Double.fromFraction(other)._mul(this); |
| 109 } |
| 110 double _divFromFraction(fraction other) { |
| 111 return new _Double.fromFraction(other)._div(this); |
| 112 } |
| 113 int _truncDivFromFraction(fraction other) { |
| 114 return new _Double.fromFraction(other)._trunc_div(this); |
| 115 } |
| 116 double _moduloFromFraction(fraction other) { |
| 117 return new _Double.fromFraction(other)._modulo(this); |
| 118 } |
| 119 double _remainderFromFraction(fraction other) { |
| 120 return new _Double.fromFraction(other)._remainder(this); |
| 121 } |
| 122 bool _greaterThanFromFraction(fraction other) { |
| 123 return new _Double.fromFraction(other)._greaterThan(this); |
| 124 } |
| 125 |
94 bool get isNegative native "Double_getIsNegative"; | 126 bool get isNegative native "Double_getIsNegative"; |
95 bool get isInfinite native "Double_getIsInfinite"; | 127 bool get isInfinite native "Double_getIsInfinite"; |
96 bool get isNaN native "Double_getIsNaN"; | 128 bool get isNaN native "Double_getIsNaN"; |
97 bool get isFinite => !isInfinite && !isNaN; // Can be optimized. | 129 bool get isFinite => !isInfinite && !isNaN; // Can be optimized. |
98 | 130 |
99 double abs() { | 131 double abs() { |
100 // Handle negative 0.0. | 132 // Handle negative 0.0. |
101 if (this == 0.0) return 0.0; | 133 if (this == 0.0) return 0.0; |
102 return this < 0.0 ? -this : this; | 134 return this < 0.0 ? -this : this; |
103 } | 135 } |
(...skipping 25 matching lines...) Expand all Loading... |
129 if (lowerLimit.compareTo(upperLimit) > 0) { | 161 if (lowerLimit.compareTo(upperLimit) > 0) { |
130 throw new ArgumentError(lowerLimit); | 162 throw new ArgumentError(lowerLimit); |
131 } | 163 } |
132 if (lowerLimit.isNaN) return lowerLimit; | 164 if (lowerLimit.isNaN) return lowerLimit; |
133 if (this.compareTo(lowerLimit) < 0) return lowerLimit; | 165 if (this.compareTo(lowerLimit) < 0) return lowerLimit; |
134 if (this.compareTo(upperLimit) > 0) return upperLimit; | 166 if (this.compareTo(upperLimit) > 0) return upperLimit; |
135 return this; | 167 return this; |
136 } | 168 } |
137 | 169 |
138 int toInt() native "Double_toInt"; | 170 int toInt() native "Double_toInt"; |
139 num _toBigintOrDouble() { return this; } | 171 num _toBigintIfInteger() { return this; } |
| 172 num _toDoubleOrFraction() { return this; } |
140 double toDouble() { return this; } | 173 double toDouble() { return this; } |
141 | 174 |
| 175 fraction toFraction() { |
| 176 var fract = new List(2); |
| 177 _DoubleToFraction(fract); |
| 178 return new _Fraction(fract[0], fract[1]); |
| 179 } |
| 180 void _DoubleToFraction(List fract) native "Double_toFraction"; |
| 181 |
| 182 fraction toPercent() { |
| 183 return new _Fraction((this*100).toInt(), 100); |
| 184 } |
| 185 |
142 static const int CACHE_SIZE_LOG2 = 3; | 186 static const int CACHE_SIZE_LOG2 = 3; |
143 static const int CACHE_LENGTH = 1 << (CACHE_SIZE_LOG2 + 1); | 187 static const int CACHE_LENGTH = 1 << (CACHE_SIZE_LOG2 + 1); |
144 static const int CACHE_MASK = CACHE_LENGTH - 1; | 188 static const int CACHE_MASK = CACHE_LENGTH - 1; |
145 // Each key (double) followed by its toString result. | 189 // Each key (double) followed by its toString result. |
146 static final List _cache = new List(CACHE_LENGTH); | 190 static final List _cache = new List(CACHE_LENGTH); |
147 static int _cacheEvictIndex = 0; | 191 static int _cacheEvictIndex = 0; |
148 | 192 |
149 String _toString() native "Double_toString"; | 193 String _toString() native "Double_toString"; |
150 | 194 |
151 String toString() { | 195 String toString() { |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
271 return EQUAL; | 315 return EQUAL; |
272 } | 316 } |
273 } else if (isNaN) { | 317 } else if (isNaN) { |
274 return other.isNaN ? EQUAL : GREATER; | 318 return other.isNaN ? EQUAL : GREATER; |
275 } else { | 319 } else { |
276 // Other is NaN. | 320 // Other is NaN. |
277 return LESS; | 321 return LESS; |
278 } | 322 } |
279 } | 323 } |
280 } | 324 } |
OLD | NEW |