|
Boost : |
Subject: Re: [boost] [endian] Project not maintained
From: Peter Dimov (lists_at_[hidden])
Date: 2016-04-04 11:35:59
Andrey Semashev wrote:
> IMHO, if you need something more than a byte swap then you need a
> different library.
You're just repeating what you said. My answer remains the same. You never
need a byte swap. What you need is always something else, to which a byte
swap is sometimes the answer. Specifically, what you need is to be able to
read or write integers or floats in non-native formats.
> Well, in some of the projects I work on we have something as simple as:
>
> void write_be32(std::uint32_t n, void* p);
> std::uint32_t read_be32(const void* p);
> // etc.
>
> template< typename T, std::size_t Size = sizeof(T) >
> struct big_endian;
>
> // Specializations for different values of Size
> template< typename T >
> struct big_endian< T, 4 >
> {
> static void write(T n, void* p)
> {
> write_be32(n, p);
> }
That's more or less what I have, too. Where do we disagree?
Note that
> void write_be32(std::uint32_t n, void* p);
needs not assume presence of uint32_t or a particular representation of n.
Given any integer n in any representation, it could still portably write a
big-endian 32 bit integer into p.
void write_be32( uint_least32_t n, unsigned char p[4] )
{
// I assume CHAR_BIT of 8 here
/* assert( n < 2^32 ); */
p[0] = ( n >> 24 ) & 0xFF;
p[1] = ( n >> 16 ) & 0xFF;
p[2] = ( n >> 8 ) & 0xFF;
p[3] = n & 0xFF;
}
This is, however, not what Boost.Endian does.
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk