Thread overview
version specific enum members
Oct 29, 2009
Phil Deets
Oct 29, 2009
Ellery Newcomer
Oct 29, 2009
Ary Borenszweig
Oct 29, 2009
Phil Deets
Oct 30, 2009
Ary Borenszweig
Oct 30, 2009
Phil Deets
Oct 30, 2009
Daniel Keep
Oct 30, 2009
Phil Deets
October 29, 2009
Hi, is there a way to add members to an enum based on conditional compilation symbols. I tried

enum Tag {
   A, B,
   version (symbol) {
      C, D,
   }
   E,
}

but it doesn't work. I know I could do

version (symbol) {
   enum Tag { A, B, C, D, E }
} else {
   enum Tag { A, B, E }
}

but I don't want to do that since in my case, there can be quite a few elements outside of the version, and I don't want to repeat them all.


-- 
Using Opera's revolutionary e-mail client: http://www.opera.com/mail/
October 29, 2009
Phil Deets wrote:
> Hi, is there a way to add members to an enum based on conditional compilation symbols. I tried
> 
> enum Tag {
>    A, B,
>    version (symbol) {
>       C, D,
>    }
>    E,
> }
> 
> but it doesn't work. I know I could do
> 
> version (symbol) {
>    enum Tag { A, B, C, D, E }
> } else {
>    enum Tag { A, B, E }
> }
> 
> but I don't want to do that since in my case, there can be quite a few elements outside of the version, and I don't want to repeat them all.
> 
> 

Unfortunately, that's going to be about the best you can do, unless you're willing to play with string mixins and their ilk.
October 29, 2009
Ellery Newcomer wrote:
> Phil Deets wrote:
>> Hi, is there a way to add members to an enum based on conditional
>> compilation symbols. I tried
>>
>> enum Tag {
>>    A, B,
>>    version (symbol) {
>>       C, D,
>>    }
>>    E,
>> }
>>
>> but it doesn't work. I know I could do
>>
>> version (symbol) {
>>    enum Tag { A, B, C, D, E }
>> } else {
>>    enum Tag { A, B, E }
>> }
>>
>> but I don't want to do that since in my case, there can be quite a few
>> elements outside of the version, and I don't want to repeat them all.
>>
>>
> 
> Unfortunately, that's going to be about the best you can do, unless
> you're willing to play with string mixins and their ilk.

Or unless you create an enhancement request. That seems a very valid one.
October 29, 2009
On Thu, 29 Oct 2009 18:28:12 -0500, Ary Borenszweig <ary@esperanto.org.ar> wrote:

> Ellery Newcomer wrote:
>> Phil Deets wrote:
>>> Hi, is there a way to add members to an enum based on conditional
>>> compilation symbols. I tried
>>>
>>> enum Tag {
>>>    A, B,
>>>    version (symbol) {
>>>       C, D,
>>>    }
>>>    E,
>>> }
>>>
>>> but it doesn't work. I know I could do
>>>
>>> version (symbol) {
>>>    enum Tag { A, B, C, D, E }
>>> } else {
>>>    enum Tag { A, B, E }
>>> }
>>>
>>> but I don't want to do that since in my case, there can be quite a few
>>> elements outside of the version, and I don't want to repeat them all.
>>>
>>>
>>  Unfortunately, that's going to be about the best you can do, unless
>> you're willing to play with string mixins and their ilk.
>
> Or unless you create an enhancement request. That seems a very valid one.

Done (on the main D list).
October 30, 2009

Phil Deets wrote:
> Hi, is there a way to add members to an enum based on conditional compilation symbols. I tried
> 
> enum Tag {
>    A, B,
>    version (symbol) {
>       C, D,
>    }
>    E,
> }
> 
> but it doesn't work. I know I could do
> 
> version (symbol) {
>    enum Tag { A, B, C, D, E }
> } else {
>    enum Tag { A, B, E }
> }
> 
> but I don't want to do that since in my case, there can be quite a few elements outside of the version, and I don't want to repeat them all.

template Version(char[] ident)
{
    mixin(`version(`~ident~`) const Version = true;
           else const Version = false;`);
}

