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