On 7/16/11 3:39 AM, Jonathan M Davis wrote:
On Thursday 14 July 2011 06:27:47 Andrei Alexandrescu wrote:
On 7/14/11 5:51 AM, Regan Heath wrote:
That's my point. I need 8/16/32/64/128 bit versions and it really would
be better if there were general variants. My version are less than
optimal, but do use intrinsics where possible. Someone else can do a far
better job than I, and it really should be done once, by that person.
Surely we have the infrastructure for someone to add this to phobos? If
something this simple can't or won't be done, what hope do we have!?

I think we should have these functions in std.bitmanip:

T toBigEndian(T)(T val) if (isArithmetic!T || isSomeChar!T);
T toLittleEndian(T)(T val) if (isArithmetic!T || isSomeChar!T);
T bigEndianToNative(T)(T val) if (isArithmetic!T || isSomeChar!T);
T littleEndianToNative(T)(T val) if (isArithmetic!T || isSomeChar!T);

That means all characters, all integers, and all floating point numbers.
The implementations would opportunistically use intrinsics and other
specialized means.

The documentation should specify the relationship to htonl and ntohl.

If there's a need for converting endianness of larger buffers, we might add:

ubyte[] toBigEndian(ubyte[] val);
ubyte[] toLittleEndian(ubyte[] val);
ubyte[] bigEndianToNative(ubyte[] val);
ubyte[] littleEndianToNative(ubyte[] val);

They'd use std.algorithm.reverse internally as needed.

It's a sweet piece of work. Anyone have the time to prepare a pull request?

I decided to take a crack at it, and it seems to be going pretty well, except
that I can't seem to get the floating point values right. Somehow, when I
compare a floating point value with the same value except that it's had its
endianness swapped twice, they return true for is but false for ==, which
makes absolutely no sense to me. There's obviously either something that I
don't understand about floating point values (or the relationship between is
and ==) or a bug in dmd. It'd be one thing if I couldn't get the values to
reverse properly, but when they're equal according to is but not ==, I have no
idea how that could even be possible.

- Jonathan M Davis

Just paste the code here.

Andrei

Reply via email to