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 02:28:16 PDT 2013


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/823bffe1/attachment-0001.html>


More information about the Digitalmars-d mailing list