Thread overview | ||||||||
---|---|---|---|---|---|---|---|---|
|
April 05, 2013 Return enum-templated struct based on runtime value | ||||
---|---|---|---|---|
| ||||
Hi, I wonder if there is a good way to dry up this: enum Machine { I386, AMD64 // , ... } template machineWord(Machine machine) { static if (machine == Machine.I386) { alias machineWord = uint; } static if (machine == Machine.AMD64) { alias machineWord = ulong; } } ulong foo(Machine machine) { if (machine == Machine.I386) { machineWord!(Machine.I386) m = (1 << 32)-1; m++; return m; } else // assume AMD64 { machineWord!(Machine.AMD64) m = (1 << 32)-1; m++; return m; } } Essentially, I am doing the same with each machine type, but it has different semantics for each of them. I hope you see this is a valid use case and a way to remove duplication. Something à la specify the enum members to switch on to a template together with a templated function and then do some compile time magic to expand the code to invoke the appropriate specialization. |
April 05, 2013 Re: Return enum-templated struct based on runtime value | ||||
---|---|---|---|---|
| ||||
Posted in reply to Sebastian Graf | Sebastian Graf:
> I wonder if there is a good way to dry up this:
I suggest to improve that code a lot.
For machineWord there is:
alias machineWord = Select!(machine == Machine.I386, uint, ulong);
This:
(1 << 32)
Gives:
Error: shift by 32 is outside the range 0..31
Generally it's better to use named enums and final switches, where possible.
Keep in mind built-in integral numbers have the max attribute.
Bye,
bearophile
|
April 06, 2013 Re: Return enum-templated struct based on runtime value | ||||
---|---|---|---|---|
| ||||
Posted in reply to bearophile | On Friday, 5 April 2013 at 18:00:56 UTC, bearophile wrote: > Sebastian Graf: >> I wonder if there is a good way to dry up this: > > I suggest to improve that code a lot. > > For machineWord there is: > > alias machineWord = Select!(machine == Machine.I386, uint, ulong); > > > This: > (1 << 32) > > Gives: > Error: shift by 32 is outside the range 0..31 > > Generally it's better to use named enums and final switches, where possible. > > Keep in mind built-in integral numbers have the max attribute. > > Bye, > bearophile Thanks, this shows that I didn't really try to run that example. The Select template is helpful indeed. Is there however some way to generate that switch with cases for each enum member in a template, so that each case calls <some-passed-template-func>(Machine)() instantiated with the appropriate enum member? I know you could do it with string mixins, but that be a hassle to implement... Eventually, I want my code to look like void func(Machine machine)() { ... } switchOnEachEnumMember!func(machine); |
April 06, 2013 Re: Return enum-templated struct based on runtime value | ||||
---|---|---|---|---|
| ||||
Posted in reply to Sebastian Graf | > > Is there however some way to generate that switch with cases for each enum member in a template, so that each case calls <some-passed-template-func>(Machine)() instantiated with the appropriate enum member? I know you could do it with string mixins, but that be a hassle to implement... > > Eventually, I want my code to look like > > void func(Machine machine)() { ... } > switchOnEachEnumMember!func(machine); http://dpaste.dzfl.pl/ce8366a7 The foreach is unrolled at compile time. |
April 06, 2013 Re: Return enum-templated struct based on runtime value | ||||
---|---|---|---|---|
| ||||
Posted in reply to Tobias Pankrath | On Saturday, 6 April 2013 at 15:38:55 UTC, Tobias Pankrath wrote:
>>
>> Is there however some way to generate that switch with cases for each enum member in a template, so that each case calls <some-passed-template-func>(Machine)() instantiated with the appropriate enum member? I know you could do it with string mixins, but that be a hassle to implement...
>>
>> Eventually, I want my code to look like
>>
>> void func(Machine machine)() { ... }
>> switchOnEachEnumMember!func(machine);
>
> http://dpaste.dzfl.pl/ce8366a7
>
> The foreach is unrolled at compile time.
Perfect! So that's a final switch...
|
April 07, 2013 Re: Return enum-templated struct based on runtime value | ||||
---|---|---|---|---|
| ||||
Posted in reply to Sebastian Graf | On Saturday, 6 April 2013 at 20:35:54 UTC, Sebastian Graf wrote:
> On Saturday, 6 April 2013 at 15:38:55 UTC, Tobias Pankrath wrote:
>>>
>>> Is there however some way to generate that switch with cases for each enum member in a template, so that each case calls <some-passed-template-func>(Machine)() instantiated with the appropriate enum member? I know you could do it with string mixins, but that be a hassle to implement...
>>>
>>> Eventually, I want my code to look like
>>>
>>> void func(Machine machine)() { ... }
>>> switchOnEachEnumMember!func(machine);
>>
>> http://dpaste.dzfl.pl/ce8366a7
>>
>> The foreach is unrolled at compile time.
> Perfect! So that's a final switch...
The final switch isn't important here. You could use a normal switch with a default block instead.
|
Copyright © 1999-2021 by the D Language Foundation