Boost logo

Boost :

From: me22 (me22.ca_at_[hidden])
Date: 2006-06-04 21:44:09


On 6/4/06, Beman Dawes <bdawes_at_[hidden]> wrote:
> * Provision has been made for native endianness. Not implemented yet.
>
I've implemented it in the attached header and added the corresponding typedefs.

It currently memcpy's the bytes around. I don't know whether it would
be preferable to use BOOST_LITTLE_ENDIAN and call
(load|store)_(big|little)_endian instead.

> * More explicit names have been given to the forty-four typedefs. A
> careful explanation of the naming rationale has been added to the docs.
>
Much nicer, and different enough from stdint for big8_t to not look
immediately like a char.

I would also, as Eric suggests, prefer aligned_ as the prefix instead of just a.

> * I haven't looked at Scott McMurray's exact.hpp header yet, so that may
> kick off yet more changes to come.
>
It's basically just the native endian types, just in a different
interface. With those in yours, it's not terribly important. I would
like to keep a similar interface as a possibility and think it's
possible to do so without changing the current one at all (only adding
to it):
boost::endian< boost::big, boost::uint_t<24> > x;

Unfortunately, I haven't gotten any of my attempts at specialisation
to work. Here's what I consider the most promising failed attempt, in
the hopes that someone can spot the problem:
  template <endianness E, std::size_t n_bits, std::size_t n_bytes>
  class endian< E, boost::int_t<n_bits>, n_bytes >
    : integer_cover_operators< endian< E, boost::int_t<n_bits>, n_bytes >,
                               typename boost::int_t<n_bits>::least >
  {
      BOOST_STATIC_ASSERT( n_bits % CHAR_BIT == 0 );
    public:
      typedef typename boost::int_t<n_bits>::least value_type;
      endian() {}
      endian(value_type i) : value(i) {}
      operator value_type() { return value; }
    private:
      endian< E, value_type, n_bits/CHAR_BIT > value;
  };

  template <endianness E, std::size_t n_bits, std::size_t n_bytes>
  class endian< E, boost::uint_t<n_bits>, n_bytes >
    : integer_cover_operators< endian< E, boost::uint_t<n_bits>, n_bytes >,
                               typename boost::uint_t<n_bits>::least >
  {
      BOOST_STATIC_ASSERT( n_bits % CHAR_BIT == 0 );
    public:
      typedef typename boost::uint_t<n_bits>::least value_type;
      endian() {}
      endian(value_type i) : value(i) {}
      operator value_type() { return value; }
    private:
      endian< E, value_type, n_bits/CHAR_BIT > value;
  };

The other change I made to the header was to add STATIC_ASSERTs in the
various templates. I could see someone using endian<little, int, 3>,
which would be very confusing if they ever ported to a platform with
16-bit ints.

One other question: Will the library being using "bytes" as 8 bits or
as the same size as a char? ( I understand there are many people in
various C++ IRC channels with toasters that have 13-bit chars :P )

~ Scott




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