<?php
/**
* This file is part of the ramsey/uuid library
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*
* @copyright Copyright (c) Ben Ramsey <[email protected]>
* @license http://opensource.org/licenses/MIT MIT
*/
declare(strict_types=1);
namespace Ramsey\Uuid\Lazy;
use DateTimeInterface;
use Ramsey\Uuid\Converter\NumberConverterInterface;
use Ramsey\Uuid\Exception\UnsupportedOperationException;
use Ramsey\Uuid\Fields\FieldsInterface;
use Ramsey\Uuid\Rfc4122\UuidV1;
use Ramsey\Uuid\Rfc4122\UuidV6;
use Ramsey\Uuid\Type\Hexadecimal;
use Ramsey\Uuid\Type\Integer as IntegerObject;
use Ramsey\Uuid\UuidFactory;
use Ramsey\Uuid\UuidInterface;
use ValueError;
use function assert;
use function bin2hex;
use function hex2bin;
use function sprintf;
use function str_replace;
use function substr;
/**
* Lazy version of a UUID: its format has not been determined yet, so it is mostly only usable for string/bytes
* conversion. This object optimizes instantiation, serialization and string conversion time, at the cost of increased
* overhead for more advanced UUID operations.
*
* > [!NOTE]
* > The {@see FieldsInterface} does not declare methods that deprecated API relies upon: the API has been ported from
* > the {@see \Ramsey\Uuid\Uuid} definition, and is deprecated anyway.
*
* > [!NOTE]
* > The deprecated API from {@see \Ramsey\Uuid\Uuid} is in use here (on purpose): it will be removed once the
* > deprecated API is gone from this class too.
*
* @internal this type is used internally for performance reasons and is not supposed to be directly referenced in consumer libraries.
*/
final class LazyUuidFromString implements UuidInterface
{
public const VALID_REGEX = '/\A[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\z/ms';
private ?UuidInterface $unwrapped = null;
/**
* @param non-empty-string $uuid
*/
public function __construct(private string $uuid)
{
}
public static function fromBytes(string $bytes): self
{
$base16Uuid = bin2hex($bytes);
return new self(
substr($base16Uuid, 0, 8)
. '-'
. substr($base16Uuid, 8, 4)
. '-'
. substr($base16Uuid, 12, 4)
. '-'
. substr($base16Uuid, 16, 4)
. '-'
. substr($base16Uuid, 20, 12)
);
}
public function serialize(): string
{
return $this->uuid;
}
/**
* @return array{string: non-empty-string}
*/
public function __serialize(): array
{
return ['string' => $this->uuid];
}
/**
* {@inheritDoc}
*
* @param non-empty-string $data
*/
public function unserialize(string $data): void
{
$this->uuid = $data;
}
/**
* @param array{string?: non-empty-string} $data
*/
public function __unserialize(array $data): void
{
// @codeCoverageIgnoreStart
if (!isset($data['string'])) {
throw new ValueError(sprintf('%s(): Argument #1 ($data) is invalid', __METHOD__));
}
// @codeCoverageIgnoreEnd
$this->unserialize($data['string']);
}
public function getNumberConverter(): NumberConverterInterface
{
return ($this->unwrapped ?? $this->unwrap())->getNumberConverter();
}
/**
* @inheritDoc
*/
public function getFieldsHex(): array
{
return ($this->unwrapped ?? $this->unwrap())->getFieldsHex();
}
public function getClockSeqHiAndReservedHex(): string
{
return ($this->unwrapped ?? $this->unwrap())->getClockSeqHiAndReservedHex();
}
public function getClockSeqLowHex(): string
{
return ($this->unwrapped ?? $this->unwrap())->getClockSeqLowHex();
}
public function getClockSequenceHex(): string
{
return ($this->unwrapped ?? $this->unwrap())->getClockSequenceHex();
}
public function getDateTime(): DateTimeInterface
{
return ($this->unwrapped ?? $this->unwrap())->getDateTime();
}
public function getLeastSignificantBitsHex(): string
{
return ($this->unwrapped ?? $this->unwrap())->getLeastSignificantBitsHex();
}
public function getMostSignificantBitsHex(): string
{
return ($this->unwrapped ?? $this->unwrap())->getMostSignificantBitsHex();
}
public function getNodeHex(): string
{
return ($this->unwrapped ?? $this->unwrap())->getNodeHex();
}
public function getTimeHiAndVersionHex(): string
{
return ($this->unwrapped ?? $this->unwrap())->getTimeHiAndVersionHex();
}
public function getTimeLowHex(): string
{
return ($this->unwrapped ?? $this->unwrap())->getTimeLowHex();
}
public function getTimeMidHex(): string
{
return ($this->unwrapped ?? $this->unwrap())->getTimeMidHex();
}
public function getTimestampHex(): string
{
return ($this->unwrapped ?? $this->unwrap())->getTimestampHex();
}
public function getUrn(): string
{
return ($this->unwrapped ?? $this->unwrap())->getUrn();
}
public function getVariant(): ?int
{
return ($this->unwrapped ?? $this->unwrap())->getVariant();
}
public function getVersion(): ?int
{
return ($this->unwrapped ?? $this->unwrap())->getVersion();
}
public function compareTo(UuidInterface $other): int
{
return ($this->unwrapped ?? $this->unwrap())->compareTo($other);
}
public function equals(?object $other): bool
{
if (!$other instanceof UuidInterface) {
return false;
}
return $this->uuid === $other->toString();
}
public function getBytes(): string
{
/** @var non-empty-string */
return (string) hex2bin(str_replace('-', '', $this->uuid));
}
public function getFields(): FieldsInterface
{
return ($this->unwrapped ?? $this->unwrap())->getFields();
}
public function getHex(): Hexadecimal
{
return ($this->unwrapped ?? $this->unwrap())->getHex();
}
public function getInteger(): IntegerObject
{
return ($this->unwrapped ?? $this->unwrap())->getInteger();
}
public function toString(): string
{
return $this->uuid;
}
public function __toString(): string
{
return $this->uuid;
}
public function jsonSerialize(): string
{
return $this->uuid;
}
/**
* @deprecated Use {@see UuidInterface::getFields()} to get a {@see FieldsInterface} instance. If it is a
* {@see Rfc4122FieldsInterface} instance, you may call {@see Rfc4122FieldsInterface::getClockSeqHiAndReserved()}
* and use the arbitrary-precision math library of your choice to convert it to a string integer.
*/
public function getClockSeqHiAndReserved(): string
{
$instance = ($this->unwrapped ?? $this->unwrap());
$fields = $instance->getFields();
assert($fields instanceof \Ramsey\Uuid\Rfc4122\FieldsInterface);
return $instance->getNumberConverter()->fromHex($fields->getClockSeqHiAndReserved()->toString());
}
/**
* @deprecated Use {@see UuidInterface::getFields()} to get a {@see FieldsInterface} instance. If it is a
* {@see Rfc4122FieldsInterface} instance, you may call {@see Rfc4122FieldsInterface::getClockSeqLow()} and use
* the arbitrary-precision math library of your choice to convert it to a string integer.
*/
public function getClockSeqLow(): string
{
$instance = ($this->unwrapped ?? $this->unwrap());
$fields = $instance->getFields();
assert($fields instanceof \Ramsey\Uuid\Rfc4122\FieldsInterface);
return $instance->getNumberConverter()->fromHex($fields->getClockSeqLow()->toString());
}
/**
* @deprecated Use {@see UuidInterface::getFields()} to get a {@see FieldsInterface} instance. If it is a
* {@see Rfc4122FieldsInterface} instance, you may call {@see Rfc4122FieldsInterface::getClockSeq()} and use the
* arbitrary-precision math library of your choice to convert it to a string integer.
*/
public function getClockSequence(): string
{
$instance = ($this->unwrapped ?? $this->unwrap());
$fields = $instance->getFields();
assert($fields instanceof \Ramsey\Uuid\Rfc4122\FieldsInterface);
return $instance->getNumberConverter()->fromHex($fields->getClockSeq()->toString());
}
/**
* @deprecated This method will be removed in 5.0.0. There is no direct alternative, but the same information may be
* obtained by splitting in half the value returned by {@see UuidInterface::getHex()}.
*/
public function getLeastSignificantBits(): string
{
$instance = ($this->unwrapped ?? $this->unwrap());
return $instance->getNumberConverter()->fromHex(substr($instance->getHex()->toString(), 16));
}
/**
* @deprecated This method will be removed in 5.0.0. There is no direct alternative, but the same information may be
* obtained by splitting in half the value returned by {@see UuidInterface::getHex()}.
*/
public function getMostSignificantBits(): string
{
$instance = ($this->unwrapped ?? $this->unwrap());
return $instance->getNumberConverter()->fromHex(substr($instance->getHex()->toString(), 0, 16));
}
/**
* @deprecated Use {@see UuidInterface::getFields()} to get a {@see FieldsInterface} instance. If it is a
* {@see Rfc4122FieldsInterface} instance, you may call {@see Rfc4122FieldsInterface::getNode()} and use the
* arbitrary-precision math library of your choice to convert it to a string integer.
*/
public function getNode(): string
{
$instance = ($this->unwrapped ?? $this->unwrap());
$fields = $instance->getFields();
assert($fields instanceof \Ramsey\Uuid\Rfc4122\FieldsInterface);
return $instance->getNumberConverter()->fromHex($fields->getNode()->toString());
}
/**
* @deprecated Use {@see UuidInterface::getFields()} to get a {@see FieldsInterface} instance. If it is a
* {@see Rfc4122FieldsInterface} instance, you may call {@see Rfc4122FieldsInterface::getTimeHiAndVersion()} and
* use the arbitrary-precision math library of your choice to convert it to a string integer.
*/
public function getTimeHiAndVersion(): string
{
$instance = ($this->unwrapped ?? $this->unwrap());
$fields = $instance->getFields();
assert($fields instanceof \Ramsey\Uuid\Rfc4122\FieldsInterface);
return $instance->getNumberConverter()->fromHex($fields->getTimeHiAndVersion()->toString());
}
/**
* @deprecated Use {@see UuidInterface::getFields()} to get a {@see FieldsInterface} instance. If it is a
* {@see Rfc4122FieldsInterface} instance, you may call {@see Rfc4122FieldsInterface::getTimeLow()} and use the
* arbitrary-precision math library of your choice to convert it to a string integer.
*/
public function getTimeLow(): string
{
$instance = ($this->unwrapped ?? $this->unwrap());
$fields = $instance->getFields();
assert($fields instanceof \Ramsey\Uuid\Rfc4122\FieldsInterface);
return $instance->getNumberConverter()->fromHex($fields->getTimeLow()->toString());
}
/**
* @deprecated Use {@see UuidInterface::getFields()} to get a {@see FieldsInterface} instance. If it is a
* {@see Rfc4122FieldsInterface} instance, you may call {@see Rfc4122FieldsInterface::getTimeMid()} and use the
* arbitrary-precision math library of your choice to convert it to a string integer.
*/
public function getTimeMid(): string
{
$instance = ($this->unwrapped ?? $this->unwrap());
$fields = $instance->getFields();
assert($fields instanceof \Ramsey\Uuid\Rfc4122\FieldsInterface);
return $instance->getNumberConverter()->fromHex($fields->getTimeMid()->toString());
}
/**
* @deprecated Use {@see UuidInterface::getFields()} to get a {@see FieldsInterface} instance. If it is a
* {@see Rfc4122FieldsInterface} instance, you may call {@see Rfc4122FieldsInterface::getTimestamp()} and use
* the arbitrary-precision math library of your choice to convert it to a string integer.
*/
public function getTimestamp(): string
{
$instance = ($this->unwrapped ?? $this->unwrap());
$fields = $instance->getFields();
assert($fields instanceof \Ramsey\Uuid\Rfc4122\FieldsInterface);
if ($fields->getVersion() !== 1) {
throw new UnsupportedOperationException('Not a time-based UUID');
}
return $instance->getNumberConverter()->fromHex($fields->getTimestamp()->toString());
}
public function toUuidV1(): UuidV1
{
$instance = ($this->unwrapped ?? $this->unwrap());
if ($instance instanceof UuidV1) {
return $instance;
}
assert($instance instanceof UuidV6);
return $instance->toUuidV1();
}
public function toUuidV6(): UuidV6
{
$instance = ($this->unwrapped ?? $this->unwrap());
assert($instance instanceof UuidV6);
return $instance;
}
private function unwrap(): UuidInterface
{
return $this->unwrapped = (new UuidFactory())->fromString($this->uuid);
}
}
Anons79 File Manager Version 1.0, Coded By Anons79
Email: [email protected]