aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/brick/math/src/BigNumber.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/brick/math/src/BigNumber.php')
-rw-r--r--vendor/brick/math/src/BigNumber.php132
1 files changed, 36 insertions, 96 deletions
diff --git a/vendor/brick/math/src/BigNumber.php b/vendor/brick/math/src/BigNumber.php
index 38c8c554e..80146d207 100644
--- a/vendor/brick/math/src/BigNumber.php
+++ b/vendor/brick/math/src/BigNumber.php
@@ -48,16 +48,12 @@ abstract class BigNumber implements \Serializable, \JsonSerializable
* - strings containing a `.` character or using an exponential notation are returned as BigDecimal
* - strings containing only digits with an optional leading `+` or `-` sign are returned as BigInteger
*
- * @param BigNumber|int|float|string $value
- *
- * @return BigNumber
- *
* @throws NumberFormatException If the format of the number is not valid.
* @throws DivisionByZeroException If the value represents a rational number with a denominator of zero.
*
* @psalm-pure
*/
- public static function of($value) : BigNumber
+ public static function of(BigNumber|int|float|string $value) : BigNumber
{
if ($value instanceof BigNumber) {
return $value;
@@ -67,8 +63,7 @@ abstract class BigNumber implements \Serializable, \JsonSerializable
return new BigInteger((string) $value);
}
- /** @psalm-suppress RedundantCastGivenDocblockType We cannot trust the untyped $value here! */
- $value = \is_float($value) ? self::floatToString($value) : (string) $value;
+ $value = \is_float($value) ? self::floatToString($value) : $value;
$throw = static function() use ($value) : void {
throw new NumberFormatException(\sprintf(
@@ -81,9 +76,7 @@ abstract class BigNumber implements \Serializable, \JsonSerializable
$throw();
}
- $getMatch = static function(string $value) use ($matches) : ?string {
- return isset($matches[$value]) && $matches[$value] !== '' ? $matches[$value] : null;
- };
+ $getMatch = static fn(string $value): ?string => (($matches[$value] ?? '') !== '') ? $matches[$value] : null;
$sign = $getMatch('sign');
$numerator = $getMatch('numerator');
@@ -155,10 +148,6 @@ abstract class BigNumber implements \Serializable, \JsonSerializable
*
* @see https://github.com/brick/math/pull/20
*
- * @param float $float
- *
- * @return string
- *
* @psalm-pure
* @psalm-suppress ImpureFunctionCall
*/
@@ -175,21 +164,36 @@ abstract class BigNumber implements \Serializable, \JsonSerializable
}
/**
- * Proxy method to access protected constructors from sibling classes.
+ * Proxy method to access BigInteger's protected constructor from sibling classes.
*
* @internal
+ * @psalm-pure
+ */
+ protected function newBigInteger(string $value) : BigInteger
+ {
+ return new BigInteger($value);
+ }
+
+ /**
+ * Proxy method to access BigDecimal's protected constructor from sibling classes.
*
- * @param mixed ...$args The arguments to the constructor.
- *
- * @return static
+ * @internal
+ * @psalm-pure
+ */
+ protected function newBigDecimal(string $value, int $scale = 0) : BigDecimal
+ {
+ return new BigDecimal($value, $scale);
+ }
+
+ /**
+ * Proxy method to access BigRational's protected constructor from sibling classes.
*
+ * @internal
* @psalm-pure
- * @psalm-suppress TooManyArguments
- * @psalm-suppress UnsafeInstantiation
*/
- protected static function create(... $args) : BigNumber
+ protected function newBigRational(BigInteger $numerator, BigInteger $denominator, bool $checkDenominator) : BigRational
{
- return new static(... $args);
+ return new BigRational($numerator, $denominator, $checkDenominator);
}
/**
@@ -198,8 +202,6 @@ abstract class BigNumber implements \Serializable, \JsonSerializable
* @param BigNumber|int|float|string ...$values The numbers to compare. All the numbers need to be convertible
* to an instance of the class this method is called on.
*
- * @return static The minimum value.
- *
* @throws \InvalidArgumentException If no values are given.
* @throws MathException If an argument is not valid.
*
@@ -207,7 +209,7 @@ abstract class BigNumber implements \Serializable, \JsonSerializable
* @psalm-suppress MoreSpecificReturnType
* @psalm-pure
*/
- public static function min(...$values) : BigNumber
+ public static function min(BigNumber|int|float|string ...$values) : static
{
$min = null;
@@ -232,8 +234,6 @@ abstract class BigNumber implements \Serializable, \JsonSerializable
* @param BigNumber|int|float|string ...$values The numbers to compare. All the numbers need to be convertible
* to an instance of the class this method is called on.
*
- * @return static The maximum value.
- *
* @throws \InvalidArgumentException If no values are given.
* @throws MathException If an argument is not valid.
*
@@ -241,7 +241,7 @@ abstract class BigNumber implements \Serializable, \JsonSerializable
* @psalm-suppress MoreSpecificReturnType
* @psalm-pure
*/
- public static function max(...$values) : BigNumber
+ public static function max(BigNumber|int|float|string ...$values) : static
{
$max = null;
@@ -266,18 +266,14 @@ abstract class BigNumber implements \Serializable, \JsonSerializable
* @param BigNumber|int|float|string ...$values The numbers to add. All the numbers need to be convertible
* to an instance of the class this method is called on.
*
- * @return static The sum.
- *
* @throws \InvalidArgumentException If no values are given.
* @throws MathException If an argument is not valid.
*
- * @psalm-suppress LessSpecificReturnStatement
- * @psalm-suppress MoreSpecificReturnType
* @psalm-pure
*/
- public static function sum(...$values) : BigNumber
+ public static function sum(BigNumber|int|float|string ...$values) : static
{
- /** @var BigNumber|null $sum */
+ /** @var static|null $sum */
$sum = null;
foreach ($values as $value) {
@@ -301,11 +297,6 @@ abstract class BigNumber implements \Serializable, \JsonSerializable
* depending on their ability to perform the operation. This will also require a version bump because we're
* potentially breaking custom BigNumber implementations (if any...)
*
- * @param BigNumber $a
- * @param BigNumber $b
- *
- * @return BigNumber
- *
* @psalm-pure
*/
private static function add(BigNumber $a, BigNumber $b) : BigNumber
@@ -336,8 +327,6 @@ abstract class BigNumber implements \Serializable, \JsonSerializable
*
* @param string $number The number, validated as a non-empty string of digits with optional leading sign.
*
- * @return string
- *
* @psalm-pure
*/
private static function cleanUp(string $number) : string
@@ -363,68 +352,46 @@ abstract class BigNumber implements \Serializable, \JsonSerializable
/**
* Checks if this number is equal to the given one.
- *
- * @param BigNumber|int|float|string $that
- *
- * @return bool
*/
- public function isEqualTo($that) : bool
+ public function isEqualTo(BigNumber|int|float|string $that) : bool
{
return $this->compareTo($that) === 0;
}
/**
* Checks if this number is strictly lower than the given one.
- *
- * @param BigNumber|int|float|string $that
- *
- * @return bool
*/
- public function isLessThan($that) : bool
+ public function isLessThan(BigNumber|int|float|string $that) : bool
{
return $this->compareTo($that) < 0;
}
/**
* Checks if this number is lower than or equal to the given one.
- *
- * @param BigNumber|int|float|string $that
- *
- * @return bool
*/
- public function isLessThanOrEqualTo($that) : bool
+ public function isLessThanOrEqualTo(BigNumber|int|float|string $that) : bool
{
return $this->compareTo($that) <= 0;
}
/**
* Checks if this number is strictly greater than the given one.
- *
- * @param BigNumber|int|float|string $that
- *
- * @return bool
*/
- public function isGreaterThan($that) : bool
+ public function isGreaterThan(BigNumber|int|float|string $that) : bool
{
return $this->compareTo($that) > 0;
}
/**
* Checks if this number is greater than or equal to the given one.
- *
- * @param BigNumber|int|float|string $that
- *
- * @return bool
*/
- public function isGreaterThanOrEqualTo($that) : bool
+ public function isGreaterThanOrEqualTo(BigNumber|int|float|string $that) : bool
{
return $this->compareTo($that) >= 0;
}
/**
* Checks if this number equals zero.
- *
- * @return bool
*/
public function isZero() : bool
{
@@ -433,8 +400,6 @@ abstract class BigNumber implements \Serializable, \JsonSerializable
/**
* Checks if this number is strictly negative.
- *
- * @return bool
*/
public function isNegative() : bool
{
@@ -443,8 +408,6 @@ abstract class BigNumber implements \Serializable, \JsonSerializable
/**
* Checks if this number is negative or zero.
- *
- * @return bool
*/
public function isNegativeOrZero() : bool
{
@@ -453,8 +416,6 @@ abstract class BigNumber implements \Serializable, \JsonSerializable
/**
* Checks if this number is strictly positive.
- *
- * @return bool
*/
public function isPositive() : bool
{
@@ -463,8 +424,6 @@ abstract class BigNumber implements \Serializable, \JsonSerializable
/**
* Checks if this number is positive or zero.
- *
- * @return bool
*/
public function isPositiveOrZero() : bool
{
@@ -481,19 +440,15 @@ abstract class BigNumber implements \Serializable, \JsonSerializable
/**
* Compares this number to the given one.
*
- * @param BigNumber|int|float|string $that
- *
* @return int [-1,0,1] If `$this` is lower than, equal to, or greater than `$that`.
*
* @throws MathException If the number is not valid.
*/
- abstract public function compareTo($that) : int;
+ abstract public function compareTo(BigNumber|int|float|string $that) : int;
/**
* Converts this number to a BigInteger.
*
- * @return BigInteger The converted number.
- *
* @throws RoundingNecessaryException If this number cannot be converted to a BigInteger without rounding.
*/
abstract public function toBigInteger() : BigInteger;
@@ -501,16 +456,12 @@ abstract class BigNumber implements \Serializable, \JsonSerializable
/**
* Converts this number to a BigDecimal.
*
- * @return BigDecimal The converted number.
- *
* @throws RoundingNecessaryException If this number cannot be converted to a BigDecimal without rounding.
*/
abstract public function toBigDecimal() : BigDecimal;
/**
* Converts this number to a BigRational.
- *
- * @return BigRational The converted number.
*/
abstract public function toBigRational() : BigRational;
@@ -520,8 +471,6 @@ abstract class BigNumber implements \Serializable, \JsonSerializable
* @param int $scale The scale of the resulting `BigDecimal`.
* @param int $roundingMode A `RoundingMode` constant.
*
- * @return BigDecimal
- *
* @throws RoundingNecessaryException If this number cannot be converted to the given scale without rounding.
* This only applies when RoundingMode::UNNECESSARY is used.
*/
@@ -533,8 +482,6 @@ abstract class BigNumber implements \Serializable, \JsonSerializable
* If this number cannot be converted to a native integer without losing precision, an exception is thrown.
* Note that the acceptable range for an integer depends on the platform and differs for 32-bit and 64-bit.
*
- * @return int The converted value.
- *
* @throws MathException If this number cannot be exactly converted to a native integer.
*/
abstract public function toInt() : int;
@@ -547,8 +494,6 @@ abstract class BigNumber implements \Serializable, \JsonSerializable
*
* If the number is greater than the largest representable floating point number, positive infinity is returned.
* If the number is less than the smallest representable floating point number, negative infinity is returned.
- *
- * @return float The converted value.
*/
abstract public function toFloat() : float;
@@ -557,14 +502,9 @@ abstract class BigNumber implements \Serializable, \JsonSerializable
*
* The output of this method can be parsed by the `of()` factory method;
* this will yield an object equal to this one, without any information loss.
- *
- * @return string
*/
abstract public function __toString() : string;
- /**
- * {@inheritdoc}
- */
public function jsonSerialize() : string
{
return $this->__toString();