compile-time variables?
Bill Baxter
dnewsgroup at billbaxter.com
Wed May 23 12:34:13 PDT 2007
Pragma wrote:
> Fraser wrote:
>> Thanks for the ideas! Unfortunately, it doesn't seem to be working
>> (either way). Here's the complete code I tried:
>>
>> --------------------
>> import tango.io.Stdout;
>>
>> char[] ctfe_itoa(uint value)
>> {
>> if (value < 10) return "0123456789"[value .. value+1];
>> return ctfe_itoa(value / 10) ~ ctfe_itoa(value % 10);
>> }
>>
>> uint Counter(){
>> return 1;
>> }
>>
>> uint Counter(in uint value){
>> return value+1;
>> }
>>
>> uint nextID()
>> {
>> const auto first = Counter();
>> const auto second = Counter(first);
>> const auto third = Counter(second);
>> return third;
>> }
>>
>> template Foo(char[] name)
>> { const char[] text = "const char[] " ~ name ~ " = \"Name: " ~
>> name ~ ", ID: " ~ ctfe_itoa(nextID()) ~ "\n\";";
>> }
>>
>> mixin(Foo!("a").text);
>> mixin(Foo!("b").text);
>> mixin(Foo!("c").text);
>> mixin(Foo!("d").text);
>> mixin(Foo!("e").text);
>> mixin(Foo!("f").text);
>>
>> int main(char[][] args)
>> {
>> Stdout(a)(b)(c)(d)(e)(f);
>> return 0;
>> }
>> --------------------
>>
>> The result was:
>> Name: a, ID: 3
>> Name: b, ID: 3
>> Name: c, ID: 3
>> Name: d, ID: 3
>> Name: e, ID: 3
>> Name: f, ID: 3
>>
>> A similar thing happened with the template example.
>
> You need to prime your sequence with the zero counter value, and then
> keep passing a template instance around to continue to count up:
>
> template StartCounter(){
> const uint next = 0;
> }
>
> template Foo(char[] name,alias counter)
> {
> const char[] text = "const char[] " ~ name ~ " = \"Name: " ~ name ~
> ", ID: " ~ ctfe_itoa(counter.next) ~ "\n\";";
> const uint next = counter.next + 1;
> }
>
> alias Foo!("a",StartCounter!()) foo_a;
> alias Foo!("b",foo_a) foo_b;
> alias Foo!("c",foo_b) foo_c;
> alias Foo!("d",foo_c) foo_d; // <-- note how we feed the previous
> template back into the next template instance
> alias Foo!("e",foo_d) foo_e;
>
> mixin(foo_a.text);
> mixin(foo_b.text);
> mixin(foo_c.text);
> mixin(foo_d.text);
> mixin(foo_e.text);
>
The problem with that (I'm assuming) is that if he could arrange it so
that the generated code contained a nice ordered sequence of template
names in increasing order, then that means he could also just as easily
generate IDs themselves without going through all the template hoops.
--bb
More information about the Digitalmars-d
mailing list