You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
I believe this is related to #314 and #321, so my apologies if it is. But, from the docs and those comments, it almost seemed like the below use case should work; but it fails for the BOTH case. This is after I considered your casting comments in 314 about enum vs enum_flags, and accounted for both input formats, to try both in what seemed the least restrictive way. I also read through the limitations... so I am very confused.
Working off of head (0.9.6):
Which results in incorrect values definitely for BOTH, and a curious non-parsing (?) for "NONE|CCW"
> g++ -std=gnu++17 demo.cpp && ./a.out
CCW (CCW/CCW): 1 # OK
ccw (CCW/CCW): 1 # OK
cw (CW/CW): 2 # OK
BOTH (/): 0 # Uhhhhh help?? I have no clue what I'm doing wrong, to not get this.
NONE (/): 0 # This is interesting; the value is correct, but the name is missing; which might be 321
NONE|CCW (/): 0 # Uh, I don't think I need this, but, is this a bug?
CCW|CW (/CCW|CW): 3 # OK
The text was updated successfully, but these errors were encountered:
With respect to the first one, BOTH, the reason for my confusion is that the read() function attempts both (in order) enum_flags_cast and then enum_cast.
As per the relevant docs/comment in 314:
enumclassTestEnum {
A = 0,
B = 1,
C = 2,
D = 3,
};
enum_name(TestEnum::D) = 'D'; vs enum_flags_name(TestEnum::D) = 'B|C';
enum_flags_cast('A') = nullopt; vs enum_cast('A') = TestEnum::A;
enum_flags_cast('D') = nullopt; vs enum_flags_cast('B|C') = TestEnum::D; vs enum_cast('D') = TestEnum::D;
I'd expect enum_flags_cast('D' /* BOTH */).value_or( enum_cast('D') to fail on flag-cast D (since not a real flag), but then trying to normal enum cast D to work (enum_cast('D') == TestEnum::D) (and the resulting integer TestEnum::D == TestEnum::B | TestEnum::C).
I tried it like this, such that if the string 'B|C' was passed, that would first get correctly parsed/handled, but if the shorthand 'BOTH' was passed, that would also get correctly handled.
My main question is, is there something I'm missing, that test("BOTH") -> enum_flags_cast("BOTH") /* fail */ .value_or( enum_cast("BOTH") /* fail */ .value_or("NONE") /* incorrect!? */ ).
Does it have something to do with
I believe this is related to #314 and #321, so my apologies if it is. But, from the docs and those comments, it almost seemed like the below use case should work; but it fails for the BOTH case. This is after I considered your casting comments in 314 about enum vs enum_flags, and accounted for both input formats, to try both in what seemed the least restrictive way. I also read through the limitations... so I am very confused.
Working off of head (0.9.6):
Which results in incorrect values definitely for BOTH, and a curious non-parsing (?) for "NONE|CCW"
The text was updated successfully, but these errors were encountered: