reinterpret array
Dominikus Dittes Scherkl via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Tue Jan 13 09:09:31 PST 2015
Does the following construct hold water?
version(LittleEndian)
{
/// interpret an array of one type as an array of a different
type.
/// if the array has odd length, the highest elements are
/// not accessible, at worst an empty slice is returned
inout ref T[] arrayOf(T, V: U[])(inout ref V a)
pure @safe nothrow
if(isUnsigned!T && isUnsigned!U)
{
return (cast(T*)a.ptr)[0 .. a.length * U.sizeof / T.sizeof];
}
unittest
{
ubyte a[5] = { 1, 2, 3, 4, 5 };
auto b = a.arrayOf!uint;
assert(typeof(b) == uint[]);
assert(b.length == 1);
assert(b[0] == 0x04030201);
assert(&b[0] == &a[0]); // b is a slice of a
b[0] = 0x0a0b0c0d; // this will change a
assert(a == { 13, 12, 11, 10, 5 });
ushort c[2] = { 257, 512 };
auto d = c.arrayOf!ubyte;
assert(d.length == 4);
assert(d[0] == 1);
assert(d[1] == 1);
assert(d[2] == 0);
assert(d[3] == 2);
}
}
I assume taking a slice of a pointer uses the GC, so this cannot
be @nogc, am I right? And I assume it is @save, because if I
would increase the length of the returned value, the GC will
automatically re-allocate, but then of course the adress is no
more the same, yes?
More information about the Digitalmars-d-learn
mailing list