On Friday, 5 January 2018 at 20:45:20 UTC, jmh530 wrote:
On Friday, 5 January 2018 at 19:44:38 UTC, Basile B. wrote:
[snip]
- Libraries that don't want their aggregates to reside on the
GC heap can use this, with a mixin. (note: although the
GCAllocator can still be used...)
Cool.
Not sure I'm following with your point with the mixin. A mixin
like below works fine, but it would be a little annoying to get
the constructors working. The only way I can think of is to
pass them as strings to the create function.
import std.experimental.allocator;
import std.experimental.allocator.mallocator;
class Foo
{
int a;
@disable new (size_t size){return null;}
@disable delete (void* p){}
}
string create(T, string name)()
{
import std.conv : to;
return T.stringof ~ " " ~ name ~ " = make!" ~ T.stringof ~
"(Mallocator.instance);\n" ~
"scope(exit) dispose(Mallocator.instance, " ~ name ~
");";
}
void main()
{
mixin(create!(Foo, "f"));
f.a = 1;
}
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);