Skip to content

Instantly share code, notes, and snippets.

@vonglasow
Last active August 17, 2016 09:14
Show Gist options
  • Save vonglasow/de228ee22e0321304ca0 to your computer and use it in GitHub Desktop.
Save vonglasow/de228ee22e0321304ca0 to your computer and use it in GitHub Desktop.
Free
<?php
class Free
{
const A = 0x1;
const B = 0x2;
const C = 0x4;
protected $typeList;
protected $free = 0;
protected function isFlag($flag) {
if (is_null($this->typeList)) {
$reflector = new ReflectionClass($this);
$this->typeList = $reflector->getConstants();
}
if (!in_array($flag, $this->typeList)) {
throw new Exception('Error constant ' . $flag . ' undefined');
}
return true;
}
public function isFreeFor($flag) {
$this->isFlag($flag);
return $this->free & $flag;
}
public function makeFreeFor($flag) {
$this->isFlag($flag);
$this->free |= $flag;
}
public function makeUnfreeFor($flag) {
$this->isFlag($flag);
$this->free &= ~$flag;
}
public function resetFree() {
$this->free = 0;
}
}
$f = new Free;
var_dump($f->isFreeFor(Free::A));
var_dump($f->isFreeFor(Free::B));
var_dump($f->isFreeFor(Free::C));
$f->makeFreeFor(Free::A);
var_dump($f->isFreeFor(Free::A));
var_dump($f->isFreeFor(Free::B));
var_dump($f->isFreeFor(Free::C));
$f->makeFreeFor(Free::B);
var_dump($f->isFreeFor(Free::A));
var_dump($f->isFreeFor(Free::B));
var_dump($f->isFreeFor(Free::C));
$f->makeFreeFor(Free::C);
var_dump($f->isFreeFor(Free::A));
var_dump($f->isFreeFor(Free::B));
var_dump($f->isFreeFor(Free::C));
$f->resetFree();
var_dump($f->isFreeFor(Free::A));
var_dump($f->isFreeFor(Free::B));
var_dump($f->isFreeFor(Free::C));
$f->makeFreeFor(Free::A);
var_dump($f->isFreeFor(Free::A));
var_dump($f->isFreeFor(Free::B));
var_dump($f->isFreeFor(Free::C));
$f->makeFreeFor(Free::B);
var_dump($f->isFreeFor(Free::A));
var_dump($f->isFreeFor(Free::B));
var_dump($f->isFreeFor(Free::C));
$f->makeFreeFor(Free::C);
var_dump($f->isFreeFor(Free::A));
var_dump($f->isFreeFor(Free::B));
var_dump($f->isFreeFor(Free::C));
$f->makeUnFreeFor(Free::A);
var_dump($f->isFreeFor(Free::A));
var_dump($f->isFreeFor(Free::B));
var_dump($f->isFreeFor(Free::C));
$f->makeUnFreeFor(Free::B);
var_dump($f->isFreeFor(Free::A));
var_dump($f->isFreeFor(Free::B));
var_dump($f->isFreeFor(Free::C));
$f->makeUnFreeFor(Free::C);
var_dump($f->isFreeFor(Free::A));
var_dump($f->isFreeFor(Free::B));
var_dump($f->isFreeFor(Free::C));
$f->makeFreeFor('A');
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment