mirror of
https://github.com/boostorg/integer.git
synced 2025-07-23 01:07:15 +02:00
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>
|
||||
|
||||
<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>
|
||||
|
||||
<p>Revised October 1, 2001</p>
|
||||
<p>Revised May 14, 2002</p>
|
||||
|
||||
<p>© Copyright Daryle Walker 2001. Permission to copy, use,
|
||||
modify, sell and distribute this document is granted provided this
|
||||
|
@ -12,9 +12,13 @@
|
||||
|
||||
#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
|
||||
|
||||
#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
|
||||
#include <boost/pending/ct_if.hpp> // for boost::ct_if<>
|
||||
#endif
|
||||
|
||||
|
||||
namespace boost
|
||||
{
|
||||
@ -30,9 +34,22 @@ template < unsigned long Val, int Place = 0, int Index
|
||||
= std::numeric_limits<unsigned long>::digits >
|
||||
struct static_log2_helper_t;
|
||||
|
||||
#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
|
||||
|
||||
template < unsigned long Val, int Place >
|
||||
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
|
||||
template < unsigned long Val, int Place, int Index >
|
||||
struct static_log2_helper_t
|
||||
@ -50,7 +67,11 @@ private:
|
||||
: 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;
|
||||
#else
|
||||
typedef static_log2_helper_nopts_t<new_val, new_place, new_index> next_step_type;
|
||||
#endif
|
||||
|
||||
public:
|
||||
BOOST_STATIC_CONSTANT( int, value = next_step_type::value );
|
||||
@ -58,6 +79,8 @@ public:
|
||||
}; // boost::detail::static_log2_helper_t
|
||||
|
||||
// Non-recursive case
|
||||
#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
|
||||
|
||||
template < unsigned long Val, int Place >
|
||||
struct static_log2_helper_t< Val, Place, 1 >
|
||||
{
|
||||
@ -66,6 +89,33 @@ public:
|
||||
|
||||
}; // 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
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user