Boost logo

Boost :

From: Ion Gaztañaga (igaztanaga_at_[hidden])
Date: 2007-11-21 11:42:23


Markus Schöpflin wrote:
> Hello,
>
> recently intrusive started failing on Tru64/CXX with the following errors:

I noticed this this morning so I've uploaded this patch to SVN that
activates specializations using enable_if. This seems to work on
msvc-7.1, msvc-8.0, intel-9.1, gcc-4.1 and gcc-3.4

Can you check if this solves the problem?

Thanks!

Ion

Index: C:/LocalSVN/boost/trunk/boost/intrusive/detail/utilities.hpp
===================================================================
--- C:/LocalSVN/boost/trunk/boost/intrusive/detail/utilities.hpp (revision 41240)
+++ C:/LocalSVN/boost/trunk/boost/intrusive/detail/utilities.hpp (working copy)
@@ -515,33 +515,35 @@
    return ((x & (x-1))!= 0) + floor_log2(x);
 }
 
-template<std::size_t N>
+template<class SizeType, std::size_t N>
+struct numbits_eq
+{
+ static const bool value = sizeof(SizeType)*CHAR_BIT == N;
+};
+
+template<class SizeType, class Enabler = void >
 struct sqrt2_pow_max;
 
-template<>
-struct sqrt2_pow_max<32>
+template <class SizeType>
+struct sqrt2_pow_max<SizeType, typename enable_if< numbits_eq<SizeType, 32> >::type>
 {
    static const boost::uint32_t value = 0xb504f334;
    static const std::size_t pow = 31;
 };
 
-#ifdef BOOST_HAS_LONG_LONG
-
-template<>
-struct sqrt2_pow_max<64>
+template <class SizeType>
+struct sqrt2_pow_max<SizeType, typename enable_if< numbits_eq<SizeType, 64> >::type>
 {
    static const boost::uint64_t value = 0xb504f333f9de6484ull;
    static const std::size_t pow = 63;
 };
 
-#endif
-
 // Returns floor(pow(sqrt(2), x * 2 + 1)).
 // Defined for X from 0 up to the number of bits in size_t minus 1.
 inline std::size_t sqrt2_pow_2xplus1 (std::size_t x)
 {
- const std::size_t value = (std::size_t)sqrt2_pow_max<sizeof(std::size_t)*CHAR_BIT>::value;
- const std::size_t pow = (std::size_t)sqrt2_pow_max<sizeof(std::size_t)*CHAR_BIT>::pow;
+ const std::size_t value = (std::size_t)sqrt2_pow_max<std::size_t>::value;
+ const std::size_t pow = (std::size_t)sqrt2_pow_max<std::size_t>::pow;
    return (value >> (pow - x)) + 1;
 }
 


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