On Friday, 5 January 2018 at 20:51:14 UTC, Basile B. wrote:

Yeah, i didn't explain correctly the mixin thing.
The mixin would be used to disable "new" and "delete", e.g

enum disableNewAndDelete = "@disable new (size_t size){return null;} @disable delete (void* p){}";

and then you mix it in the classes of the framework that doesn't want "new" and "delete" to be used:

    mixin(disableNewAndDelete);

It occurs to me that you can use this to disable unsafe features (pointer arithmetic, casting immutability and shared most notably). For instance, something like below as a rough sketch (I didn't check that it compiles)

struct Safe(T)
{
    import std.traits : isPointer, Unqual;

    T _data;
    alias _data this;

    @disable this();

    this(T x) { _data = x; }

    @property T data()
    {
        return _data;
    }

    @property void data(T x)
    {
        _data = x;
    }

    static if (isPointer!T)
    {
        @disable U opCast(U)()
            if (isPointer!U && U != void*)
        @disable T opBinary(string op)(T rhs)
        @disable T opUnary(string op)()
//also @disable opIndex, opDollar, opIndexUnary, opIndexAssign, ...
        //opIndexOpAssign
    }
    static if (isMutable!T)
    {
        @disable immutable(T) opCast(immutable(T))()
    }
    else
    {
        @disable Unqual!T opCast(Unqual!T)()
    }
    //add @disable for shared
}

Reply via email to