LDAPAccountManager/lam/lib/3rdParty/composer/spomky-labs/cbor-php/src/Tag/DecimalFractionTag.php

96 lines
3.1 KiB
PHP

<?php
declare(strict_types=1);
/*
* The MIT License (MIT)
*
* Copyright (c) 2018 Spomky-Labs
*
* This software may be modified and distributed under the terms
* of the MIT license. See the LICENSE file for details.
*/
namespace CBOR\Tag;
use CBOR\CBORObject;
use CBOR\ListObject;
use CBOR\SignedIntegerObject;
use CBOR\TagObject as Base;
use CBOR\UnsignedIntegerObject;
use InvalidArgumentException;
use RuntimeException;
final class DecimalFractionTag extends Base
{
public static function getTagId(): int
{
return 4;
}
public static function createFromLoadedData(int $additionalInformation, ?string $data, CBORObject $object): Base
{
return new self($object);
}
public function __construct(CBORObject $object)
{
if (!\extension_loaded('bcmath')) {
throw new RuntimeException('The extension "bcmath" is required to use this tag');
}
if (!$object instanceof ListObject || 2 !== \count($object)) {
throw new InvalidArgumentException('This tag only accepts a ListObject object that contains an exponent and a mantissa.');
}
$e = $object->get(0);
if (!$e instanceof UnsignedIntegerObject && !$e instanceof SignedIntegerObject) {
throw new InvalidArgumentException('The exponent must be a Signed Integer or an Unsigned Integer object.');
}
$m = $object->get(1);
if (!$m instanceof UnsignedIntegerObject && !$m instanceof SignedIntegerObject && !$m instanceof NegativeBigIntegerTag && !$m instanceof PositiveBigIntegerTag) {
throw new InvalidArgumentException('The mantissa must be a Positive or Negative Signed Integer or an Unsigned Integer object.');
}
parent::__construct(4, null, $object);
}
public static function createFromExponentAndMantissa(CBORObject $e, CBORObject $m): Base
{
$object = new ListObject();
$object->add($e);
$object->add($m);
return new self($object);
}
public function getNormalizedData(bool $ignoreTags = false)
{
if ($ignoreTags) {
return $this->object->getNormalizedData($ignoreTags);
}
if (!$this->object instanceof ListObject || 2 !== \count($this->object)) {
return $this->object->getNormalizedData($ignoreTags);
}
$e = $this->object->get(0);
$m = $this->object->get(1);
if (!$e instanceof UnsignedIntegerObject && !$e instanceof SignedIntegerObject) {
return $this->object->getNormalizedData($ignoreTags);
}
if (!$m instanceof UnsignedIntegerObject && !$m instanceof SignedIntegerObject && !$m instanceof NegativeBigIntegerTag && !$m instanceof PositiveBigIntegerTag) {
return $this->object->getNormalizedData($ignoreTags);
}
return rtrim(
bcmul(
$m->getNormalizedData($ignoreTags),
bcpow(
'10',
$e->getNormalizedData($ignoreTags),
100),
100),
'0'
);
}
}