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