Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 64 additions & 0 deletions src/EnumSet.php
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,70 @@ public function isSuperset(EnumSet $other)
return ($thisBitset | $other->getBinaryBitsetLe()) === $thisBitset;
}

/**
* Get ordinal numbers of the defined enumerators as array
* @return int[]
*/
public function getOrdinals()
{
$ordinals = array();
$byteLen = strlen($this->bitset);

for ($bytePos = 0; $bytePos < $byteLen; ++$bytePos) {
if ($this->bitset[$bytePos] === "\0") {
continue; // fast skip null byte
}

for ($bitPos = 0; $bitPos < 8; ++$bitPos) {
if ((ord($this->bitset[$bytePos]) & (1 << $bitPos)) !== 0) {
$ordinals[] = $bytePos * 8 + $bitPos;
}
}
}

return $ordinals;
}

/**
* Get values of the defined enumerators as array
* @return null[]|bool[]|int[]|float[]|string[]
*/
public function getValues()
{
$values = array();
foreach ($this->getEnumerators() as $enumerator) {
$values[] = $enumerator->getValue();
}
return $values;
}

/**
* Get names of the defined enumerators as array
* @return string[]
*/
public function getNames()
{
$names = array();
foreach ($this->getEnumerators() as $enumerator) {
$names[] = $enumerator->getName();
}
return $names;
}

/**
* Get the defined enumerators as array
* @return Enum[]
*/
public function getEnumerators()
{
$enumeration = $this->enumeration;
$enumerators = array();
foreach ($this->getOrdinals() as $ord) {
$enumerators[] = $enumeration::getByOrdinal($ord);
}
return $enumerators;
}

/**
* Get binary bitset in little-endian order
*
Expand Down
92 changes: 92 additions & 0 deletions tests/MabeEnumTest/EnumSetTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -566,4 +566,96 @@ public function testIsSupersetWrongInstance()
$this->assertFalse($set1->isSuperset($set2));
}
}

public function testGetOrdinals()
{
$set = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
$this->assertSame(array(), $set->getOrdinals());

foreach (EnumBasic::getConstants() as $value) {
$set->attach($value);
}

$this->assertSame(range(0, count(EnumBasic::getConstants()) - 1), $set->getOrdinals());
}

public function testGetOrdinalsDoesNotEffectIteratorPosition()
{
$set = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
$set->attach(EnumBasic::ONE);
$set->attach(EnumBasic::TWO);
$set->next();

$set->getOrdinals();
$this->assertSame(EnumBasic::TWO, $set->current()->getValue());
}

public function testGetEnumerators()
{
$set = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
$this->assertSame(array(), $set->getEnumerators());

foreach (EnumBasic::getConstants() as $value) {
$set->attach($value);
}

$this->assertSame(EnumBasic::getEnumerators(), $set->getEnumerators());
}

public function testGetEnumeratorsDoesNotEffectIteratorPosition()
{
$set = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
$set->attach(EnumBasic::ONE);
$set->attach(EnumBasic::TWO);
$set->next();

$set->getEnumerators();
$this->assertSame(EnumBasic::TWO, $set->current()->getValue());
}

public function testGetValues()
{
$set = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
$this->assertSame(array(), $set->getValues());

foreach (EnumBasic::getConstants() as $value) {
$set->attach($value);
}

$this->assertSame(array_values(EnumBasic::getConstants()), $set->getValues());
}

public function testGetValuesDoesNotEffectIteratorPosition()
{
$set = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
$set->attach(EnumBasic::ONE);
$set->attach(EnumBasic::TWO);
$set->next();

$set->getValues();
$this->assertSame(EnumBasic::TWO, $set->current()->getValue());
}

public function testGetNames()
{
$set = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
$this->assertSame(array(), $set->getNames());

foreach (EnumBasic::getConstants() as $value) {
$set->attach($value);
}

$this->assertSame(array_keys(EnumBasic::getConstants()), $set->getNames());
}

public function testGetNamesDoesNotEffectIteratorPosition()
{
$set = new EnumSet('MabeEnumTest\TestAsset\EnumBasic');
$set->attach(EnumBasic::ONE);
$set->attach(EnumBasic::TWO);
$set->next();

$set->getNames();
$this->assertSame(EnumBasic::TWO, $set->current()->getValue());
}
}