. // }}} namespace App\Util; use App\Core\Log; use App\Util\Exception\ServerException; abstract class Bitmap { /** * Convert from an integer to an onject or an array of constants for * set each bit. If $instance, return an object with the corresponding * properties set */ private static function _to(int $r, bool $instance) { $init = $r; $class = static::class; $obj = null; $vals = null; if ($instance) { $obj = new $class; } else { $vals = []; } $consts = (new \ReflectionClass($class))->getConstants(); $have_prefix = false; if (isset($consts['PREFIX'])) { $have_prefix = true; 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[] = ($have_prefix ? $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::_to($r, true); } public static function toArray(int $r): array { return self::_to($r, false); } }