forked from boostorg/integer
Implemented integer_log2 in terms of countl_zero from Boost.Core.
This allows to use compiler intrinsics and specialized hardware instructions to compute log2, which results in better performance. Also, added tests for the generic implementation using Boost.Multiprecision integers. Closes https://github.com/boostorg/integer/issues/31.
This commit is contained in:
@ -15,6 +15,11 @@
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#include "multiprecision_config.hpp"
|
||||
|
||||
#if !defined(DISABLE_MP_TESTS)
|
||||
#include <boost/multiprecision/cpp_int.hpp>
|
||||
#endif
|
||||
|
||||
// Macros to compact code
|
||||
#define PRIVATE_LB_TEST( v, e ) BOOST_TEST( ::boost::integer_log2((v)) == e )
|
||||
@ -29,7 +34,6 @@
|
||||
#define PRIVATE_LB_0_TEST PRIVATE_PRINT_LB( 0 )
|
||||
#endif
|
||||
|
||||
|
||||
// Main testing function
|
||||
int main()
|
||||
{
|
||||
@ -159,5 +163,25 @@ int main()
|
||||
PRIVATE_LB_TEST( ~boost::uint128_type(0u), 127 );
|
||||
#endif
|
||||
|
||||
#if !defined(DISABLE_MP_TESTS)
|
||||
PRIVATE_LB_TEST( boost::multiprecision::cpp_int(1), 0 );
|
||||
PRIVATE_LB_TEST( boost::multiprecision::cpp_int(2), 1 );
|
||||
PRIVATE_LB_TEST( boost::multiprecision::cpp_int(3), 1 );
|
||||
PRIVATE_LB_TEST( boost::multiprecision::cpp_int(65535), 15 );
|
||||
PRIVATE_LB_TEST( boost::multiprecision::cpp_int(65536), 16 );
|
||||
|
||||
PRIVATE_LB_TEST( boost::multiprecision::int1024_t(1), 0 );
|
||||
PRIVATE_LB_TEST( boost::multiprecision::int1024_t(2), 1 );
|
||||
PRIVATE_LB_TEST( boost::multiprecision::int1024_t(3), 1 );
|
||||
PRIVATE_LB_TEST( boost::multiprecision::int1024_t(65535), 15 );
|
||||
PRIVATE_LB_TEST( boost::multiprecision::int1024_t(65536), 16 );
|
||||
|
||||
PRIVATE_LB_TEST( boost::multiprecision::uint1024_t(1), 0 );
|
||||
PRIVATE_LB_TEST( boost::multiprecision::uint1024_t(2), 1 );
|
||||
PRIVATE_LB_TEST( boost::multiprecision::uint1024_t(3), 1 );
|
||||
PRIVATE_LB_TEST( boost::multiprecision::uint1024_t(65535), 15 );
|
||||
PRIVATE_LB_TEST( boost::multiprecision::uint1024_t(65536), 16 );
|
||||
#endif
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
Reference in New Issue
Block a user