. // }}} namespace App\Util; use App\Util\Exception\ServerException; abstract class Bitmap { public static function _do(int $r, bool $instance) { $init = $r; $class = get_called_class(); if ($instance) { $obj = new $class; } else { $vals = []; } $consts = (new \ReflectionClass($class))->getConstants(); unset($consts['PREFIX']); foreach ($consts as $c => $v) { $b = ($r & $v) !== 0; if ($instance) { $c = strtolower($c); $obj->{$c} = $b; } if ($b) { $r -= $v; if (!$instance) { $vals[] = $class::PREFIX . $c; } } } if ($r != 0) { Log::error('Bitmap to array conversion failed'); throw new ServerException("Bug in bitmap conversion for class {$class} from value {$init}"); } if ($instance) { return $obj; } else { return $vals; } } public static function create(int $r): self { return self::_do($r, true); } public static function toArray(int $r): array { return self::_do($r, false); } }