32 lines
888 B
D

module core.internal.lifetime;
void emplaceInitializer(T)(scope ref T chunk) nothrow pure @trusted
if (!is(T == const) && !is(T == immutable) && !is(T == inout))
{
import core.internal.traits : hasElaborateAssign;
static if (__traits(isZeroInit, T))
{
import core.stdc.string : memset;
memset(cast(void*) &chunk, 0, T.sizeof);
}
else static if (__traits(isScalar, T) || T.sizeof <= 16 && !hasElaborateAssign!T && __traits(compiles, (){ T chunk; chunk = T.init; }))
{
chunk = T.init;
}
else static if (__traits(isStaticArray, T))
{
// For static arrays there is no initializer symbol created. Instead, we emplace elements one-by-one.
foreach (i; 0 .. T.length)
{
emplaceInitializer(chunk[i]);
}
}
else
{
import core.stdc.string : memcpy;
const initializer = __traits(initSymbol, T);
memcpy(cast(void*)&chunk, initializer.ptr, initializer.length);
}
}