On Thursday, 17 May 2012 at 04:16:10 UTC, Andrew Wiley wrote:
On Wed, May 16, 2012 at 11:07 PM, H. S. Teoh
<hst...@quickfur.ath.cx> wrote:
Do unions suffer from this problem? Could this prevent
alignment
problems:
short bytesToShort(ubyte[] b)
in { assert(b.length==2); }
body {
union U {
short val;
ubyte[2] b;
}
U u;
u.b[] = b[];
return u.val;
}
?
As I understand it, this should be fine because the compiler
will guarantee
that the union is aligned to the maximum alignment required by
one of its
members, which is the short. This is probably the safest
solution.
And what about the following code:
// This implementation is optimized for speed via swapping
endianness in-place
pure immutable(C)[] fixEndian(C, Endian blobEndian =
endian)(ubyte[] blob) if(is(CharTypeOf!C))
{
import std.bitmanip, std.system;
auto data = cast(C[]) blob;
static if(blobEndian != endian)
{
static assert(!is(typeof(C) == char)); // UTF-8 doesn't
have endianness
foreach(ref ch; data) ch = swapEndian(ch);
}
return cast(immutable) data;
}