On Wednesday, 10 May 2017 at 14:03:58 UTC, Biotronic wrote:
As for making the code faster right now, could this be done
with mixin templates instead?
Something like:
import functions = llvm.functions.link;
import std.meta, std.traits;
template isCFunction(alias member)
{
static if (isFunction!(member) &&
(functionLinkage!(member) == "C" ||
functionLinkage!(member) == "Windows")) {
enum isCFunction = true;
} else {
enum isCFunction = false;
}
}
template CFunctions(alias scope_)
{
alias GetSymbol(string member) =
AliasSeq!(__traits(getMember, scope_, member));
alias CFunctions = Filter!(isCFunction,
staticMap!(GetSymbol, __traits(allMembers, scope_)));
}
mixin template declareStubsImpl(T...)
{
static if (T.length == 0) {
} else {
mixin("extern (C) typeof(T[0])* "~__traits(identifier,
T[0])~";");
mixin declareStubsImpl!(T[1..$]);
}
}
mixin template declareStubs(alias scope_)
{
mixin declareStubsImpl!(CFunctions!scope_);
}
mixin declareStubs!functions;
After testing this approach out, I couldn't even time it. Why?
Because the compiler pretty much immediately hits the (I think
fixed) recursive template expansion limit. The LLVM C API has too
many functions for this :/