aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/ramsey/uuid/src/FeatureSet.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/ramsey/uuid/src/FeatureSet.php')
-rw-r--r--vendor/ramsey/uuid/src/FeatureSet.php333
1 files changed, 333 insertions, 0 deletions
diff --git a/vendor/ramsey/uuid/src/FeatureSet.php b/vendor/ramsey/uuid/src/FeatureSet.php
new file mode 100644
index 000000000..56a774eab
--- /dev/null
+++ b/vendor/ramsey/uuid/src/FeatureSet.php
@@ -0,0 +1,333 @@
+<?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 <ben@benramsey.com>
+ * @license http://opensource.org/licenses/MIT MIT
+ * @link https://benramsey.com/projects/ramsey-uuid/ Documentation
+ * @link https://packagist.org/packages/ramsey/uuid Packagist
+ * @link https://github.com/ramsey/uuid GitHub
+ */
+
+namespace Ramsey\Uuid;
+
+use Ramsey\Uuid\Converter\TimeConverterInterface;
+use Ramsey\Uuid\Generator\PeclUuidTimeGenerator;
+use Ramsey\Uuid\Provider\Node\FallbackNodeProvider;
+use Ramsey\Uuid\Provider\Node\RandomNodeProvider;
+use Ramsey\Uuid\Provider\Node\SystemNodeProvider;
+use Ramsey\Uuid\Converter\NumberConverterInterface;
+use Ramsey\Uuid\Converter\Number\BigNumberConverter;
+use Ramsey\Uuid\Converter\Number\DegradedNumberConverter;
+use Ramsey\Uuid\Converter\Time\BigNumberTimeConverter;
+use Ramsey\Uuid\Converter\Time\DegradedTimeConverter;
+use Ramsey\Uuid\Converter\Time\PhpTimeConverter;
+use Ramsey\Uuid\Provider\Time\SystemTimeProvider;
+use Ramsey\Uuid\Builder\UuidBuilderInterface;
+use Ramsey\Uuid\Builder\DefaultUuidBuilder;
+use Ramsey\Uuid\Codec\CodecInterface;
+use Ramsey\Uuid\Codec\StringCodec;
+use Ramsey\Uuid\Codec\GuidStringCodec;
+use Ramsey\Uuid\Builder\DegradedUuidBuilder;
+use Ramsey\Uuid\Generator\RandomGeneratorFactory;
+use Ramsey\Uuid\Generator\RandomGeneratorInterface;
+use Ramsey\Uuid\Generator\TimeGeneratorFactory;
+use Ramsey\Uuid\Generator\TimeGeneratorInterface;
+use Ramsey\Uuid\Provider\TimeProviderInterface;
+use Ramsey\Uuid\Provider\NodeProviderInterface;
+
+/**
+ * FeatureSet detects and exposes available features in the current environment
+ * (32- or 64-bit, available dependencies, etc.)
+ */
+class FeatureSet
+{
+ /**
+ * @var bool
+ */
+ private $disableBigNumber = false;
+
+ /**
+ * @var bool
+ */
+ private $disable64Bit = false;
+
+ /**
+ * @var bool
+ */
+ private $ignoreSystemNode = false;
+
+ /**
+ * @var bool
+ */
+ private $enablePecl = false;
+
+ /**
+ * @var UuidBuilderInterface
+ */
+ private $builder;
+
+ /**
+ * @var CodecInterface
+ */
+ private $codec;
+
+ /**
+ * @var NodeProviderInterface
+ */
+ private $nodeProvider;
+
+ /**
+ * @var NumberConverterInterface
+ */
+ private $numberConverter;
+
+ /**
+ * @var RandomGeneratorInterface
+ */
+ private $randomGenerator;
+
+ /**
+ * @var TimeGeneratorInterface
+ */
+ private $timeGenerator;
+
+ /**
+ * Constructs a `FeatureSet` for use by a `UuidFactory` to determine or set
+ * features available to the environment
+ *
+ * @param bool $useGuids Whether to build UUIDs using the `GuidStringCodec`
+ * @param bool $force32Bit Whether to force the use of 32-bit functionality
+ * (primarily for testing purposes)
+ * @param bool $forceNoBigNumber Whether to disable the use of moontoast/math
+ * `BigNumber` (primarily for testing purposes)
+ * @param bool $ignoreSystemNode Whether to disable attempts to check for
+ * the system host ID (primarily for testing purposes)
+ * @param bool $enablePecl Whether to enable the use of the `PeclUuidTimeGenerator`
+ * to generate version 1 UUIDs
+ */
+ public function __construct(
+ $useGuids = false,
+ $force32Bit = false,
+ $forceNoBigNumber = false,
+ $ignoreSystemNode = false,
+ $enablePecl = false
+ ) {
+ $this->disableBigNumber = $forceNoBigNumber;
+ $this->disable64Bit = $force32Bit;
+ $this->ignoreSystemNode = $ignoreSystemNode;
+ $this->enablePecl = $enablePecl;
+
+ $this->numberConverter = $this->buildNumberConverter();
+ $this->builder = $this->buildUuidBuilder();
+ $this->codec = $this->buildCodec($useGuids);
+ $this->nodeProvider = $this->buildNodeProvider();
+ $this->randomGenerator = $this->buildRandomGenerator();
+ $this->setTimeProvider(new SystemTimeProvider());
+ }
+
+ /**
+ * Returns the builder configured for this environment
+ *
+ * @return UuidBuilderInterface
+ */
+ public function getBuilder()
+ {
+ return $this->builder;
+ }
+
+ /**
+ * Returns the UUID UUID coder-decoder configured for this environment
+ *
+ * @return CodecInterface
+ */
+ public function getCodec()
+ {
+ return $this->codec;
+ }
+
+ /**
+ * Returns the system node ID provider configured for this environment
+ *
+ * @return NodeProviderInterface
+ */
+ public function getNodeProvider()
+ {
+ return $this->nodeProvider;
+ }
+
+ /**
+ * Returns the number converter configured for this environment
+ *
+ * @return NumberConverterInterface
+ */
+ public function getNumberConverter()
+ {
+ return $this->numberConverter;
+ }
+
+ /**
+ * Returns the random UUID generator configured for this environment
+ *
+ * @return RandomGeneratorInterface
+ */
+ public function getRandomGenerator()
+ {
+ return $this->randomGenerator;
+ }
+
+ /**
+ * Returns the time-based UUID generator configured for this environment
+ *
+ * @return TimeGeneratorInterface
+ */
+ public function getTimeGenerator()
+ {
+ return $this->timeGenerator;
+ }
+
+ /**
+ * Sets the time provider for use in this environment
+ *
+ * @param TimeProviderInterface $timeProvider
+ */
+ public function setTimeProvider(TimeProviderInterface $timeProvider)
+ {
+ $this->timeGenerator = $this->buildTimeGenerator($timeProvider);
+ }
+
+ /**
+ * Determines which UUID coder-decoder to use and returns the configured
+ * codec for this environment
+ *
+ * @param bool $useGuids Whether to build UUIDs using the `GuidStringCodec`
+ * @return CodecInterface
+ */
+ protected function buildCodec($useGuids = false)
+ {
+ if ($useGuids) {
+ return new GuidStringCodec($this->builder);
+ }
+
+ return new StringCodec($this->builder);
+ }
+
+ /**
+ * Determines which system node ID provider to use and returns the configured
+ * system node ID provider for this environment
+ *
+ * @return NodeProviderInterface
+ */
+ protected function buildNodeProvider()
+ {
+ if ($this->ignoreSystemNode) {
+ return new RandomNodeProvider();
+ }
+
+ return new FallbackNodeProvider([
+ new SystemNodeProvider(),
+ new RandomNodeProvider()
+ ]);
+ }
+
+ /**
+ * Determines which number converter to use and returns the configured
+ * number converter for this environment
+ *
+ * @return NumberConverterInterface
+ */
+ protected function buildNumberConverter()
+ {
+ if ($this->hasBigNumber()) {
+ return new BigNumberConverter();
+ }
+
+ return new DegradedNumberConverter();
+ }
+
+ /**
+ * Determines which random UUID generator to use and returns the configured
+ * random UUID generator for this environment
+ *
+ * @return RandomGeneratorInterface
+ */
+ protected function buildRandomGenerator()
+ {
+ return (new RandomGeneratorFactory())->getGenerator();
+ }
+
+ /**
+ * Determines which time-based UUID generator to use and returns the configured
+ * time-based UUID generator for this environment
+ *
+ * @param TimeProviderInterface $timeProvider
+ * @return TimeGeneratorInterface
+ */
+ protected function buildTimeGenerator(TimeProviderInterface $timeProvider)
+ {
+ if ($this->enablePecl) {
+ return new PeclUuidTimeGenerator();
+ }
+
+ return (new TimeGeneratorFactory(
+ $this->nodeProvider,
+ $this->buildTimeConverter(),
+ $timeProvider
+ ))->getGenerator();
+ }
+
+ /**
+ * Determines which time converter to use and returns the configured
+ * time converter for this environment
+ *
+ * @return TimeConverterInterface
+ */
+ protected function buildTimeConverter()
+ {
+ if ($this->is64BitSystem()) {
+ return new PhpTimeConverter();
+ } elseif ($this->hasBigNumber()) {
+ return new BigNumberTimeConverter();
+ }
+
+ return new DegradedTimeConverter();
+ }
+
+ /**
+ * Determines which UUID builder to use and returns the configured UUID
+ * builder for this environment
+ *
+ * @return UuidBuilderInterface
+ */
+ protected function buildUuidBuilder()
+ {
+ if ($this->is64BitSystem()) {
+ return new DefaultUuidBuilder($this->numberConverter);
+ }
+
+ return new DegradedUuidBuilder($this->numberConverter);
+ }
+
+ /**
+ * Returns true if the system has `Moontoast\Math\BigNumber`
+ *
+ * @return bool
+ */
+ protected function hasBigNumber()
+ {
+ return class_exists('Moontoast\Math\BigNumber') && !$this->disableBigNumber;
+ }
+
+ /**
+ * Returns true if the system is 64-bit, false otherwise
+ *
+ * @return bool
+ */
+ protected function is64BitSystem()
+ {
+ return PHP_INT_SIZE == 8 && !$this->disable64Bit;
+ }
+}