summaryrefslogtreecommitdiff
path: root/vendor/open-telemetry/context/ContextStorageNode.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/open-telemetry/context/ContextStorageNode.php')
-rw-r--r--vendor/open-telemetry/context/ContextStorageNode.php92
1 files changed, 92 insertions, 0 deletions
diff --git a/vendor/open-telemetry/context/ContextStorageNode.php b/vendor/open-telemetry/context/ContextStorageNode.php
new file mode 100644
index 000000000..12d521660
--- /dev/null
+++ b/vendor/open-telemetry/context/ContextStorageNode.php
@@ -0,0 +1,92 @@
+<?php
+
+declare(strict_types=1);
+
+namespace OpenTelemetry\Context;
+
+use function assert;
+
+/**
+ * @internal
+ */
+final class ContextStorageNode implements ScopeInterface, ContextStorageScopeInterface
+{
+ public ContextInterface $context;
+ public ContextStorageHead $head;
+ private ?ContextStorageNode $previous;
+ private array $localStorage = [];
+
+ public function __construct(
+ ContextInterface $context,
+ ContextStorageHead $head,
+ ?ContextStorageNode $previous = null
+ ) {
+ $this->context = $context;
+ $this->head = $head;
+ $this->previous = $previous;
+ }
+
+ public function offsetExists($offset): bool
+ {
+ return isset($this->localStorage[$offset]);
+ }
+
+ /**
+ * @phan-suppress PhanUndeclaredClassAttribute
+ */
+ #[\ReturnTypeWillChange]
+ public function offsetGet($offset)
+ {
+ return $this->localStorage[$offset];
+ }
+
+ public function offsetSet($offset, $value): void
+ {
+ $this->localStorage[$offset] = $value;
+ }
+
+ public function offsetUnset($offset): void
+ {
+ unset($this->localStorage[$offset]);
+ }
+
+ public function context(): ContextInterface
+ {
+ return $this->context;
+ }
+
+ public function detach(): int
+ {
+ $flags = 0;
+ if ($this->head !== $this->head->storage->current) {
+ $flags |= ScopeInterface::INACTIVE;
+ }
+
+ if ($this === $this->head->node) {
+ assert($this->previous !== $this);
+ $this->head->node = $this->previous;
+ $this->previous = $this;
+
+ return $flags;
+ }
+
+ if ($this->previous === $this) {
+ return $flags | ScopeInterface::DETACHED;
+ }
+
+ assert($this->head->node !== null);
+ for ($n = $this->head->node, $depth = 1;
+ $n->previous !== $this;
+ $n = $n->previous, $depth++) {
+ assert($n->previous !== null);
+ }
+ $n->previous = $this->previous;
+ $this->previous = $this;
+
+ return $flags | ScopeInterface::MISMATCH | $depth;
+ }
+
+ private function __clone()
+ {
+ }
+}