import std.stdio;
import core.stdc.stdlib;
/* ALLOCATION AND DEALLOCATION MECHANISMS */
T o_new(T, U...)(U args) if (is(T == class))
{
size_t sz = __traits(classInstanceSize, T);
void[] mem = calloc(sz, byte.sizeof)[0 .. sz];
if (mem.length < sz) return null;
auto ret = cast(T) mem.ptr;
(cast(byte[]) mem)[0 .. sz] = typeid(T).init[];
static if (is(typeof(ret.__ctor(args))))
ret.__ctor(args);
else
{
static assert(
args.length == 0 && !is(typeof(&T.__ctor)),
"No ctor with arguments " ~ U.stringof ~
" present for an object of type " ~ T.stringof
);
}
return ret;
}
void o_delete(T)(T val) if (is(T == class))
{
static if (is(typeof(val.__dtor())))
val.__dtor();
free(cast(void*) val);
}
class Foo
{
this() { writeln("ctor"); }
~this() { writeln("dtor"); }
}
void main()
{
/* mallocated */
Foo bar = o_new!Foo();
writeln("some program");
o_delete(bar);
}
aW1wb3J0IHN0ZC5zdGRpbzsKaW1wb3J0IGNvcmUuc3RkYy5zdGRsaWI7CgovKiBBTExPQ0FUSU9OIEFORCBERUFMTE9DQVRJT04gTUVDSEFOSVNNUyAqLwoKVCBvX25ldyhULCBVLi4uKShVIGFyZ3MpIGlmIChpcyhUID09IGNsYXNzKSkKewogICAgc2l6ZV90IHN6ICA9IF9fdHJhaXRzKGNsYXNzSW5zdGFuY2VTaXplLCBUKTsKICAgIHZvaWRbXSBtZW0gPSBjYWxsb2Moc3osIGJ5dGUuc2l6ZW9mKVswIC4uIHN6XTsKCiAgICBpZiAobWVtLmxlbmd0aCA8IHN6KSByZXR1cm4gbnVsbDsKCiAgICBhdXRvIHJldCA9IGNhc3QoVCkgbWVtLnB0cjsKICAgIChjYXN0KGJ5dGVbXSkgbWVtKVswIC4uIHN6XSA9IHR5cGVpZChUKS5pbml0W107CgogICAgc3RhdGljIGlmIChpcyh0eXBlb2YocmV0Ll9fY3RvcihhcmdzKSkpKQogICAgICAgIHJldC5fX2N0b3IoYXJncyk7CiAgICBlbHNlCiAgICB7CiAgICAgICAgc3RhdGljIGFzc2VydCgKICAgICAgICAgICAgYXJncy5sZW5ndGggPT0gMCAmJiAhaXModHlwZW9mKCZULl9fY3RvcikpLAogICAgICAgICAgICAiTm8gY3RvciB3aXRoIGFyZ3VtZW50cyAiIH4gVS5zdHJpbmdvZiB+CiAgICAgICAgICAgICIgcHJlc2VudCBmb3IgYW4gb2JqZWN0IG9mIHR5cGUgIiB+IFQuc3RyaW5nb2YKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiByZXQ7Cn0KCnZvaWQgb19kZWxldGUoVCkoVCB2YWwpIGlmIChpcyhUID09IGNsYXNzKSkKewogICAgc3RhdGljIGlmIChpcyh0eXBlb2YodmFsLl9fZHRvcigpKSkpCiAgICAgICAgdmFsLl9fZHRvcigpOwoKICAgIGZyZWUoY2FzdCh2b2lkKikgdmFsKTsKfQoKCmNsYXNzIEZvbwp7CiAgICAgdGhpcygpIHsgd3JpdGVsbigiY3RvciIpOyB9CiAgICB+dGhpcygpIHsgd3JpdGVsbigiZHRvciIpOyB9Cn0KCnZvaWQgbWFpbigpCnsKICAgIC8qIG1hbGxvY2F0ZWQgKi8KICAgIEZvbyBiYXIgPSBvX25ldyFGb28oKTsKICAgIHdyaXRlbG4oInNvbWUgcHJvZ3JhbSIpOwogICAgb19kZWxldGUoYmFyKTsKfQ==