Thread overview
enums extension
May 16, 2012
Comrad
May 16, 2012
Mehrdad
May 16, 2012
Robert DaSilva
May 17, 2012
Mehrdad
May 17, 2012
Mehrdad
May 16, 2012
Simen Kjaeraas
May 17, 2012
Comrad
May 16, 2012
Dear developers and community,
I want to draw you attention to the topic which was already discussed here:
http://forum.dlang.org/thread/9to6n8$12d6$1@digitaldaemon.com
and here:
http://forum.dlang.org/thread/bl1n0e$1km5$1@digitaldaemon.com

My question is: was something similar already done? are there some plans to do that?
May 16, 2012
On Wednesday, 16 May 2012 at 04:22:18 UTC, Comrad wrote:
> Dear developers and community,
> I want to draw you attention to the topic which was already discussed here:
> http://forum.dlang.org/thread/9to6n8$12d6$1@digitaldaemon.com
> and here:
> http://forum.dlang.org/thread/bl1n0e$1km5$1@digitaldaemon.com
>
> My question is: was something similar already done? are there some plans to do that?

Dunno... but the way I'd use them would be more like:

enum AccessMask
{
	GENERIC_READ = 0x80000000,
	GENERIC_WRITE = 0x40000000,
	GENERIC_EXECUTE = 0x20000000,
	GENERIC_ALL = 0x10000000,
	//....
}

enum FileAccessMask : AccessMask
{
	FILE_READ_DATA = 0x0001,
	//...
}
May 16, 2012
On Wed, 16 May 2012 06:22:15 +0200, Comrad <comrad.karlovich@googlemail.com> wrote:

> Dear developers and community,
> I want to draw you attention to the topic which was already discussed here:
> http://forum.dlang.org/thread/9to6n8$12d6$1@digitaldaemon.com
> and here:
> http://forum.dlang.org/thread/bl1n0e$1km5$1@digitaldaemon.com
>
> My question is: was something similar already done? are there some plans to do that?

I have implemented this functionality in user code, with some caveats:

module enumMagic;

string EnumDefAsString(T)()
	if (is(T == enum))
{
	string result = "";
	foreach (e; __traits(allMembers, T)) {
		result ~= e ~ " = T." ~ e ~ ",";
	}
	return result;
}

template ExtendEnum(T, string s)
	if (is(T == enum) &&
		is(typeof({mixin("enum a{"~s~"}");})))
{
	mixin(
		"enum ExtendEnum {"
		~ EnumDefAsString!T()
		~ s
		~ "}");
}

unittest {
    enum Foo {
        a,
        b,
        c
    }
    alias ExtendEnum!( Foo, q{
        d,
        e
    }) Bar;

    Bar b;
    b = Bar.a; // Look ma, I stole this from Foo!
    b = Bar.d;
    assert( Bar.a == Foo.a ); // Can compare the two.
    //b = Foo.a; // But cannot assign from one to the other.
}

void main( ) {
}

A library implementation with the missing features is possible, but would use a
struct instead of an enum, an be a rather larger piece of code than this.
May 16, 2012
On Wednesday, 16 May 2012 at 05:49:01 UTC, Mehrdad wrote:
> On Wednesday, 16 May 2012 at 04:22:18 UTC, Comrad wrote:
>> Dear developers and community,
>> I want to draw you attention to the topic which was already discussed here:
>> http://forum.dlang.org/thread/9to6n8$12d6$1@digitaldaemon.com
>> and here:
>> http://forum.dlang.org/thread/bl1n0e$1km5$1@digitaldaemon.com
>>
>> My question is: was something similar already done? are there some plans to do that?
>
> Dunno... but the way I'd use them would be more like:
>
> enum AccessMask
> {
> 	GENERIC_READ = 0x80000000,
> 	GENERIC_WRITE = 0x40000000,
> 	GENERIC_EXECUTE = 0x20000000,
> 	GENERIC_ALL = 0x10000000,
> 	//....
> }
>
> enum FileAccessMask : AccessMask
> {
> 	FILE_READ_DATA = 0x0001,
> 	//...
> }

The inheritances notation implies that it's a subset and can be assigned to an instances of the base. This would not be true with enums.

FileAccessMask foo = FileAccessMask.FILE_READ_DATA;
AccessMask bar = foo; // Error
May 17, 2012
On Wednesday, 16 May 2012 at 05:54:45 UTC, Simen Kjaeraas wrote:
> On Wed, 16 May 2012 06:22:15 +0200, Comrad <comrad.karlovich@googlemail.com> wrote:
>
>> Dear developers and community,
>> I want to draw you attention to the topic which was already discussed here:
>> http://forum.dlang.org/thread/9to6n8$12d6$1@digitaldaemon.com
>> and here:
>> http://forum.dlang.org/thread/bl1n0e$1km5$1@digitaldaemon.com
>>
>> My question is: was something similar already done? are there some plans to do that?
>
> I have implemented this functionality in user code, with some caveats:
>
> module enumMagic;
>
> string EnumDefAsString(T)()
> 	if (is(T == enum))
> {
> 	string result = "";
> 	foreach (e; __traits(allMembers, T)) {
> 		result ~= e ~ " = T." ~ e ~ ",";
> 	}
> 	return result;
> }
>
> template ExtendEnum(T, string s)
> 	if (is(T == enum) &&
> 		is(typeof({mixin("enum a{"~s~"}");})))
> {
> 	mixin(
> 		"enum ExtendEnum {"
> 		~ EnumDefAsString!T()
> 		~ s
> 		~ "}");
> }
>
> unittest {
>     enum Foo {
>         a,
>         b,
>         c
>     }
>     alias ExtendEnum!( Foo, q{
>         d,
>         e
>     }) Bar;
>
>     Bar b;
>     b = Bar.a; // Look ma, I stole this from Foo!
>     b = Bar.d;
>     assert( Bar.a == Foo.a ); // Can compare the two.
>     //b = Foo.a; // But cannot assign from one to the other.
> }
>
> void main( ) {
> }
>
> A library implementation with the missing features is possible, but would use a
> struct instead of an enum, an be a rather larger piece of code than this.

This is not really useful, because one can't pass Foo into a function if it's declared to take Bar...
May 17, 2012
On Wednesday, 16 May 2012 at 06:24:54 UTC, Robert DaSilva wrote:
> The inheritances notation implies that it's a subset and can be assigned to an instances of the base. This would not be true with enums.
> FileAccessMask foo = FileAccessMask.FILE_READ_DATA;
> AccessMask bar = foo; // Error

Actually, that^ *should* work in my case; that was my point...
May 17, 2012
On Thursday, 17 May 2012 at 18:27:07 UTC, Mehrdad wrote:
> On Wednesday, 16 May 2012 at 06:24:54 UTC, Robert DaSilva wrote:
>> The inheritances notation implies that it's a subset and can be assigned to an instances of the base. This would not be true with enums.
>> FileAccessMask foo = FileAccessMask.FILE_READ_DATA;
>> AccessMask bar = foo; // Error
>
> Actually, that^ *should* work in my case; that was my point...

Wait, no, scratch that, I misread it; you're right.
It shouldn't work without a cast, but it should work with a cast.