On 30.07.21 02:01, Кирилл Несмеянов wrote:
Yes, I saw this short description in your RFC ( 
https://wiki.php.net/rfc/enumerations ) about «enum sets». However, I do not 
quite understand why we can not now add a cast to scalars (string and int) and 
math expressions, which would solve this problem? This behavior has  already 
been implemented for GMP objects.

$mask = gmp_init(0b0001) | gmp_init(0b0010); // object(GMP) { num = 3; }
echo $mask; // 3
$mask = $mask + 1; // object(GMP) { num = 4; }
$mask instanceof \GMP; // true
I mean, for such cases, we can create a new "virtual enum case" containing a new value instead special «EnumSetCase». enum Some: int
{
     case A = 0b0001;
     case B = 0b0010;
}
var_dump(Some::A | Some::B); // enum(Some::@anonymous) { value = 3; } I don’t think that it is necessary to consider the «enum sets» as a separate case, cause addition is also a fairly popular case: case LAST = self::B + 1; Like any other mathematical operations.

I think you missing something

Consider this example:

enum Some: int
{
    case A = 0b0001;
    case B = 0b0010;
    case C = 0b0011;
}

var_dump(Some::B | Some::C)

This should result in a set of B|C but with your logic it's the same as just C.

and it also needs to work with strings:

enum Some: string
{
    case A = 'a';
    case B = 'b';
    case C = 'c';
}

This is where enum sets comes into play.

Without having PHP internals C knowledge I think it should be possible to introduce an EnumSet which internally handles a bit array where each bit is pointing to the position (ordinal) of an enum case but I don't think the ordinal position is guarantied to be stable over processes/versions so this would not directly by serializable nor do we have generics to define an enum set of a specific type (ala EnumSet<Some>).

Marc

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php

Reply via email to