// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'int32.dart'; import 'int64.dart'; /// A fixed-precision integer. abstract class IntX implements Comparable { /// Addition operator. IntX operator +(Object other); /// Subtraction operator. IntX operator -(Object other); /// Negate operator. /// /// Note that `-MIN_VALUE` is equal to `MIN_VALUE` due to overflow. IntX operator -(); /// Multiplication operator. IntX operator *(Object other); /// Euclidean modulo operator. /// /// Returns the remainder of the euclidean division. The euclidean division /// of two integers `a` and `b` yields two integers `q` and `r` such that /// `a == b * q + r` and `0 <= r < a.abs()`. IntX operator %(Object other); /// Truncating division operator. IntX operator ~/(Object other); /// Returns the remainder of the truncating division of this integer by /// [other]. IntX remainder(Object other); /// Bitwise and operator. IntX operator &(Object other); /// Bitwise or operator. IntX operator |(Object other); /// Bitwise xor operator. IntX operator ^(Object other); /// Bitwise negate operator. IntX operator ~(); /// Left bit-shift operator. /// /// Returns the result of shifting the bits of this integer by [shiftAmount] /// bits to the left. Low-order bits are filled with zeros. IntX operator <<(int shiftAmount); /// Right bit-shift operator. /// /// Returns the result of shifting the bits of this integer by [shiftAmount] /// bits to the right. High-order bits are filled with zero in the case where /// this integer is positive, or one in the case where it is negative. IntX operator >>(int shiftAmount); /// Unsigned right-shift operator. /// /// Returns the result of shifting the bits of this integer by [shiftAmount] /// bits to the right. High-order bits are filled with zeros. IntX shiftRightUnsigned(int shiftAmount); @override int compareTo(Object other); /// Returns `true` if and only if [other] is an int or IntX equal in /// value to this integer. @override bool operator ==(Object other); /// Relational less than operator. bool operator <(Object other); /// Relational less than or equal to operator. bool operator <=(Object other); /// Relational greater than operator. bool operator >(Object other); /// Relational greater than or equal to operator. bool operator >=(Object other); /// Returns `true` if and only if this integer is even. bool get isEven; /// Returns `true` if and only if this integer is the maximum signed value /// that can be represented within its bit size. bool get isMaxValue; /// Returns `true` if and only if this integer is the minimum signed value /// that can be represented within its bit size. bool get isMinValue; /// Returns `true` if and only if this integer is less than zero. bool get isNegative; /// Returns `true` if and only if this integer is odd. bool get isOdd; /// Returns `true` if and only if this integer is zero. bool get isZero; @override int get hashCode; /// Returns the absolute value of this integer. IntX abs(); /// Clamps this integer to be in the range [lowerLimit] - [upperLimit]. IntX clamp(Object lowerLimit, Object upperLimit); /// Returns the minimum number of bits required to store this integer. /// /// The number of bits excludes the sign bit, which gives the natural length /// for non-negative (unsigned) values. Negative values are complemented to /// return the bit position of the first bit that differs from the sign bit. /// /// To find the the number of bits needed to store the value as a signed /// value, add one, i.e. use `x.bitLength + 1`. int get bitLength; /// Returns the number of high-order zeros in this integer's bit /// representation. int numberOfLeadingZeros(); /// Returns the number of low-order zeros in this integer's bit /// representation. int numberOfTrailingZeros(); /// Returns the least significant [width] bits of this integer, extending the /// highest retained bit to the sign. This is the same as truncating the /// value to fit in [width] bits using an signed 2-s complement /// representation. The returned value has the same bit value in all positions /// higher than [width]. /// /// If the input value fits in [width] bits without truncation, the result is /// the same as the input. The minimum width needed to avoid truncation of /// `x` is `x.bitLength + 1`, i.e. /// /// x == x.toSigned(x.bitLength + 1); IntX toSigned(int width); /// Returns the least significant [width] bits of this integer as a /// non-negative number (i.e. unsigned representation). The returned value has /// zeros in all bit positions higher than [width]. /// /// If the input fits in [width] bits without truncation, the result is the /// same as the input. The minimum width needed to avoid truncation of `x` is /// given by `x.bitLength`, i.e. /// /// x == x.toUnsigned(x.bitLength); IntX toUnsigned(int width); /// Returns a byte-sequence representation of this integer. /// /// Returns a list of int, starting with the least significant byte. List toBytes(); /// Returns the double representation of this integer. /// /// On some platforms, inputs with large absolute values (i.e., > 2^52) may /// lose some of their low-order bits. double toDouble(); /// Returns the int representation of this integer. /// /// On some platforms, inputs with large absolute values (i.e., > 2^52) may /// lose some of their low-order bits. int toInt(); /// Returns an Int32 representation of this integer. /// /// Narrower values are sign-extended and wider values have their high bits /// truncated. Int32 toInt32(); /// Returns an Int64 representation of this integer. Int64 toInt64(); /// Returns a string representing the value of this integer in decimal /// notation; example: `'13'`. @override String toString(); /// Returns a string representing the value of this integer in hexadecimal /// notation. /// /// Example: `Int64(0xf01d).toHexString()` returns `'F01D'`. /// /// The string may interprets the number as *unsigned*, and has no leading /// minus, even if the value [isNegative]. /// /// Example: `Int64(-1).toHexString()` returns `'FFFFFFFFFFFFFFFF'`. String toHexString(); /// Returns a string representing the value of this integer in the given /// radix. /// /// [radix] must be an integer in the range 2 .. 16, inclusive. String toRadixString(int radix); }