digitalmars.D.learn - template const to compile-time function
- Carlos Santander (16/16) Sep 04 2007 Currently I have this template:
- Daniel Keep (14/34) Sep 04 2007 string seqWrapper(string property, string seq, string array)
- Carlos Santander (6/23) Sep 04 2007 I was thinking about code-generation bloat, but I guess I'd have to meas...
- Jari-Matti =?ISO-8859-1?Q?M=E4kel=E4?= (4/6) Sep 05 2007 If you only use the wrapper function in CTFE, try moving it to a separat...
- Carlos Santander (4/12) Sep 05 2007 Nice tip. Thanks.
Currently I have this template: template seqWrapper (char[] property, alias seq, alias array) { const seqWrapper = typeof(array).stringof ~ " " ~ property ~ "()" "{" "if (" ~ array.stringof ~ ".length == 0)" " " ~ array.stringof ~ " = seqToArray (" ~ seq.stringof ~ ");" "return " ~ array.stringof ~ ";" "}"; } Which is simply used like this: mixin (seqWrapper!("users", _list, _users)); And it works. But I was wondering if it was better to have it as a compile-time function, and if so, how it could be changed. I'm using D1.0, btw. -- Carlos Santander Bernal
Sep 04 2007
Carlos Santander wrote:Currently I have this template: template seqWrapper (char[] property, alias seq, alias array) { const seqWrapper = typeof(array).stringof ~ " " ~ property ~ "()" "{" "if (" ~ array.stringof ~ ".length == 0)" " " ~ array.stringof ~ " = seqToArray (" ~ seq.stringof ~ ");" "return " ~ array.stringof ~ ";" "}"; } Which is simply used like this: mixin (seqWrapper!("users", _list, _users)); And it works. But I was wondering if it was better to have it as a compile-time function, and if so, how it could be changed. I'm using D1.0, btw.string seqWrapper(string property, string seq, string array) { return `typeof(`~array~`) `~property~`() { if( (`~array~`).length == 0 ) `~array~` = seqToArray(`~seq~`); return `~array~`; }`; } mixin (seqWrapper("users","_list","_users")); Six of one, half-dozen of the other, really. Unless you need to do stuff involving loops or string processing, templates are quite sufficient. -- Daniel
Sep 04 2007
Daniel Keep escribió:string seqWrapper(string property, string seq, string array) { return `typeof(`~array~`) `~property~`() { if( (`~array~`).length == 0 ) `~array~` = seqToArray(`~seq~`); return `~array~`; }`; } mixin (seqWrapper("users","_list","_users"));I hadn't thought of that first line with typeof. Thanks.Six of one, half-dozen of the other, really. Unless you need to do stuff involving loops or string processing, templates are quite sufficient. -- DanielI was thinking about code-generation bloat, but I guess I'd have to measure that myself. -- Carlos Santander Bernal
Sep 04 2007
Carlos Santander wrote:I was thinking about code-generation bloat, but I guess I'd have to measure that myself.If you only use the wrapper function in CTFE, try moving it to a separate module and not linking it, just importing. That way no unnecessary code is generated to the final executable or object files.
Sep 05 2007
Jari-Matti Mäkelä escribió:Carlos Santander wrote:Nice tip. Thanks. -- Carlos Santander BernalI was thinking about code-generation bloat, but I guess I'd have to measure that myself.If you only use the wrapper function in CTFE, try moving it to a separate module and not linking it, just importing. That way no unnecessary code is generated to the final executable or object files.
Sep 05 2007