This is the std.typecons.Nullable.get() method:

@property ref inout(T) get() inout pure @safe
{
    enforce(!isNull);
    return _value;
}



And this is the std.exception.enforce() and bailOut():

T enforce(T, string file = __FILE__, size_t line = __LINE__)
    (T value, lazy const(char)[] msg = null) @safe pure
{
    if (!value) bailOut(file, line, msg);
    return value;
}

private void bailOut(string file, size_t line, in char[] msg) @safe pure
{
throw new Exception(msg ? msg.idup : "Enforcement failed", file, line);
}



What do you think about replacing the bailOut() with:


version (halting_enforce)
{
private void bailOut(string file, size_t line, in char[] msg) @safe pure nothrow
    {
        assert(0, msg ? msg : "Enforcement failed");
    }
}
else
{
private void bailOut(string file, size_t line, in char[] msg) @safe pure
    {
throw new Exception(msg ? msg.idup : "Enforcement failed", file, line);
    }
}


Even if this version is not documented in Phobos docs (because the inliner someday will be better), today it allows methods that must be fast like Nullable.get() to be inlined (but I have not tested this), regaining the lost performance.

Bye,
bearophile

Reply via email to