Thread overview | |||||||||
---|---|---|---|---|---|---|---|---|---|
|
May 16, 2012 enums extension | ||||
---|---|---|---|---|
| ||||
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 Re: enums extension | ||||
---|---|---|---|---|
| ||||
Posted in reply to Comrad | 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 Re: enums extension | ||||
---|---|---|---|---|
| ||||
Posted in reply to Comrad | 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 Re: enums extension | ||||
---|---|---|---|---|
| ||||
Posted in reply to Mehrdad | 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 Re: enums extension | ||||
---|---|---|---|---|
| ||||
Posted in reply to Simen Kjaeraas | 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 Re: enums extension | ||||
---|---|---|---|---|
| ||||
Posted in reply to Robert DaSilva | 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 Re: enums extension | ||||
---|---|---|---|---|
| ||||
Posted in reply to Mehrdad | 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.
|
Copyright © 1999-2021 by the D Language Foundation