// helper for mangling tests with back references
module imports.testmangle;
public import core.demangle : demangle, demangleType;
// detect mangle version
private
{
    struct Detect;
    Detect* detectMangle(Detect*);
    void DetectTmpl(T)() {}
}
pragma(msg,detectMangle.mangleof);
static if(detectMangle.mangleof == "_D7imports10testmangle12detectMangleFPSQL3H6DetectZQ1e")
    enum { BackRefs = true, BackRefSymbols = true }
else static if(detectMangle.mangleof == "_D7imports10testmangle12detectMangleFPSQBlQBg6DetectZQq")
    enum { BackRefs = true, BackRefSymbols = false }
else static if(detectMangle.mangleof == "_D7imports10testmangle12detectMangleFPS7imports10testmangle6DetectZPS7imports10testmangle6Detect")
    enum { BackRefs = false, BackRefSymbols = false }
else
    static assert(false, "unknown mangling");
private enum tmplMangle = (DetectTmpl!int).mangleof;
pragma(msg,tmplMangle);
static if(tmplMangle[0..40] == "_D7imports10testmangle__T10DetectTmplTiZ")
    enum HasTemplateLength = false;
else static if(tmplMangle[0..42] == "_D7imports10testmangle18__T10DetectTmplTiZ")
    enum HasTemplateLength = true;
else
    static assert(false, "unknown mangling");
pragma(msg,BackRefs);
pragma(msg,BackRefSymbols);
static if (BackRefs)
{
    string tl(string s)() { return null; }
    string id(string s, string r, string r2 = null)() { return BackRefSymbols && r2 !is null ? r2 : r; }
}
else
{
    string tl(string s)() { return HasTemplateLength ? s : null; }
    string id(string s, string r, string r2 = null)() { return s; }
}
bool equalDemangle(string m1, string m2)
{
    auto dm1 = demangle(m1);
    auto dm2 = demangle(m2);
    return dm1 == dm2;
}
string unsignedToString(ulong x)
{
    string s;
    s ~= cast(char)('0' + (x % 10));
    x /= 10;
    while (x > 0)
    {
        s = cast(char)('0' + (x % 10)) ~ s;
        x /= 10;
    }
    return s;
}