Block: simplify required type data / state data bits code

This commit is contained in:
Dylan K. Taylor 2023-04-13 12:55:09 +01:00
parent 6cace51a21
commit 5950707267
No known key found for this signature in database
GPG Key ID: 8927471A91CAFD3D

View File

@ -65,17 +65,8 @@ class Block{
/** @var AxisAlignedBB[]|null */ /** @var AxisAlignedBB[]|null */
protected ?array $collisionBoxes = null; protected ?array $collisionBoxes = null;
/** private int $requiredTypeDataBits;
* @var int[] private int $requiredStateDataBits;
* @phpstan-var array<string, int>
*/
private static array $typeDataBits = [];
/**
* @var int[]
* @phpstan-var array<string, int>
*/
private static array $stateDataBits = [];
private int $defaultStateData; private int $defaultStateData;
/** /**
@ -87,6 +78,14 @@ class Block{
$this->typeInfo = $typeInfo; $this->typeInfo = $typeInfo;
$this->position = new Position(0, 0, 0, null); $this->position = new Position(0, 0, 0, null);
$calculator = new RuntimeDataSizeCalculator();
$this->describeType($calculator);
$this->requiredTypeDataBits = $calculator->getBitsUsed();
$calculator = new RuntimeDataSizeCalculator();
$this->describeState($calculator);
$this->requiredStateDataBits = $calculator->getBitsUsed();
$this->defaultStateData = $this->computeStateData(); $this->defaultStateData = $this->computeStateData();
} }
@ -184,47 +183,33 @@ class Block{
} }
final public function getRequiredTypeDataBits() : int{ final public function getRequiredTypeDataBits() : int{
$class = get_class($this); return $this->requiredTypeDataBits;
if(isset(self::$typeDataBits[$class])){
return self::$typeDataBits[$class];
}
$calculator = new RuntimeDataSizeCalculator();
$this->describeType($calculator);
return self::$typeDataBits[$class] = $calculator->getBitsUsed();
} }
final public function getRequiredStateDataBits() : int{ final public function getRequiredStateDataBits() : int{
$class = get_class($this); return $this->requiredStateDataBits;
if(isset(self::$stateDataBits[$class])){
return self::$stateDataBits[$class];
}
$calculator = new RuntimeDataSizeCalculator();
$this->describeState($calculator);
return self::$stateDataBits[$class] = $calculator->getBitsUsed();
} }
/** /**
* @internal * @internal
*/ */
final public function decodeTypeData(int $data) : void{ final public function decodeTypeData(int $data) : void{
$typeBits = $this->getRequiredTypeDataBits(); $reader = new RuntimeDataReader($this->requiredTypeDataBits, $data);
$reader = new RuntimeDataReader($typeBits, $data);
$this->describeType($reader); $this->describeType($reader);
$readBits = $reader->getOffset(); $readBits = $reader->getOffset();
if($typeBits !== $readBits){ if($this->requiredTypeDataBits !== $readBits){
throw new \LogicException(get_class($this) . ": Exactly $typeBits bits of type data were provided, but $readBits were read"); throw new \LogicException(get_class($this) . ": Exactly $this->requiredTypeDataBits bits of type data were provided, but $readBits were read");
} }
} }
private function decodeStateData(int $data) : void{ private function decodeStateData(int $data) : void{
$stateBits = $this->getRequiredStateDataBits(); $reader = new RuntimeDataReader($this->requiredStateDataBits, $data);
$reader = new RuntimeDataReader($stateBits, $data);
$this->describeState($reader); $this->describeState($reader);
$readBits = $reader->getOffset(); $readBits = $reader->getOffset();
if($stateBits !== $readBits){ if($this->requiredStateDataBits !== $readBits){
throw new \LogicException(get_class($this) . ": Exactly $stateBits bits of state data were provided, but $readBits were read"); throw new \LogicException(get_class($this) . ": Exactly $this->requiredStateDataBits bits of state data were provided, but $readBits were read");
} }
} }
@ -232,37 +217,33 @@ class Block{
* @internal * @internal
*/ */
final public function decodeTypeAndStateData(int $data) : void{ final public function decodeTypeAndStateData(int $data) : void{
$typeBits = $this->getRequiredTypeDataBits(); $reader = new RuntimeDataReader($this->requiredTypeDataBits + $this->requiredStateDataBits, $data);
$stateBits = $this->getRequiredStateDataBits(); $this->decodeTypeData($reader->readInt($this->requiredTypeDataBits));
$reader = new RuntimeDataReader($typeBits + $stateBits, $data); $this->decodeStateData($reader->readInt($this->requiredStateDataBits));
$this->decodeTypeData($reader->readInt($typeBits));
$this->decodeStateData($reader->readInt($stateBits));
} }
/** /**
* @internal * @internal
*/ */
final public function computeTypeData() : int{ final public function computeTypeData() : int{
$typeBits = $this->getRequiredTypeDataBits(); $writer = new RuntimeDataWriter($this->requiredTypeDataBits);
$writer = new RuntimeDataWriter($typeBits);
$this->describeType($writer); $this->describeType($writer);
$writtenBits = $writer->getOffset(); $writtenBits = $writer->getOffset();
if($typeBits !== $writtenBits){ if($this->requiredTypeDataBits !== $writtenBits){
throw new \LogicException(get_class($this) . ": Exactly $typeBits bits of type data were expected, but $writtenBits were written"); throw new \LogicException(get_class($this) . ": Exactly $this->requiredTypeDataBits bits of type data were expected, but $writtenBits were written");
} }
return $writer->getValue(); return $writer->getValue();
} }
private function computeStateData() : int{ private function computeStateData() : int{
$stateBits = $this->getRequiredStateDataBits(); $writer = new RuntimeDataWriter($this->requiredStateDataBits);
$writer = new RuntimeDataWriter($stateBits);
$this->describeState($writer); $this->describeState($writer);
$writtenBits = $writer->getOffset(); $writtenBits = $writer->getOffset();
if($stateBits !== $writtenBits){ if($this->requiredStateDataBits !== $writtenBits){
throw new \LogicException(get_class($this) . ": Exactly $stateBits bits of state data were expected, but $writtenBits were written"); throw new \LogicException(get_class($this) . ": Exactly $this->requiredStateDataBits bits of state data were expected, but $writtenBits were written");
} }
return $writer->getValue(); return $writer->getValue();
@ -272,11 +253,9 @@ class Block{
* @internal * @internal
*/ */
final public function computeTypeAndStateData() : int{ final public function computeTypeAndStateData() : int{
$typeBits = $this->getRequiredTypeDataBits(); $writer = new RuntimeDataWriter($this->requiredTypeDataBits + $this->requiredStateDataBits);
$stateBits = $this->getRequiredStateDataBits(); $writer->writeInt($this->requiredTypeDataBits, $this->computeTypeData());
$writer = new RuntimeDataWriter($typeBits + $stateBits); $writer->writeInt($this->requiredStateDataBits, $this->computeStateData());
$writer->writeInt($typeBits, $this->computeTypeData());
$writer->writeInt($stateBits, $this->computeStateData());
return $writer->getValue(); return $writer->getValue();
} }