module ut.casting;
import numem.casting;

private class Test {
    T opCast(T)() {
        static if (is(T : int))
            return 42;
        else static if (is(T : void*))
            return reinterpret_cast!T(this);
        else static if (is(Test : T))
            return reinterpret_cast!T(this);
        else
            static assert(0, "Can't cast to type "~T.stringof~"!");
    }
}

@("reinterpret_cast: opCast")
unittest {
    import numem.lifetime;

    Test a = nogc_new!Test();
    assert(cast(int)a == 42);
    assert(cast(void*)a);
    assert(cast(Object)a);
}

@("const_cast: const to non-const")
unittest {
    const(char)* myString = "Hello, world!";
    char* myStringMut = const_cast!(char*)(myString);
    myString = const_cast!(const(char)*)(myStringMut);
}