. // }}} namespace App\Util; use App\Util\Exception\ServerException; abstract class Bitmap { public static $consts = null; public static function _do(int $r, bool $instance) { $init = $r; $class = get_called_class(); if ($instance) { $obj = new $class; } else { $vals = []; } if (self::$consts == null) { self::$consts = (new \ReflectionClass($class))->getConstants(); unset(self::$consts['PREFIX']); } foreach (self::$consts as $c => $v) { $b = ($r & $v) !== 0; if ($instance) { $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); } }