On 04/20/2015 12:05 PM, Namespace wrote:

> I'm sorry if I annoy you

Not at all! :) Sorry for not responding earlier.

>, but I would really like to know how you would
> reuse already instantiated storage of an existing object.
>
> Example code:
> ----
> final class Foo {
>      uint id;
>
>      @nogc
>      this(uint id) {
>          this.id = id;
>      }
> }
>
> Foo f = new Foo(42);
> ----

Something like the following works. I chose to set the old object to null but it is not necessary:

final class Foo {
    uint id;

    @nogc
    this(uint id) {
        this.id = id;
    }
}

C reuse(C, T...)(ref C old, T ctorParams)
{
    import std.conv;
    import std.typetuple;

    enum objectSize = __traits(classInstanceSize, C);

    void* oldPlace = cast(void*)old;
    C newObject = emplace!C(oldPlace[0..objectSize], ctorParams);

    old = null;

    return newObject;
}

void main()
{
    Foo f = new Foo(42);

    auto f2 = f.reuse(43);

    assert(f is null);
    assert(f2.id == 43);
}

Ali

Reply via email to