Boost logo

Boost :

Subject: Re: [boost] [boost::endian] Request for comments/interest
From: Tomas Puverle (tomas.puverle_at_[hidden])
Date: 2010-06-01 12:01:10


> >> struct Packet {
> >> internet::IpHeader ipHeader;
> >> internet::UdpHeader udpHeader;
> >> UserMessage userMessage;
> >> }; // Packet

I do see one problem with this - you have defined your struct with a specified
endianness.

However, if you wanted to send it to a different destination which requires a
different endianness, you would have to duplicate your data structure.

The more I think about it, the more it's clear to me that this represents an
example of the wrong separation of concerns (no flame intended - simply a
software engineering term):

In the typed approach, the endianness becomes the property of the message.

However, I think endianness should be the property of the destination, no?

> char buf[BIG_ENOUGH];
<snip>

Terry, I like your example as it does indeed seem to make simple things simple.

But other than my comment above, could you consider the following (simple)
scenario:

- read a matrix from disk and for the sake of argument, let's say it's in a
big-endian format
- read a number representing the number of its dimensions
- based on the number of elements, swap each element to the machine's
representation

Please note that this isn't based on any existing code I have and I just typed
it in, so I expect there are syntax errors :)

void * data = ...;
read(fh, data, size);

MatrixHeader * mh = static_cast<MatrixHeader*>(data);
std::size_t nDims = swap<big_to_machine>(mh.nDims);
std::size_t nElem = std::accumulate(
                         make_iterator<big_to_machine>(mh.dims),
                         make_iterator<big_to_machine>(mh.dims + nDims),
                         std::size_t(1), std::multiply<std::size_t>());

//this is the part I am most interested in how you'd solve using the typed
//approach. Ignore the potential alignment issue.
double * dataBeg = static_cast<unsigned char*>(data) + sizeof(mh),
         dataEnd = dataBeg + nElem;
swap_in_place<big_to_machine>(dataBeg, dataEnd);

//process dataBeg ...

I can't help but think that the typed approach will have to be O(N) in both
little and big-endian scenarios.

Tom


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk