www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - isCallableCTFE trait to test whether an expression is callable during

reply Timothee Cour <thelastmammoth gmail.com> writes:
template isCallableCTFE(alias fun){
template isCallableCTFE_aux(alias T){
enum isCallableCTFE_aux=T;
}
enum isCallableCTFE=__traits(compiles,isCallableCTFE_aux!(fun()));
}

template isCallableCTFE2(fun...){
enum isCallableCTFE2=true;
}


unittest{
int fun1(){
return 1;
}
auto fun1_N(){
import std.array;
//would return Error: gc_malloc cannot be interpreted at compile time,
because it has no available source code due to a bug
return [1].array;
}
int fun2(int x){
return 1;
}
auto fun2_N(int x){
import std.array;
//same as fun1_N
return [1].array;
}

int a1;
enum a2=0;

static assert(!isCallableCTFE!(()=>a1));
static assert(isCallableCTFE!(()=>a2));

static assert(isCallableCTFE!fun1);
static assert(!isCallableCTFE!fun1_N);

static assert(isCallableCTFE!(()=>fun2(0)));
static assert(!isCallableCTFE!(()=>fun2_N(0)));
//NOTE:an alternate syntax which could be implemented would be: static
assert(!isCallableCTFE!(fun2_N,0)));
}
Jul 10 2013
parent reply "timotheecour" <timothee.cour2 gmail.com> writes:
On Thursday, 11 July 2013 at 02:17:13 UTC, Timothee Cour wrote:
 template isCallableCTFE(alias fun){
 template isCallableCTFE_aux(alias T){
 enum isCallableCTFE_aux=T;
 }
 enum 
 isCallableCTFE=__traits(compiles,isCallableCTFE_aux!(fun()));
 }

 template isCallableCTFE2(fun...){
 enum isCallableCTFE2=true;
 }


 unittest{
 int fun1(){
 return 1;
 }
 auto fun1_N(){
 import std.array;
 //would return Error: gc_malloc cannot be interpreted at 
 compile time,
 because it has no available source code due to a bug
 return [1].array;
 }
 int fun2(int x){
 return 1;
 }
 auto fun2_N(int x){
 import std.array;
 //same as fun1_N
 return [1].array;
 }

 int a1;
 enum a2=0;

 static assert(!isCallableCTFE!(()=>a1));
 static assert(isCallableCTFE!(()=>a2));

 static assert(isCallableCTFE!fun1);
 static assert(!isCallableCTFE!fun1_N);

 static assert(isCallableCTFE!(()=>fun2(0)));
 static assert(!isCallableCTFE!(()=>fun2_N(0)));
 //NOTE:an alternate syntax which could be implemented would be: 
 static
 assert(!isCallableCTFE!(fun2_N,0)));
 }

can we add this to std.traits? it allows (among other things) to write unittests for CTFE, etc.
Jul 10 2013
parent reply "Kenji Hara" <k.hara.pg gmail.com> writes:
On Thursday, 11 July 2013 at 03:10:38 UTC, timotheecour wrote:
 On Thursday, 11 July 2013 at 02:17:13 UTC, Timothee Cour wrote:

[snip]
 can we add this to std.traits?
 it allows (among other things) to write unittests for CTFE, etc.

Phobos has an internal helper function for testing CTFEable. https://github.com/D-Programming-Language/phobos/blob/master/std/exception.d#L1322 Kenji Hara
Jul 10 2013
parent "timotheecour" <timothee.cour2 gmail.com> writes:
On Thursday, 11 July 2013 at 03:29:13 UTC, Kenji Hara wrote:
 On Thursday, 11 July 2013 at 03:10:38 UTC, timotheecour wrote:
 On Thursday, 11 July 2013 at 02:17:13 UTC, Timothee Cour wrote:

[snip]
 can we add this to std.traits?
 it allows (among other things) to write unittests for CTFE, 
 etc.

Phobos has an internal helper function for testing CTFEable. https://github.com/D-Programming-Language/phobos/blob/master/std/exception.d#L1322 Kenji Hara

Mine is more flexible. The one you mention can only work in a static assert statement. We could replace it in terms of static assert(isCallableCTFE!dg) but not vice versa.
Jul 10 2013