char[] genEnum(bool flag1, bool flag2)
{
    return "A, B, "
         ~ (flag1 ? "C, D, " : "")
         ~ "E, F, "
         ~ (flag2 ? "G, H, " : "")
         ~ "G, ";
}

mixin(genEnum( Version!(`symbol`), Version!(`somethingElse`) ));

... is about the best you can do, I think.
October 30, 2009
On Fri, 30 Oct 2009 00:03:23 -0500, Daniel Keep <daniel.keep.lists@gmail.com> wrote:

>
>
> Phil Deets wrote:
>> Hi, is there a way to add members to an enum based on conditional
>> compilation symbols. I tried
>>
>> enum Tag {
>>    A, B,
>>    version (symbol) {
>>       C, D,
>>    }
>>    E,
>> }
>>
>> but it doesn't work. I know I could do
>>
>> version (symbol) {
>>    enum Tag { A, B, C, D, E }
>> } else {
>>    enum Tag { A, B, E }
>> }
>>
>> but I don't want to do that since in my case, there can be quite a few
>> elements outside of the version, and I don't want to repeat them all.
>
> template Version(char[] ident)
> {
>     mixin(`version(`~ident~`) const Version = true;
>            else const Version = false;`);
> }
>
> char[] genEnum(bool flag1, bool flag2)
> {
>     return "A, B, "
>          ~ (flag1 ? "C, D, " : "")
>          ~ "E, F, "
>          ~ (flag2 ? "G, H, " : "")
>          ~ "G, ";
> }
>
> mixin(genEnum( Version!(`symbol`), Version!(`somethingElse`) ));
>
> ... is about the best you can do, I think.

Hey, thanks for the idea. I worked with it a little bit to remove the generator function and use multiline strings. This is what I came up with.

mixin(q"ENUM
enum Tag
{
   A, B,
ENUM"~(Version!("symbol")?q"ENUM
   C, D,
ENUM":"")~q"ENUM
   E,
}
ENUM");

That's not pretty, but it's good enough for me.
October 30, 2009
Phil Deets wrote:
> On Thu, 29 Oct 2009 18:28:12 -0500, Ary Borenszweig <ary@esperanto.org.ar> wrote:
> 
>> Ellery Newcomer wrote:
>>> Phil Deets wrote:
>>>> Hi, is there a way to add members to an enum based on conditional
>>>> compilation symbols. I tried
>>>>
>>>> enum Tag {
>>>>    A, B,
>>>>    version (symbol) {
>>>>       C, D,
>>>>    }
>>>>    E,
>>>> }
>>>>
>>>> but it doesn't work. I know I could do
>>>>
>>>> version (symbol) {
>>>>    enum Tag { A, B, C, D, E }
>>>> } else {
>>>>    enum Tag { A, B, E }
>>>> }
>>>>
>>>> but I don't want to do that since in my case, there can be quite a few
>>>> elements outside of the version, and I don't want to repeat them all.
>>>>
>>>>
>>>  Unfortunately, that's going to be about the best you can do, unless
>>> you're willing to play with string mixins and their ilk.
>>
>> Or unless you create an enhancement request. That seems a very valid one.
> 
> Done (on the main D list).

I meant a bugzilla enhancement, otherwise it'll get lost in the newsgroups.
October 30, 2009
On Fri, 30 Oct 2009 06:38:44 -0500, Ary Borenszweig <ary@esperanto.org.ar> wrote:

> Phil Deets wrote:
>> On Thu, 29 Oct 2009 18:28:12 -0500, Ary Borenszweig <ary@esperanto.org.ar> wrote:
>>
>>> Ellery Newcomer wrote:
>>>>  Unfortunately, that's going to be about the best you can do, unless
>>>> you're willing to play with string mixins and their ilk.
>>>
>>> Or unless you create an enhancement request. That seems a very valid one.
>>  Done (on the main D list).
>
> I meant a bugzilla enhancement, otherwise it'll get lost in the newsgroups.

Well, I wanted to gauge support for the idea. It turns out I found a string mixin workaround that works; so it isn't critical for me now.