forked from boostorg/integer
Update from Daryle
[SVN r14187]
This commit is contained in:
@ -107,11 +107,12 @@ at compile-time) available.</p>
|
|||||||
<h2><a name="credits">Credits</a></h2>
|
<h2><a name="credits">Credits</a></h2>
|
||||||
|
|
||||||
<p>The author of the Boost binary logarithm class template is <a
|
<p>The author of the Boost binary logarithm class template is <a
|
||||||
href="../../../people/daryle_walker.html">Daryle Walker</a>.</p>
|
href="../../../people/daryle_walker.html">Daryle Walker</a>. Giovanni Bajo
|
||||||
|
added support for compilers without partial template specialization.</p>
|
||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
|
|
||||||
<p>Revised October 1, 2001</p>
|
<p>Revised May 14, 2002</p>
|
||||||
|
|
||||||
<p>© Copyright Daryle Walker 2001. Permission to copy, use,
|
<p>© Copyright Daryle Walker 2001. Permission to copy, use,
|
||||||
modify, sell and distribute this document is granted provided this
|
modify, sell and distribute this document is granted provided this
|
||||||
|
@ -12,9 +12,13 @@
|
|||||||
|
|
||||||
#include <boost/integer_fwd.hpp> // self include
|
#include <boost/integer_fwd.hpp> // self include
|
||||||
|
|
||||||
#include <boost/config.hpp> // for BOOST_STATIC_CONSTANT
|
#include <boost/config.hpp> // for BOOST_STATIC_CONSTANT, etc.
|
||||||
#include <boost/limits.hpp> // for std::numeric_limits
|
#include <boost/limits.hpp> // for std::numeric_limits
|
||||||
|
|
||||||
|
#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
|
||||||
|
#include <boost/pending/ct_if.hpp> // for boost::ct_if<>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
namespace boost
|
namespace boost
|
||||||
{
|
{
|
||||||
@ -30,9 +34,22 @@ template < unsigned long Val, int Place = 0, int Index
|
|||||||
= std::numeric_limits<unsigned long>::digits >
|
= std::numeric_limits<unsigned long>::digits >
|
||||||
struct static_log2_helper_t;
|
struct static_log2_helper_t;
|
||||||
|
|
||||||
|
#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
|
||||||
|
|
||||||
template < unsigned long Val, int Place >
|
template < unsigned long Val, int Place >
|
||||||
struct static_log2_helper_t< Val, Place, 1 >;
|
struct static_log2_helper_t< Val, Place, 1 >;
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
template < int Place >
|
||||||
|
struct static_log2_helper_final_step;
|
||||||
|
|
||||||
|
template < unsigned long Val, int Place = 0, int Index
|
||||||
|
= std::numeric_limits<unsigned long>::digits >
|
||||||
|
struct static_log2_helper_nopts_t;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
// Recursively build the logarithm by examining the upper bits
|
// Recursively build the logarithm by examining the upper bits
|
||||||
template < unsigned long Val, int Place, int Index >
|
template < unsigned long Val, int Place, int Index >
|
||||||
struct static_log2_helper_t
|
struct static_log2_helper_t
|
||||||
@ -50,7 +67,11 @@ private:
|
|||||||
: Place );
|
: Place );
|
||||||
BOOST_STATIC_CONSTANT( int, new_index = Index - half_place );
|
BOOST_STATIC_CONSTANT( int, new_index = Index - half_place );
|
||||||
|
|
||||||
|
#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
|
||||||
typedef static_log2_helper_t<new_val, new_place, new_index> next_step_type;
|
typedef static_log2_helper_t<new_val, new_place, new_index> next_step_type;
|
||||||
|
#else
|
||||||
|
typedef static_log2_helper_nopts_t<new_val, new_place, new_index> next_step_type;
|
||||||
|
#endif
|
||||||
|
|
||||||
public:
|
public:
|
||||||
BOOST_STATIC_CONSTANT( int, value = next_step_type::value );
|
BOOST_STATIC_CONSTANT( int, value = next_step_type::value );
|
||||||
@ -58,6 +79,8 @@ public:
|
|||||||
}; // boost::detail::static_log2_helper_t
|
}; // boost::detail::static_log2_helper_t
|
||||||
|
|
||||||
// Non-recursive case
|
// Non-recursive case
|
||||||
|
#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
|
||||||
|
|
||||||
template < unsigned long Val, int Place >
|
template < unsigned long Val, int Place >
|
||||||
struct static_log2_helper_t< Val, Place, 1 >
|
struct static_log2_helper_t< Val, Place, 1 >
|
||||||
{
|
{
|
||||||
@ -66,6 +89,33 @@ public:
|
|||||||
|
|
||||||
}; // boost::detail::static_log2_helper_t
|
}; // boost::detail::static_log2_helper_t
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
template < int Place >
|
||||||
|
struct static_log2_helper_final_step
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
BOOST_STATIC_CONSTANT( int, value = Place );
|
||||||
|
|
||||||
|
}; // boost::detail::static_log2_helper_final_step
|
||||||
|
|
||||||
|
template < unsigned long Val, int Place, int Index >
|
||||||
|
struct static_log2_helper_nopts_t
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
typedef static_log2_helper_t<Val, Place, Index> recursive_step_type;
|
||||||
|
typedef static_log2_helper_final_step<Place> final_step_type;
|
||||||
|
|
||||||
|
typedef typename ct_if<( Index != 1 ), recursive_step_type,
|
||||||
|
final_step_type>::type next_step_type;
|
||||||
|
|
||||||
|
public:
|
||||||
|
BOOST_STATIC_CONSTANT( int, value = next_step_type::value );
|
||||||
|
|
||||||
|
}; // boost::detail::static_log2_helper_nopts_t
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user