xref: /plugin/combo/vendor/antlr/antlr4-php-runtime/src/Utils/BitSet.php (revision 37748cd8654635afbeca80942126742f0f4cc346)
1*37748cd8SNickeau<?php
2*37748cd8SNickeau
3*37748cd8SNickeaudeclare(strict_types=1);
4*37748cd8SNickeau
5*37748cd8SNickeaunamespace Antlr\Antlr4\Runtime\Utils;
6*37748cd8SNickeau
7*37748cd8SNickeauuse Antlr\Antlr4\Runtime\Comparison\Hasher;
8*37748cd8SNickeau
9*37748cd8SNickeaufinal class BitSet
10*37748cd8SNickeau{
11*37748cd8SNickeau    /** @var array<mixed> */
12*37748cd8SNickeau    private $data = [];
13*37748cd8SNickeau
14*37748cd8SNickeau    public function add(int $value) : void
15*37748cd8SNickeau    {
16*37748cd8SNickeau        $this->data[$value] = true;
17*37748cd8SNickeau    }
18*37748cd8SNickeau
19*37748cd8SNickeau    public function or(BitSet $set) : void
20*37748cd8SNickeau    {
21*37748cd8SNickeau        $this->data += $set->data;
22*37748cd8SNickeau    }
23*37748cd8SNickeau
24*37748cd8SNickeau    public function remove(int $value) : void
25*37748cd8SNickeau    {
26*37748cd8SNickeau        unset($this->data[$value]);
27*37748cd8SNickeau    }
28*37748cd8SNickeau
29*37748cd8SNickeau    public function contains(int $value) : bool
30*37748cd8SNickeau    {
31*37748cd8SNickeau        return \array_key_exists($value, $this->data);
32*37748cd8SNickeau    }
33*37748cd8SNickeau
34*37748cd8SNickeau    /**
35*37748cd8SNickeau     * @return array<mixed>
36*37748cd8SNickeau     */
37*37748cd8SNickeau    public function values() : array
38*37748cd8SNickeau    {
39*37748cd8SNickeau        return \array_keys($this->data);
40*37748cd8SNickeau    }
41*37748cd8SNickeau
42*37748cd8SNickeau    /**
43*37748cd8SNickeau     * @return mixed
44*37748cd8SNickeau     */
45*37748cd8SNickeau    public function minValue()
46*37748cd8SNickeau    {
47*37748cd8SNickeau        return \min($this->values());
48*37748cd8SNickeau    }
49*37748cd8SNickeau
50*37748cd8SNickeau    public function hashCode() : int
51*37748cd8SNickeau    {
52*37748cd8SNickeau        return Hasher::hash(...$this->values());
53*37748cd8SNickeau    }
54*37748cd8SNickeau
55*37748cd8SNickeau    public function equals(object $other) : bool
56*37748cd8SNickeau    {
57*37748cd8SNickeau        if ($this === $other) {
58*37748cd8SNickeau            return true;
59*37748cd8SNickeau        }
60*37748cd8SNickeau
61*37748cd8SNickeau        return $other instanceof self
62*37748cd8SNickeau            && $this->data === $other->data;
63*37748cd8SNickeau    }
64*37748cd8SNickeau
65*37748cd8SNickeau    public function length() : int
66*37748cd8SNickeau    {
67*37748cd8SNickeau        return \count($this->data);
68*37748cd8SNickeau    }
69*37748cd8SNickeau
70*37748cd8SNickeau    public function __toString() : string
71*37748cd8SNickeau    {
72*37748cd8SNickeau        return \sprintf('{%s}', \implode(', ', $this->values()));
73*37748cd8SNickeau    }
74*37748cd8SNickeau}
75