Bitfield-style enum to strings?

Nick Sabalausky via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu May 7 14:06:03 PDT 2015


Gah, missed some imports that time:

On 05/07/2015 05:04 PM, Nick Sabalausky wrote:
> Minor fix to work right for "none" fields. Already worked fine on
> combination fields liek "all".
>
> -------------------------------------
> enum Foo
> {
>      none = 0,
>      optionA = 1<<0,
>      optionB = 1<<1,
>      optionC = 1<<2,
>      optionD = 1<<3,
>      all = optionA | optionB | optionC | optionD,
> }
>
> import std.traits : isIntegral;
> auto bitFieldValues(T)(T value) if(is(T==enum) && isIntegral!T)
> {
import std.algorithm : filter, map;
import std.conv : to;
import std.traits : EnumMembers;

>      // There's gotta be a better way to convert EnumMembers!T
>      // to a range, right? But std.range.only() didn't work,
>      // due to a template instantiation error.
>      T[] members;
>      foreach(m; EnumMembers!(T))
>          members ~= m;
>
>      return members
>          .filter!(member => member==0? value==0 : (value&member)==member)
>          .map!(member => to!string(member));
> }
>
> void main()
> {
>      import std.range : join;
>      import std.stdio : writeln;
>
>      Foo fooVar = Foo.optionB | Foo.optionD;
>
>      // Output:
>      // optionB | optionD
>      // none
>      // optionA | optionB | optionC | optionD | all
>
>      writeln(bitFieldValues(Foo.optionB | Foo.optionD).join(" | "));
>      writeln(bitFieldValues(Foo.none).join(" | "));
>      writeln(bitFieldValues(Foo.all).join(" | "));
> }
> -------------------------------------
>



More information about the Digitalmars-d-learn mailing list