eliminate - multiple declarations

Function eliminate

Destroys object and nullifies its reference. Does nothing if value is null.

void eliminate(T) (
  ref T value
)
if (is(T == class) || is(T == interface));

void eliminate(T) (
  ref T* value
)
if (is(T == struct));

Function eliminate

Destroys every element of the array and nullifies everything

void eliminate(T) (
  ref T[] values
)
if (__traits(compiles, eliminate(values[0])));

Function eliminate

Destroys every key (if needed) and value in the associative array, nullifies everything

void eliminate(T, S) (
  ref T[S] values
)
if (__traits(compiles, eliminate(values[S.init])));

Example

class A
{
    static int dtorCalls = 0;
    int i = 10;

    ~this()
    {
        dtorCalls++;
    }
}

A a = new A;
a.i = 25;

eliminate(a);
assert(a is null && A.dtorCalls == 1);
eliminate(a);
assert(a is null && A.dtorCalls == 1);
A.dtorCalls = 0;

A[][] as = [[new A, new A], [new A], [new A, new A]];
eliminate(as);
assert(as is null && A.dtorCalls == 5);
eliminate(as);
assert(as is null && A.dtorCalls == 5);
A.dtorCalls = 0;

A[int] amap1 = [1 : new A, 6 : new A];
eliminate(amap1);
assert(amap1 is null && A.dtorCalls == 2);
eliminate(amap1);
assert(amap1 is null && A.dtorCalls == 2);
A.dtorCalls = 0;

A[A] amap2 = [new A : new A, new A : new A];
eliminate(amap2);
assert(amap2 is null && A.dtorCalls == 4);
eliminate(amap2);
assert(amap2 is null && A.dtorCalls == 4);
A.dtorCalls = 0;