nice library workaround for lack of version boolean operations, would be nice to have in phobos
Timothee Cour
thelastmammoth at gmail.com
Wed Jun 5 03:34:18 PDT 2013
Actually I can improve syntax a bit as follows:
user code:
----
void main(){
static if(versions.OSX&& versions.D_NoBoundsChecks || !versions.has!"assert)
writeln("special code");
}
----
(note the alternate syntax with 'has' to support special keyword versions
such as assert).
The only drawback is that I'd like to have instead:
static if(versions.OSX&& versions.D_NoBoundsChecks || !versions["assert"] )
any idea to support that?
library code:
---
//in std.compiler
enum versions=(){
struct versions_{
bool has(alias a)(){
mixin(`
version(`~a~`){
return true;
}
else
return false;
`);
}
alias has this;
auto opDispatch(string a)(){
mixin(`
version(`~a~`){
return true;
}
else
return false;
`);
}
}
return versions_.init;
}();
---
On Wed, Jun 5, 2013 at 2:28 AM, Timothee Cour <thelastmammoth at gmail.com>wrote:
> Just figured out we can do this. Could this be added to phobos?
>
> ----
> //in std.compiler (or std.traits?)
> template Version(alias V){
> mixin(`
> version(`~V~`){
> enum Version=true;
> }
> else
> enum Version=false;
> `);
> }
> ----
>
> usage:
>
> ----
> import std.compiler;
> void main(){
> static if(!Version!"assert")
> writeln("not assert");
>
> static if(Version!"OSX" && !Version!"D_NoBoundsChecks" ||
> !Version!"assert")
> {
> writeln("special code");
> }
> }
> ----
>
> without this, we have to resort to something ugly, not dry, error prone:
>
> ----
> //pollutes namespace, as we can't define version=temp inside a function
> version(OSX)
> {
> version(D_NoBoundsChecks)
> {
> }
> else
> {
> version=temp;//need to make sure temp doesn't clash with other version
> identifiers / symbols
> }
> }
> else
> {
> version(assert)
> {
> }
> else
> {
> version=temp;//NOT DRY: repeats temp
> }
> }
>
> void main()
> {
> version(assert)
> {
> }
> else
> {
> writeln("not assert");
> }
>
> version(temp) // here we use it
> {
> writeln("special code");
> }
> }
> ----
>
>
> Likewise, with debug:
> ----
> template Debug(alias V){
> import std.traits:isIntegral;
> static if(!isIntegral!(typeof(V))){
> mixin(`
> debug(`~V~`){
> enum Debug=true;
> }
> else
> enum Debug=false;
> `);
> }
> else{
> import std.conv:to;
> mixin(`
> debug(`~V.to!string~`){
> enum Debug=true;
> }
> else
> enum Debug=false;
> `);
> /+
> //NOTE:maybe a dmd bug but this didn't work
> debug(V)
> enum Debug=true;
> else
> enum Debug=false;
> +/
> }
> }
> ----
>
>
> usage:
> ----
> void main(){
> import std.compiler;
> static if(Debug!2){
> writeln("debug>=2");
> }
> static if(Debug!"foo"){
> writeln("debug=foo");
> }
> }
> ----
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puremagic.com/pipermail/digitalmars-d/attachments/20130605/780c0c5c/attachment.html>
More information about the Digitalmars-d
mailing list