32 lines
888 B
D
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);
|
|
}
|
|
}
|