www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - Improving std.typecons.defineEnum

reply Tomek =?UTF-8?B?U293acWEc2tp?= <just ask.me> writes:
I remember using defineEnum a few times. From user perspective you have enum
names as 
strings that forms a nasty mixin, not to mention you can't Ddoc single enum
values. It felt like 
stone age. Then I took a look at how it's implemented and saw a bunch of
unreadable 
templates glueing together the content of an unholy string mixin.

But instead of complaining I took time to devise something nicer:

enum Eh { Ah, Oh, Uh }	// plain vanilla enum
mixin EnumUtils!Eh;  // that's all you need, magic happens here

assert (enumToString(Eh.Ah) == "Ah");
assert (enumToString(cast(Eh)666) == null);

Eh eh;
assert (enumFromString("Oh", eh));
assert (eh == Eh.Oh);
assert (!enumFromString("Heh", eh));


Do you want the EnumUtils template in Phobos?
If so, how to contribute?

-- 
Tomek
Oct 06 2010
next sibling parent reply bearophile <bearophileHUGS lycos.com> writes:
Tomek S.:

 I remember using defineEnum a few times.

Isn't it deprecated now? Bye, bearophile
Oct 06 2010
parent Tomek =?UTF-8?B?U293acWEc2tp?= <just ask.me> writes:
bearophile napisał:

 I remember using defineEnum a few times.

Isn't it deprecated now?

Ah.. it is, got an old release. Still, do you want my stuff? -- Tomek
Oct 06 2010
prev sibling next sibling parent Tomek =?UTF-8?B?U293acWEc2tp?= <just ask.me> writes:
Tomek Sowiński napisał:

 enum Eh { Ah, Oh, Uh }	// plain vanilla enum
 mixin EnumUtils!Eh;  // that's all you need, magic happens here

Actually, you don't even need the mixin, just 2 functions... -- Tomek
Oct 06 2010
prev sibling parent reply Andrei Alexandrescu <SeeWebsiteForEmail erdani.org> writes:
On 10/6/10 14:18 CDT, Tomek Sowiński wrote:
 I remember using defineEnum a few times. From user perspective you have enum
names as
 strings that forms a nasty mixin, not to mention you can't Ddoc single enum
values. It felt like
 stone age. Then I took a look at how it's implemented and saw a bunch of
unreadable
 templates glueing together the content of an unholy string mixin.

 But instead of complaining I took time to devise something nicer:

 enum Eh { Ah, Oh, Uh }	// plain vanilla enum
 mixin EnumUtils!Eh;  // that's all you need, magic happens here

 assert (enumToString(Eh.Ah) == "Ah");
 assert (enumToString(cast(Eh)666) == null);

 Eh eh;
 assert (enumFromString("Oh", eh));
 assert (eh == Eh.Oh);
 assert (!enumFromString("Heh", eh));


 Do you want the EnumUtils template in Phobos?
 If so, how to contribute?

That's a good contribution, but I just deprecated enumToString in a recent commit because D's current introspection abilities made it easy to define parse and to!string to manipulate enum names. I'll be looking forward to other goodies! Andrei
Oct 06 2010
parent Tomek =?UTF-8?B?U293acWEc2tp?= <just ask.me> writes:
Andrei Alexandrescu napisał:

 That's a good contribution, but I just deprecated enumToString in a
 recent commit because D's current introspection abilities made it easy
 to define parse and to!string to manipulate enum names.
 
 I'll be looking forward to other goodies!

Thanks, I just saw std.conv -- looks much better. BTW, instead of: foreach (i, e; EnumMembers!Target) { auto ident = __traits(allMembers, Target)[i]; if (s.skipOver(ident)) return e; } you can: foreach (ident; __traits(allMembers, Target)) if (s.skipOver(ident)) return __traits(getMember, Target, ident); But that's nitpicking :) -- Tomek
Oct 06 2010