Farid Zaripov wrote:
-----Original Message-----
From: Martin Sebor [mailto:[EMAIL PROTECTED] Sent: Monday, October 09, 2006 10:55 PM
To: [email protected]
Subject: Re: [PATCH] bitset.cc (STDCXX-297)


the bitset). Also, I think the code could be simplified as
follows:

 nbytes =   (((maxbits | (sizeof *bits * CHAR_BIT - 1)) >> 5)
          + (0 != (maxbits & (sizeof *bits * CHAR_BIT - 1)))) << 2;

With the magic 5 and 2 replaced by expressions parametrized on sizeof *bits, of course.

  How log2 can be calculated at compile time?

  5 is log2(sizeof (*bits) * CHAR_BIT)
  2 is log2(sizeof (*bits))

I suppose you could use some metaprogramming tricks but I wouldn't
recommend it for portability ;-)

  template <unsigned N>
  struct log2 {
      static const unsigned long value =
          1 < N ? 1 + log2<(N >> 1)>::value : 0;
  };

  template <>
  struct log2<0> { static const unsigned long value = 0; };

I would just hardcode it based on the size of the type. Something
simple like this (the same code is at the top of bitset.cpp) will
work:

  enum {
  #if 4 == _RWSTD_ULONG_SIZE
      log2_long_size = 2,
      log2_long_bits = 5
  #lif 8 == _RWSTD_ULONG_SIZE
      log2_long_size = 3,
      log2_long_bits = 6
  #else
      log2_long_size = 4,
      log2_long_bits = 7
  #endif
  };

Martin

Reply via email to