Gabriel Rohden

fix(rxNum/rxInt/rxDouble): Delegate all non mutable operations to the original objects

@@ -3,6 +3,8 @@ import 'dart:collection'; @@ -3,6 +3,8 @@ import 'dart:collection';
3 3
4 import '../rx_core/rx_interface.dart'; 4 import '../rx_core/rx_interface.dart';
5 5
  6 +part 'rx_num.dart';
  7 +
6 /// global object that registers against `GetX` and `Obx`, and allows the 8 /// global object that registers against `GetX` and `Obx`, and allows the
7 /// reactivity 9 /// reactivity
8 /// of those `Widgets` and Rx values. 10 /// of those `Widgets` and Rx values.
@@ -15,22 +17,6 @@ class _RxImpl<T> implements RxInterface<T> { @@ -15,22 +17,6 @@ class _RxImpl<T> implements RxInterface<T> {
15 17
16 T _value; 18 T _value;
17 19
18 - /// Common to all Types [T], this operator overloading is using for  
19 - /// assignment, same as rx.value  
20 - ///  
21 - /// Example:  
22 - /// ```  
23 - /// var counter = 0.obs ;  
24 - /// counter <<= 3; // same as counter.value=3;  
25 - /// print(counter); // calls .toString() now  
26 - /// ```  
27 - ///  
28 - /// WARNING: still WIP, needs testing!  
29 - _RxImpl<T> operator <<(T val) {  
30 - subject.add(_value = val);  
31 - return this;  
32 - }  
33 -  
34 bool get canUpdate => _subscriptions.isNotEmpty; 20 bool get canUpdate => _subscriptions.isNotEmpty;
35 21
36 /// Makes this Rx looks like a function so you can update a new 22 /// Makes this Rx looks like a function so you can update a new
@@ -217,68 +203,6 @@ class RxBool extends _RxImpl<bool> { @@ -217,68 +203,6 @@ class RxBool extends _RxImpl<bool> {
217 } 203 }
218 } 204 }
219 205
220 -/// Rx class for `num` Types (`double` and `int`) shared comparison operations  
221 -abstract class _RxNumComparators<T extends num> extends _RxImpl<T> {  
222 - bool operator <=(T other) => _value <= other;  
223 -  
224 - bool operator >=(T other) => _value >= other;  
225 -  
226 - bool operator <(T other) => _value < other;  
227 -  
228 - bool operator >(T other) => _value > other;  
229 -}  
230 -  
231 -/// Rx class for `double` Type.  
232 -class RxDouble extends _RxNumComparators<double> {  
233 - RxDouble([double initial]) {  
234 - _value = initial;  
235 - }  
236 -  
237 - double operator *(double val) => _value * val;  
238 -  
239 - double operator -(double val) => _value - val;  
240 -  
241 - double operator +(double val) => _value + val;  
242 -  
243 - double operator /(double val) => _value / val;  
244 -  
245 - double operator %(double val) => _value % val;  
246 -}  
247 -  
248 -/// Rx class for `num` Type.  
249 -class RxNum extends _RxNumComparators<num> {  
250 - RxNum([num initial]) {  
251 - _value = initial;  
252 - }  
253 -  
254 - num operator *(num val) => _value * val;  
255 -  
256 - num operator -(num val) => _value - val;  
257 -  
258 - num operator +(num val) => _value + val;  
259 -  
260 - num operator /(num val) => _value / val;  
261 -  
262 - num operator %(num val) => _value % val;  
263 -}  
264 -  
265 -/// Rx class for `int` Type.  
266 -class RxInt extends _RxNumComparators<int> {  
267 - RxInt([int initial]) {  
268 - _value = initial;  
269 - }  
270 -  
271 - int operator %(int val) => _value % val;  
272 -  
273 - int operator *(int val) => _value * val;  
274 -  
275 - int operator -(int val) => _value - val;  
276 -  
277 - int operator +(int val) => _value + val;  
278 -  
279 - double operator /(int val) => _value / val;  
280 -}  
281 -  
282 /// Rx class for `String` Type. 206 /// Rx class for `String` Type.
283 class RxString extends _RxImpl<String> { 207 class RxString extends _RxImpl<String> {
284 RxString([String initial]) { 208 RxString([String initial]) {
  1 +part of 'rx_impl.dart';
  2 +
  3 +/// Base Rx class for all num Rx's.
  4 +class _BaseRxNum<T extends num> extends _RxImpl<T> {
  5 + /// Addition operator. */
  6 + num operator +(num other) => _value + other;
  7 +
  8 + /// Subtraction operator.
  9 + num operator -(num other) => _value - other;
  10 +
  11 + /// Multiplication operator.
  12 + num operator *(num other) => _value * other;
  13 +
  14 + /// Euclidean modulo operator.
  15 + ///
  16 + /// Returns the remainder of the Euclidean division. The Euclidean division of
  17 + /// two integers `a` and `b` yields two integers `q` and `r` such that
  18 + /// `a == b * q + r` and `0 <= r < b.abs()`.
  19 + ///
  20 + /// The Euclidean division is only defined for integers, but can be easily
  21 + /// extended to work with doubles. In that case `r` may have a non-integer
  22 + /// value, but it still verifies `0 <= r < |b|`.
  23 + ///
  24 + /// The sign of the returned value `r` is always positive.
  25 + ///
  26 + /// See [remainder] for the remainder of the truncating division.
  27 + num operator %(num other) => _value % other;
  28 +
  29 + /// Division operator.
  30 + double operator /(num other) => _value / other;
  31 +
  32 + /// Truncating division operator.
  33 + ///
  34 + /// If either operand is a [double] then the result of the truncating division
  35 + /// `a ~/ b` is equivalent to `(a / b).truncate().toInt()`.
  36 + ///
  37 + /// If both operands are [int]s then `a ~/ b` performs the truncating
  38 + /// integer division.
  39 + int operator ~/(num other) => _value ~/ other;
  40 +
  41 + /// Negate operator.
  42 + num operator -() => -_value;
  43 +
  44 + /// Returns the remainder of the truncating division of `this` by [other].
  45 + ///
  46 + /// The result `r` of this operation satisfies:
  47 + /// `this == (this ~/ other) * other + r`.
  48 + /// As a consequence the remainder `r` has the same sign as the divider
  49 + /// `this`.
  50 + num remainder(num other) => _value.remainder(other);
  51 +
  52 + /// Relational less than operator.
  53 + bool operator <(num other) => _value < other;
  54 +
  55 + /// Relational less than or equal operator.
  56 + bool operator <=(num other) => _value <= other;
  57 +
  58 + /// Relational greater than operator.
  59 + bool operator >(num other) => _value > other;
  60 +
  61 + /// Relational greater than or equal operator.
  62 + bool operator >=(num other) => _value >= other;
  63 +
  64 + /// True if the number is the double Not-a-Number value; otherwise, false.
  65 + bool get isNaN => _value.isNaN;
  66 +
  67 + /// True if the number is negative; otherwise, false.
  68 + ///
  69 + /// Negative numbers are those less than zero, and the double `-0.0`.
  70 + bool get isNegative => _value.isNegative;
  71 +
  72 + /// True if the number is positive infinity or negative infinity; otherwise,
  73 + /// false.
  74 + bool get isInfinite => _value.isInfinite;
  75 +
  76 + /// True if the number is finite; otherwise, false.
  77 + ///
  78 + /// The only non-finite numbers are NaN, positive infinity, and
  79 + /// negative infinity.
  80 + bool get isFinite => _value.isFinite;
  81 +
  82 + /// Returns the absolute value of this [num].
  83 + num abs() => _value.abs();
  84 +
  85 + /// Returns minus one, zero or plus one depending on the sign and
  86 + /// numerical value of the number.
  87 + ///
  88 + /// Returns minus one if the number is less than zero,
  89 + /// plus one if the number is greater than zero,
  90 + /// and zero if the number is equal to zero.
  91 + ///
  92 + /// Returns NaN if the number is the double NaN value.
  93 + ///
  94 + /// Returns a number of the same type as this number.
  95 + /// For doubles, `-0.0.sign == -0.0`.
  96 + /// The result satisfies:
  97 + ///
  98 + /// n == n.sign * n.abs()
  99 + ///
  100 + /// for all numbers `n` (except NaN, because NaN isn't `==` to itself).
  101 + num get sign => _value.sign;
  102 +
  103 + /// Returns the integer closest to `this`.
  104 + ///
  105 + /// Rounds away from zero when there is no closest integer:
  106 + /// `(3.5).round() == 4` and `(-3.5).round() == -4`.
  107 + ///
  108 + /// If `this` is not finite (`NaN` or infinity), throws an [UnsupportedError].
  109 + int round() => _value.round();
  110 +
  111 + /// Returns the greatest integer no greater than `this`.
  112 + ///
  113 + /// If `this` is not finite (`NaN` or infinity), throws an [UnsupportedError].
  114 + int floor() => _value.floor();
  115 +
  116 + /// Returns the least integer no smaller than `this`.
  117 + ///
  118 + /// If `this` is not finite (`NaN` or infinity), throws an [UnsupportedError].
  119 + int ceil() => _value.ceil();
  120 +
  121 + /// Returns the integer obtained by discarding any fractional
  122 + /// digits from `this`.
  123 + ///
  124 + /// If `this` is not finite (`NaN` or infinity), throws an [UnsupportedError].
  125 + int truncate() => _value.truncate();
  126 +
  127 + /// Returns the double integer value closest to `this`.
  128 + ///
  129 + /// Rounds away from zero when there is no closest integer:
  130 + /// `(3.5).roundToDouble() == 4` and `(-3.5).roundToDouble() == -4`.
  131 + ///
  132 + /// If this is already an integer valued double, including `-0.0`, or it is a
  133 + /// non-finite double value, the value is returned unmodified.
  134 + ///
  135 + /// For the purpose of rounding, `-0.0` is considered to be below `0.0`,
  136 + /// and `-0.0` is therefore considered closer to negative numbers than `0.0`.
  137 + /// This means that for a value, `d` in the range `-0.5 < d < 0.0`,
  138 + /// the result is `-0.0`.
  139 + ///
  140 + /// The result is always a double.
  141 + /// If this is a numerically large integer, the result may be an infinite
  142 + /// double.
  143 + double roundToDouble() => _value.roundToDouble();
  144 +
  145 + /// Returns the greatest double integer value no greater than `this`.
  146 + ///
  147 + /// If this is already an integer valued double, including `-0.0`, or it is a
  148 + /// non-finite double value, the value is returned unmodified.
  149 + ///
  150 + /// For the purpose of rounding, `-0.0` is considered to be below `0.0`.
  151 + /// A number `d` in the range `0.0 < d < 1.0` will return `0.0`.
  152 + ///
  153 + /// The result is always a double.
  154 + /// If this is a numerically large integer, the result may be an infinite
  155 + /// double.
  156 + double floorToDouble() => _value.floorToDouble();
  157 +
  158 + /// Returns the least double integer value no smaller than `this`.
  159 + ///
  160 + /// If this is already an integer valued double, including `-0.0`, or it is a
  161 + /// non-finite double value, the value is returned unmodified.
  162 + ///
  163 + /// For the purpose of rounding, `-0.0` is considered to be below `0.0`.
  164 + /// A number `d` in the range `-1.0 < d < 0.0` will return `-0.0`.
  165 + ///
  166 + /// The result is always a double.
  167 + /// If this is a numerically large integer, the result may be an infinite
  168 + /// double.
  169 + double ceilToDouble() => _value.ceilToDouble();
  170 +
  171 + /// Returns the double integer value obtained by discarding any fractional
  172 + /// digits from the double value of `this`.
  173 + ///
  174 + /// If this is already an integer valued double, including `-0.0`, or it is a
  175 + /// non-finite double value, the value is returned unmodified.
  176 + ///
  177 + /// For the purpose of rounding, `-0.0` is considered to be below `0.0`.
  178 + /// A number `d` in the range `-1.0 < d < 0.0` will return `-0.0`, and
  179 + /// in the range `0.0 < d < 1.0` it will return 0.0.
  180 + ///
  181 + /// The result is always a double.
  182 + /// If this is a numerically large integer, the result may be an infinite
  183 + /// double.
  184 + double truncateToDouble() => _value.truncateToDouble();
  185 +
  186 + /// Returns this [num] clamped to be in the range [lowerLimit]-[upperLimit].
  187 + ///
  188 + /// The comparison is done using [compareTo] and therefore takes `-0.0` into
  189 + /// account. This also implies that [double.nan] is treated as the maximal
  190 + /// double value.
  191 + ///
  192 + /// The arguments [lowerLimit] and [upperLimit] must form a valid range where
  193 + /// `lowerLimit.compareTo(upperLimit) <= 0`.
  194 + num clamp(num lowerLimit, num upperLimit) =>
  195 + _value.clamp(lowerLimit, upperLimit);
  196 +
  197 + /// Truncates this [num] to an integer and returns the result as an [int]. */
  198 + int toInt() => _value.toInt();
  199 +
  200 + /// Return this [num] as a [double].
  201 + ///
  202 + /// If the number is not representable as a [double], an
  203 + /// approximation is returned. For numerically large integers, the
  204 + /// approximation may be infinite.
  205 + double toDouble() => _value.toDouble();
  206 +
  207 + /// Returns a decimal-point string-representation of `this`.
  208 + ///
  209 + /// Converts `this` to a [double] before computing the string representation.
  210 + ///
  211 + /// If the absolute value of `this` is greater or equal to `10^21` then this
  212 + /// methods returns an exponential representation computed by
  213 + /// `this.toStringAsExponential()`. Otherwise the result
  214 + /// is the closest string representation with exactly [fractionDigits] digits
  215 + /// after the decimal point. If [fractionDigits] equals 0 then the decimal
  216 + /// point is omitted.
  217 + ///
  218 + /// The parameter [fractionDigits] must be an integer satisfying:
  219 + /// `0 <= fractionDigits <= 20`.
  220 + ///
  221 + /// Examples:
  222 + ///
  223 + /// 1.toStringAsFixed(3); // 1.000
  224 + /// (4321.12345678).toStringAsFixed(3); // 4321.123
  225 + /// (4321.12345678).toStringAsFixed(5); // 4321.12346
  226 + /// 123456789012345.toStringAsFixed(3); // 123456789012345.000
  227 + /// 10000000000000000.toStringAsFixed(4); // 10000000000000000.0000
  228 + /// 5.25.toStringAsFixed(0); // 5
  229 + String toStringAsFixed(int fractionDigits) =>
  230 + _value.toStringAsFixed(fractionDigits);
  231 +
  232 + /// Returns an exponential string-representation of `this`.
  233 + ///
  234 + /// Converts `this` to a [double] before computing the string representation.
  235 + ///
  236 + /// If [fractionDigits] is given then it must be an integer satisfying:
  237 + /// `0 <= fractionDigits <= 20`. In this case the string contains exactly
  238 + /// [fractionDigits] after the decimal point. Otherwise, without the
  239 + /// parameter, the returned string uses the shortest number of digits that
  240 + /// accurately represent [this].
  241 + ///
  242 + /// If [fractionDigits] equals 0 then the decimal point is omitted.
  243 + /// Examples:
  244 + ///
  245 + /// 1.toStringAsExponential(); // 1e+0
  246 + /// 1.toStringAsExponential(3); // 1.000e+0
  247 + /// 123456.toStringAsExponential(); // 1.23456e+5
  248 + /// 123456.toStringAsExponential(3); // 1.235e+5
  249 + /// 123.toStringAsExponential(0); // 1e+2
  250 + String toStringAsExponential([int fractionDigits]) =>
  251 + _value.toStringAsExponential(fractionDigits);
  252 +
  253 + /// Converts `this` to a double and returns a string representation with
  254 + /// exactly [precision] significant digits.
  255 + ///
  256 + /// The parameter [precision] must be an integer satisfying:
  257 + /// `1 <= precision <= 21`.
  258 + ///
  259 + /// Examples:
  260 + ///
  261 + /// 1.toStringAsPrecision(2); // 1.0
  262 + /// 1e15.toStringAsPrecision(3); // 1.00e+15
  263 + /// 1234567.toStringAsPrecision(3); // 1.23e+6
  264 + /// 1234567.toStringAsPrecision(9); // 1234567.00
  265 + /// 12345678901234567890.toStringAsPrecision(20); // 12345678901234567168
  266 + /// 12345678901234567890.toStringAsPrecision(14); // 1.2345678901235e+19
  267 + /// 0.00000012345.toStringAsPrecision(15); // 1.23450000000000e-7
  268 + /// 0.0000012345.toStringAsPrecision(15); // 0.00000123450000000000
  269 + String toStringAsPrecision(int precision) =>
  270 + _value.toStringAsPrecision(precision);
  271 +}
  272 +
  273 +class RxNum extends _BaseRxNum<num> {}
  274 +
  275 +class RxDouble extends _BaseRxNum<double> {
  276 + RxDouble([double initial]) {
  277 + _value = initial;
  278 + }
  279 +
  280 + /// Addition operator.
  281 + double operator +(num other) => _value + other;
  282 +
  283 + /// Subtraction operator.
  284 + double operator -(num other) => _value - other;
  285 +
  286 + /// Multiplication operator.
  287 + double operator *(num other) => _value * other;
  288 +
  289 + double operator %(num other) => _value % other;
  290 +
  291 + /// Division operator.
  292 + double operator /(num other) => _value / other;
  293 +
  294 + /// Truncating division operator.
  295 + ///
  296 + /// The result of the truncating division `a ~/ b` is equivalent to
  297 + /// `(a / b).truncate()`.
  298 + int operator ~/(num other) => _value ~/ other;
  299 +
  300 + /// Negate operator. */
  301 + double operator -() => -_value;
  302 +
  303 + /// Returns the absolute value of this [double].
  304 + double abs() => _value.abs();
  305 +
  306 + /// Returns the sign of the double's numerical value.
  307 + ///
  308 + /// Returns -1.0 if the value is less than zero,
  309 + /// +1.0 if the value is greater than zero,
  310 + /// and the value itself if it is -0.0, 0.0 or NaN.
  311 + double get sign => _value.sign;
  312 +
  313 + /// Returns the integer closest to `this`.
  314 + ///
  315 + /// Rounds away from zero when there is no closest integer:
  316 + /// `(3.5).round() == 4` and `(-3.5).round() == -4`.
  317 + ///
  318 + /// If `this` is not finite (`NaN` or infinity), throws an [UnsupportedError].
  319 + int round() => _value.round();
  320 +
  321 + /// Returns the greatest integer no greater than `this`.
  322 + ///
  323 + /// If `this` is not finite (`NaN` or infinity), throws an [UnsupportedError].
  324 + int floor() => _value.floor();
  325 +
  326 + /// Returns the least integer no smaller than `this`.
  327 + ///
  328 + /// If `this` is not finite (`NaN` or infinity), throws an [UnsupportedError].
  329 + int ceil() => _value.ceil();
  330 +
  331 + /// Returns the integer obtained by discarding any fractional
  332 + /// digits from `this`.
  333 + ///
  334 + /// If `this` is not finite (`NaN` or infinity), throws an [UnsupportedError].
  335 + int truncate() => _value.truncate();
  336 +
  337 + /// Returns the integer double value closest to `this`.
  338 + ///
  339 + /// Rounds away from zero when there is no closest integer:
  340 + /// `(3.5).roundToDouble() == 4` and `(-3.5).roundToDouble() == -4`.
  341 + ///
  342 + /// If this is already an integer valued double, including `-0.0`, or it is
  343 + /// not a finite value, the value is returned unmodified.
  344 + ///
  345 + /// For the purpose of rounding, `-0.0` is considered to be below `0.0`,
  346 + /// and `-0.0` is therefore considered closer to negative numbers than `0.0`.
  347 + /// This means that for a value, `d` in the range `-0.5 < d < 0.0`,
  348 + /// the result is `-0.0`.
  349 + double roundToDouble() => _value.roundToDouble();
  350 +
  351 + /// Returns the greatest integer double value no greater than `this`.
  352 + ///
  353 + /// If this is already an integer valued double, including `-0.0`, or it is
  354 + /// not a finite value, the value is returned unmodified.
  355 + ///
  356 + /// For the purpose of rounding, `-0.0` is considered to be below `0.0`.
  357 + /// A number `d` in the range `0.0 < d < 1.0` will return `0.0`.
  358 + double floorToDouble() => _value.floorToDouble();
  359 +
  360 + /// Returns the least integer double value no smaller than `this`.
  361 + ///
  362 + /// If this is already an integer valued double, including `-0.0`, or it is
  363 + /// not a finite value, the value is returned unmodified.
  364 + ///
  365 + /// For the purpose of rounding, `-0.0` is considered to be below `0.0`.
  366 + /// A number `d` in the range `-1.0 < d < 0.0` will return `-0.0`.
  367 + double ceilToDouble() => _value.ceilToDouble();
  368 +
  369 + /// Returns the integer double value obtained by discarding any fractional
  370 + /// digits from `this`.
  371 + ///
  372 + /// If this is already an integer valued double, including `-0.0`, or it is
  373 + /// not a finite value, the value is returned unmodified.
  374 + ///
  375 + /// For the purpose of rounding, `-0.0` is considered to be below `0.0`.
  376 + /// A number `d` in the range `-1.0 < d < 0.0` will return `-0.0`, and
  377 + /// in the range `0.0 < d < 1.0` it will return 0.0.
  378 + double truncateToDouble() => _value.truncateToDouble();
  379 +}
  380 +
  381 +class RxInt extends _BaseRxNum<int> {
  382 + RxInt([int initial]) {
  383 + _value = initial;
  384 + }
  385 +
  386 + /// Bit-wise and operator.
  387 + ///
  388 + /// Treating both `this` and [other] as sufficiently large two's component
  389 + /// integers, the result is a number with only the bits set that are set in
  390 + /// both `this` and [other]
  391 + ///
  392 + /// If both operands are negative, the result is negative, otherwise
  393 + /// the result is non-negative.
  394 + int operator &(int other) => _value & other;
  395 +
  396 + /// Bit-wise or operator.
  397 + ///
  398 + /// Treating both `this` and [other] as sufficiently large two's component
  399 + /// integers, the result is a number with the bits set that are set in either
  400 + /// of `this` and [other]
  401 + ///
  402 + /// If both operands are non-negative, the result is non-negative,
  403 + /// otherwise the result is negative.
  404 + int operator |(int other) => _value | other;
  405 +
  406 + /// Bit-wise exclusive-or operator.
  407 + ///
  408 + /// Treating both `this` and [other] as sufficiently large two's component
  409 + /// integers, the result is a number with the bits set that are set in one,
  410 + /// but not both, of `this` and [other]
  411 + ///
  412 + /// If the operands have the same sign, the result is non-negative,
  413 + /// otherwise the result is negative.
  414 + int operator ^(int other) => _value ^ other;
  415 +
  416 + /// The bit-wise negate operator.
  417 + ///
  418 + /// Treating `this` as a sufficiently large two's component integer,
  419 + /// the result is a number with the opposite bits set.
  420 + ///
  421 + /// This maps any integer `x` to `-x - 1`.
  422 + int operator ~() => ~_value;
  423 +
  424 + /// Shift the bits of this integer to the left by [shiftAmount].
  425 + ///
  426 + /// Shifting to the left makes the number larger, effectively multiplying
  427 + /// the number by `pow(2, shiftIndex)`.
  428 + ///
  429 + /// There is no limit on the size of the result. It may be relevant to
  430 + /// limit intermediate values by using the "and" operator with a suitable
  431 + /// mask.
  432 + ///
  433 + /// It is an error if [shiftAmount] is negative.
  434 + int operator <<(int shiftAmount) => _value << shiftAmount;
  435 +
  436 + /// Shift the bits of this integer to the right by [shiftAmount].
  437 + ///
  438 + /// Shifting to the right makes the number smaller and drops the least
  439 + /// significant bits, effectively doing an integer division by
  440 + ///`pow(2, shiftIndex)`.
  441 + ///
  442 + /// It is an error if [shiftAmount] is negative.
  443 + int operator >>(int shiftAmount) => _value >> shiftAmount;
  444 +
  445 + /// Returns this integer to the power of [exponent] modulo [modulus].
  446 + ///
  447 + /// The [exponent] must be non-negative and [modulus] must be
  448 + /// positive.
  449 + int modPow(int exponent, int modulus) => _value.modPow(exponent, modulus);
  450 +
  451 + /// Returns the modular multiplicative inverse of this integer
  452 + /// modulo [modulus].
  453 + ///
  454 + /// The [modulus] must be positive.
  455 + ///
  456 + /// It is an error if no modular inverse exists.
  457 + int modInverse(int modulus) => _value.modInverse(modulus);
  458 +
  459 + /// Returns the greatest common divisor of this integer and [other].
  460 + ///
  461 + /// If either number is non-zero, the result is the numerically greatest
  462 + /// integer dividing both `this` and `other`.
  463 + ///
  464 + /// The greatest common divisor is independent of the order,
  465 + /// so `x.gcd(y)` is always the same as `y.gcd(x)`.
  466 + ///
  467 + /// For any integer `x`, `x.gcd(x)` is `x.abs()`.
  468 + ///
  469 + /// If both `this` and `other` is zero, the result is also zero.
  470 + int gcd(int other) => _value.gcd(other);
  471 +
  472 + /// Returns true if and only if this integer is even.
  473 + bool get isEven => _value.isEven;
  474 +
  475 + /// Returns true if and only if this integer is odd.
  476 + bool get isOdd => _value.isOdd;
  477 +
  478 + /// Returns the minimum number of bits required to store this integer.
  479 + ///
  480 + /// The number of bits excludes the sign bit, which gives the natural length
  481 + /// for non-negative (unsigned) values. Negative values are complemented to
  482 + /// return the bit position of the first bit that differs from the sign bit.
  483 + ///
  484 + /// To find the number of bits needed to store the value as a signed value,
  485 + /// add one, i.e. use `x.bitLength + 1`.
  486 + /// ```
  487 + /// x.bitLength == (-x-1).bitLength
  488 + ///
  489 + /// 3.bitLength == 2; // 00000011
  490 + /// 2.bitLength == 2; // 00000010
  491 + /// 1.bitLength == 1; // 00000001
  492 + /// 0.bitLength == 0; // 00000000
  493 + /// (-1).bitLength == 0; // 11111111
  494 + /// (-2).bitLength == 1; // 11111110
  495 + /// (-3).bitLength == 2; // 11111101
  496 + /// (-4).bitLength == 2; // 11111100
  497 + /// ```
  498 + int get bitLength => _value.bitLength;
  499 +
  500 + /// Returns the least significant [width] bits of this integer as a
  501 + /// non-negative number (i.e. unsigned representation). The returned value
  502 + /// has zeros in all bit positions higher than [width].
  503 + /// ```
  504 + /// (-1).toUnsigned(5) == 31 // 11111111 -> 00011111
  505 + /// ```
  506 + /// This operation can be used to simulate arithmetic from low level
  507 + /// languages.
  508 + /// For example, to increment an 8 bit quantity:
  509 + /// ```
  510 + /// q = (q + 1).toUnsigned(8);
  511 + /// ```
  512 + /// `q` will count from `0` up to `255` and then wrap around to `0`.
  513 + ///
  514 + /// If the input fits in [width] bits without truncation, the result is the
  515 + /// same as the input. The minimum width needed to avoid truncation of `x` is
  516 + /// given by `x.bitLength`, i.e.
  517 + /// ```
  518 + /// x == x.toUnsigned(x.bitLength);
  519 + /// ```
  520 + int toUnsigned(int width) => _value.toUnsigned(width);
  521 +
  522 + /// Returns the least significant [width] bits of this integer, extending the
  523 + /// highest retained bit to the sign. This is the same as truncating the
  524 + /// value to fit in [width] bits using an signed 2-s complement
  525 + /// representation.
  526 + /// The returned value has the same bit value in all positions higher than
  527 + /// [width].
  528 + ///
  529 + /// ```
  530 + /// V--sign bit-V
  531 + /// 16.toSigned(5) == -16 // 00010000 -> 11110000
  532 + /// 239.toSigned(5) == 15 // 11101111 -> 00001111
  533 + /// ^ ^
  534 + /// ```
  535 + /// This operation can be used to simulate arithmetic from low level
  536 + /// languages.
  537 + /// For example, to increment an 8 bit signed quantity:
  538 + /// ```
  539 + /// q = (q + 1).toSigned(8);
  540 + /// ```
  541 + /// `q` will count from `0` up to `127`, wrap to `-128` and count back up to
  542 + /// `127`.
  543 + ///
  544 + /// If the input value fits in [width] bits without truncation, the result is
  545 + /// the same as the input. The minimum width needed to avoid truncation
  546 + /// of `x` is `x.bitLength + 1`, i.e.
  547 + /// ```
  548 + /// x == x.toSigned(x.bitLength + 1);
  549 + /// ```
  550 + int toSigned(int width) => _value.toSigned(width);
  551 +
  552 + /// Return the negative value of this integer.
  553 + ///
  554 + /// The result of negating an integer always has the opposite sign, except
  555 + /// for zero, which is its own negation.
  556 + int operator -() => -_value;
  557 +
  558 + /// Returns the absolute value of this integer.
  559 + ///
  560 + /// For any integer `x`, the result is the same as `x < 0 ? -x : x`.
  561 + int abs() => _value.abs();
  562 +
  563 + /// Returns the sign of this integer.
  564 + ///
  565 + /// Returns 0 for zero, -1 for values less than zero and
  566 + /// +1 for values greater than zero.
  567 + int get sign => _value.sign;
  568 +
  569 + /// Returns `this`.
  570 + int round() => _value.round();
  571 +
  572 + /// Returns `this`.
  573 + int floor() => _value.floor();
  574 +
  575 + /// Returns `this`.
  576 + int ceil() => _value.ceil();
  577 +
  578 + /// Returns `this`.
  579 + int truncate() => _value.truncate();
  580 +
  581 + /// Returns `this.toDouble()`.
  582 + double roundToDouble() => _value.roundToDouble();
  583 +
  584 + /// Returns `this.toDouble()`.
  585 + double floorToDouble() => _value.floorToDouble();
  586 +
  587 + /// Returns `this.toDouble()`.
  588 + double ceilToDouble() => _value.ceilToDouble();
  589 +
  590 + /// Returns `this.toDouble()`.
  591 + double truncateToDouble() => _value.truncateToDouble();
  592 +}