|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r57580 - in trunk: boost boost/integer libs/integer libs/integer/doc libs/integer/test
From: john_at_[hidden]
Date: 2009-11-11 13:57:26
Author: johnmaddock
Date: 2009-11-11 13:57:24 EST (Wed, 11 Nov 2009)
New Revision: 57580
URL: http://svn.boost.org/trac/boost/changeset/57580
Log:
Reverted Integer back to Release branch state - as per devel-list discussions.
Added:
trunk/libs/integer/test/Jamfile.v2
- copied unchanged from r57575, /branches/release/libs/integer/test/Jamfile.v2
Removed:
trunk/libs/integer/test/issue_2134.cpp
Properties modified:
trunk/boost/integer/ (props changed)
trunk/libs/integer/ (props changed)
Text files modified:
trunk/boost/integer.hpp | 383 ++--------------
trunk/boost/integer/integer_mask.hpp | 201 ++-------
trunk/boost/integer_fwd.hpp | 78 +--
trunk/boost/integer_traits.hpp | 81 ++
trunk/libs/integer/cstdint.htm | 2
trunk/libs/integer/doc/integer_mask.html | 209 --------
trunk/libs/integer/integer.htm | 391 ++---------------
trunk/libs/integer/integer_traits.html | 2
trunk/libs/integer/test/integer_mask_test.cpp | 228 ++++------
trunk/libs/integer/test/integer_test.cpp | 888 +++++++++++----------------------------
10 files changed, 620 insertions(+), 1843 deletions(-)
Modified: trunk/boost/integer.hpp
==============================================================================
--- trunk/boost/integer.hpp (original)
+++ trunk/boost/integer.hpp 2009-11-11 13:57:24 EST (Wed, 11 Nov 2009)
@@ -7,12 +7,6 @@
// See http://www.boost.org/libs/integer for documentation.
// Revision History
-// 16 Jul 08 Added MPL-compatible variants of the minimum-size and value-
-// based integer templates. (Daryle Walker)
-// 15 Jul 08 Added exact-integer templates; added MPL-compatible variant of
-// processor-optimized integer template. (Daryle Walker)
-// 14 Jul 08 Added extended-integer support. (Daryle Walker)
-// 13 Jul 08 Redid implmentation. (Daryle Walker)
// 22 Sep 01 Added value-based integer templates. (Daryle Walker)
// 01 Apr 01 Modified to use new <boost/limits.hpp> header. (John Maddock)
// 30 Jul 00 Add typename syntax fix (Jens Maurer)
@@ -23,357 +17,108 @@
#include <boost/integer_fwd.hpp> // self include
-#include <boost/config.hpp> // for BOOST_STATIC_CONSTANT, etc.
-#include <boost/cstdint.hpp> // for boost::uintmax_t, intmax_t
-#include <boost/integer_traits.hpp> // for boost::integer_traits
-#include <boost/limits.hpp> // for std::numeric_limits
-#include <boost/utility/enable_if.hpp> // for boost::enable_if_c
-
-#include <boost/detail/extended_integer.hpp> // for BOOST_HAS_XINT, etc.
-
-#include <climits> // for UCHAR_MAX, USHRT_MAX, UINT_MAX, ULONG_MAX, etc.
+#include <boost/integer_traits.hpp> // for boost::integer_traits
+#include <boost/limits.hpp> // for std::numeric_limits
namespace boost
{
- // integer template mapping a type to its processor-optimized analog -----//
-
- // Some types can be handled better by the processor than others. This
- // template metafunction should map various built-in integral types to
- // the processor's perferred type for the given type's value range
- template < typename BaseInt >
- struct fast_integral
- {
- typedef BaseInt type;
- };
-
- // Platform-specific specializations should go here.
+ // Helper templates ------------------------------------------------------//
// fast integers from least integers
// int_fast_t<> works correctly for unsigned too, in spite of the name.
template< typename LeastInt >
- struct int_fast_t { typedef typename fast_integral<LeastInt>::type fast; };
+ struct int_fast_t { typedef LeastInt fast; }; // imps may specialize
-namespace detail
-{
-
- // Helper templates ------------------------------------------------------//
+ // convert category to type
+ template< int Category > struct int_least_helper {}; // default is empty
- // convert integer category to type ; default is empty
- template< int Rank, typename Signedness > struct int_least_helper {};
-
- // specializatons: 1=(unsigned) __int64/long long, 2=(unsigned) long,
- // 3=unsigned/int, 4=(unsigned) short, 5=(un)signed char
- // no specializations for 0: requests for a type > (unsigned) (long) long are
- // in error
-#if BOOST_HAS_XINT
- template<> struct int_least_helper<1, signed> { typedef xint_t least; };
- template<> struct int_least_helper<1, unsigned> { typedef uxint_t least; };
-#endif
- template<> struct int_least_helper<2, signed> { typedef long least; };
- template<> struct int_least_helper<2, unsigned>
- { typedef unsigned long least; };
- template<> struct int_least_helper<3, signed> { typedef int least; };
- template<> struct int_least_helper<3, unsigned>
- { typedef unsigned int least; };
- template<> struct int_least_helper<4, signed> { typedef short least; };
- template<> struct int_least_helper<4, unsigned>
- { typedef unsigned short least; };
- template<> struct int_least_helper<5, signed> { typedef signed char least; };
- template<> struct int_least_helper<5, unsigned>
- { typedef unsigned char least; };
-
- // category bounds
- enum
- {
-#if BOOST_HAS_XINT
- lowest_integral_rank = 1,
-#else
- lowest_integral_rank = 2,
-#endif
- highest_integral_rank = 5
- };
-
- // map a bit count to a category
- template < int BitsIncludingSign >
- struct int_rank_helper
- {
- BOOST_STATIC_CONSTANT( int, mantissa = BitsIncludingSign - 1 );
-#if BOOST_HAS_XINT
- BOOST_STATIC_CONSTANT( int, extended_ = (mantissa <= std::numeric_limits<
- xint_t >::digits) );
-#else
- BOOST_STATIC_CONSTANT( int, extended_ = 1 );
-#endif
- BOOST_STATIC_CONSTANT( int, rank = (BitsIncludingSign > 0) * (extended_ +
- (mantissa <= std::numeric_limits< long >::digits) +
- (mantissa <= std::numeric_limits< int >::digits) +
- (mantissa <= std::numeric_limits< short >::digits) +
- (mantissa <= std::numeric_limits< signed char >::digits)) );
- };
-
- template < int Bits >
- struct uint_rank_helper
- {
-#if BOOST_HAS_XINT
- BOOST_STATIC_CONSTANT( int, extended_ = (Bits <= std::numeric_limits<
- uxint_t >::digits) );
-#else
- BOOST_STATIC_CONSTANT( int, extended_ = 1 );
-#endif
- BOOST_STATIC_CONSTANT( int, rank = (Bits >= 0) * (extended_ +
- (Bits <= std::numeric_limits< unsigned long >::digits) +
- (Bits <= std::numeric_limits< unsigned int >::digits) +
- (Bits <= std::numeric_limits< unsigned short >::digits) +
- (Bits <= std::numeric_limits< unsigned char >::digits)) );
- };
-
- template < int BitsIncludingSign >
- struct int_exact_rank_helper { BOOST_STATIC_CONSTANT( int, rank = 0 ); };
- template < int Bits >
- struct uint_exact_rank_helper { BOOST_STATIC_CONSTANT( int, rank = 0 ); };
-
-#define BOOST_PRIVATE_INT_EXACT_BUILDER(Type, Rank) \
- template < > \
- struct int_exact_rank_helper<std::numeric_limits< Type >::digits + 1> \
- { BOOST_STATIC_CONSTANT( int, rank = Rank ); }
-#define BOOST_PRIVATE_UINT_EXACT_BUILDER(Type, Rank) \
- template < > \
- struct uint_exact_rank_helper<std::numeric_limits< Type >::digits> \
- { BOOST_STATIC_CONSTANT( int, rank = Rank ); }
-
-#if BOOST_HAS_XINT && (BOOST_UXINT_MAX > ULONG_MAX)
- BOOST_PRIVATE_INT_EXACT_BUILDER( xint_t, 1 );
- BOOST_PRIVATE_UINT_EXACT_BUILDER( uxint_t, 1 );
-#endif
-#if ULONG_MAX > UINT_MAX
- BOOST_PRIVATE_INT_EXACT_BUILDER( long, 2 );
- BOOST_PRIVATE_UINT_EXACT_BUILDER( unsigned long, 2 );
-#endif
-#if UINT_MAX > USHRT_MAX
- BOOST_PRIVATE_INT_EXACT_BUILDER( int, 3 );
- BOOST_PRIVATE_UINT_EXACT_BUILDER( unsigned, 3 );
-#endif
-#if USHRT_MAX > UCHAR_MAX
- BOOST_PRIVATE_INT_EXACT_BUILDER( short, 4 );
- BOOST_PRIVATE_UINT_EXACT_BUILDER( unsigned short, 4 );
-#endif
- BOOST_PRIVATE_INT_EXACT_BUILDER( signed char, 5 );
- BOOST_PRIVATE_UINT_EXACT_BUILDER( unsigned char, 5 );
-
-#undef BOOST_PRIVATE_INT_EXACT_BUILDER
-#undef BOOST_PRIVATE_UINT_EXACT_BUILDER
-
- // map an extreme value to a category
- template < intmax_t MaxValue >
- struct int_max_rank_helper
- {
-#if BOOST_HAS_XINT
- BOOST_STATIC_CONSTANT( int, extended_ = (MaxValue <=
- boost::integer_traits< xint_t >::const_max) );
-#else
- BOOST_STATIC_CONSTANT( int, extended_ = 1 );
-#endif
- BOOST_STATIC_CONSTANT( int, rank = (MaxValue > 0) * (extended_ +
- (MaxValue <= boost::integer_traits< long >::const_max) +
- (MaxValue <= boost::integer_traits< int >::const_max) +
- (MaxValue <= boost::integer_traits< short >::const_max) +
- (MaxValue <= boost::integer_traits< signed char >::const_max)) );
- };
-
- template < intmax_t MinValue >
- struct int_min_rank_helper
- {
-#if BOOST_HAS_XINT
- BOOST_STATIC_CONSTANT( int, extended_ = (MinValue >=
- boost::integer_traits< xint_t >::const_min) );
-#else
- BOOST_STATIC_CONSTANT( int, extended_ = 1 );
-#endif
- BOOST_STATIC_CONSTANT( int, rank = (MinValue < 0) * (extended_ +
- (MinValue >= boost::integer_traits< long >::const_min) +
- (MinValue >= boost::integer_traits< int >::const_min) +
- (MinValue >= boost::integer_traits< short >::const_min) +
- (MinValue >= boost::integer_traits< signed char >::const_min)) );
- };
-
- template < uintmax_t Value >
- struct uint_max_rank_helper
- {
-#if BOOST_HAS_XINT
- BOOST_STATIC_CONSTANT( int, extended_ = (Value <= boost::integer_traits<
- uxint_t >::const_max) );
-#else
- BOOST_STATIC_CONSTANT( int, extended_ = 1 );
-#endif
- BOOST_STATIC_CONSTANT( int, rank = extended_ +
- (Value <= boost::integer_traits< unsigned long >::const_max) +
- (Value <= boost::integer_traits< unsigned int >::const_max) +
- (Value <= boost::integer_traits< unsigned short >::const_max) +
- (Value <= boost::integer_traits< unsigned char >::const_max) );
- };
-
- // convert rank to type, Boost.MPL-style
- template < int Rank, typename Signedness, class Enable = void >
- struct integral_rank_to_type
- {
- BOOST_STATIC_CONSTANT( bool, is_specialized = false );
- // No "signed" nor "type" here
- };
-
- template < int Rank >
- struct integral_rank_to_type< Rank, signed, typename
- enable_if_c<(lowest_integral_rank <= Rank) && (Rank <=
- highest_integral_rank)>::type >
- {
- BOOST_STATIC_CONSTANT( bool, is_specialized = true );
- BOOST_STATIC_CONSTANT( bool, is_signed = true );
- typedef typename int_least_helper< Rank, signed >::least type;
- };
-
- template < int Rank >
- struct integral_rank_to_type< Rank, unsigned, typename
- enable_if_c<(lowest_integral_rank <= Rank) && (Rank <=
- highest_integral_rank)>::type >
- {
- BOOST_STATIC_CONSTANT( bool, is_specialized = true );
- BOOST_STATIC_CONSTANT( bool, is_signed = false );
- typedef typename int_least_helper< Rank, unsigned >::least type;
- };
-
-} // namespace detail
-
- // MPL-compatible integer-mapping class templates ------------------------//
-
- // minimum number of bits
- template < int Bits, typename Signedness >
- struct sized_integral
- {
- BOOST_STATIC_CONSTANT( bool, is_specialized = false );
- BOOST_STATIC_CONSTANT( int, bit_count = Bits );
- };
-
- template < int BitsIncludingSign >
- struct sized_integral< BitsIncludingSign, signed >
- : detail::integral_rank_to_type<
- detail::int_rank_helper<BitsIncludingSign>::rank, signed >
- {
- BOOST_STATIC_CONSTANT( int, bit_count = BitsIncludingSign );
- };
-
- template < int Bits >
- struct sized_integral< Bits, unsigned >
- : detail::integral_rank_to_type<
- detail::uint_rank_helper<Bits>::rank, unsigned >
- {
- BOOST_STATIC_CONSTANT( int, bit_count = Bits );
- };
-
- // exact number of bits
- template < int Bits, typename Signedness >
- struct exact_integral
- {
- BOOST_STATIC_CONSTANT( bool, is_specialized = false );
- BOOST_STATIC_CONSTANT( int, bit_count = Bits );
- };
-
- template < int BitsIncludingSign >
- struct exact_integral< BitsIncludingSign, signed >
- : detail::integral_rank_to_type<
- detail::int_exact_rank_helper<BitsIncludingSign>::rank, signed >
- {
- BOOST_STATIC_CONSTANT( int, bit_count = BitsIncludingSign );
- };
-
- template < int Bits >
- struct exact_integral< Bits, unsigned >
- : detail::integral_rank_to_type<
- detail::uint_exact_rank_helper<Bits>::rank, unsigned >
- {
- BOOST_STATIC_CONSTANT( int, bit_count = Bits );
- };
-
- // maximum supported (positive) value, signed
- template < intmax_t MaxValue >
- struct maximum_signed_integral
- : detail::integral_rank_to_type<
- detail::int_max_rank_helper<MaxValue>::rank, signed >
- {
- BOOST_STATIC_CONSTANT( intmax_t, bound = MaxValue );
- };
-
- // minimum supported (negative) value
- template < intmax_t MinValue >
- struct minimum_signed_integral
- : detail::integral_rank_to_type<
- detail::int_min_rank_helper<MinValue>::rank, signed >
- {
- BOOST_STATIC_CONSTANT( intmax_t, bound = MinValue );
- };
-
- // maximum supported (nonnegative) value, unsigned
- template < uintmax_t Value >
- struct maximum_unsigned_integral
- : detail::integral_rank_to_type<
- detail::uint_max_rank_helper<Value>::rank, unsigned >
- {
- BOOST_STATIC_CONSTANT( uintmax_t, bound = Value );
- };
+ // specializatons: 1=long, 2=int, 3=short, 4=signed char,
+ // 6=unsigned long, 7=unsigned int, 8=unsigned short, 9=unsigned char
+ // no specializations for 0 and 5: requests for a type > long are in error
+ template<> struct int_least_helper<1> { typedef long least; };
+ template<> struct int_least_helper<2> { typedef int least; };
+ template<> struct int_least_helper<3> { typedef short least; };
+ template<> struct int_least_helper<4> { typedef signed char least; };
+ template<> struct int_least_helper<6> { typedef unsigned long least; };
+ template<> struct int_least_helper<7> { typedef unsigned int least; };
+ template<> struct int_least_helper<8> { typedef unsigned short least; };
+ template<> struct int_least_helper<9> { typedef unsigned char least; };
// integer templates specifying number of bits ---------------------------//
// signed
- template< int Bits > // minimum bits (including sign) required
+ template< int Bits > // bits (including sign) required
struct int_t
{
- typedef typename sized_integral<Bits, signed>::type least;
- typedef typename int_fast_t<least>::fast fast;
- };
-
- template< int Bits > // exact bits (including sign) desired
- struct int_exact_t
- {
- typedef typename exact_integral<Bits, signed>::type exact;
+ typedef typename int_least_helper
+ <
+ (Bits-1 <= std::numeric_limits<long>::digits) +
+ (Bits-1 <= std::numeric_limits<int>::digits) +
+ (Bits-1 <= std::numeric_limits<short>::digits) +
+ (Bits-1 <= std::numeric_limits<signed char>::digits)
+ >::least least;
+ typedef typename int_fast_t<least>::fast fast;
};
// unsigned
- template< int Bits > // minimum bits required
+ template< int Bits > // bits required
struct uint_t
{
- typedef typename sized_integral<Bits, unsigned>::type least;
- typedef typename int_fast_t<least>::fast fast;
+ typedef typename int_least_helper
+ <
+ 5 +
+ (Bits <= std::numeric_limits<unsigned long>::digits) +
+ (Bits <= std::numeric_limits<unsigned int>::digits) +
+ (Bits <= std::numeric_limits<unsigned short>::digits) +
+ (Bits <= std::numeric_limits<unsigned char>::digits)
+ >::least least;
+ typedef typename int_fast_t<least>::fast fast;
// int_fast_t<> works correctly for unsigned too, in spite of the name.
};
- template< int Bits > // exact bits desired
- struct uint_exact_t
- {
- typedef typename exact_integral<Bits, unsigned>::type exact;
- };
-
// integer templates specifying extreme value ----------------------------//
// signed
- template< intmax_t MaxValue > // maximum value to require support
+ template< long MaxValue > // maximum value to require support
struct int_max_value_t
{
- typedef typename maximum_signed_integral<MaxValue>::type least;
- typedef typename int_fast_t<least>::fast fast;
+ typedef typename int_least_helper
+ <
+ (MaxValue <= integer_traits<long>::const_max) +
+ (MaxValue <= integer_traits<int>::const_max) +
+ (MaxValue <= integer_traits<short>::const_max) +
+ (MaxValue <= integer_traits<signed char>::const_max)
+ >::least least;
+ typedef typename int_fast_t<least>::fast fast;
};
- template< intmax_t MinValue > // minimum value to require support
+ template< long MinValue > // minimum value to require support
struct int_min_value_t
{
- typedef typename minimum_signed_integral<MinValue>::type least;
- typedef typename int_fast_t<least>::fast fast;
+ typedef typename int_least_helper
+ <
+ (MinValue >= integer_traits<long>::const_min) +
+ (MinValue >= integer_traits<int>::const_min) +
+ (MinValue >= integer_traits<short>::const_min) +
+ (MinValue >= integer_traits<signed char>::const_min)
+ >::least least;
+ typedef typename int_fast_t<least>::fast fast;
};
// unsigned
- template< uintmax_t Value > // maximum value to require support
+ template< unsigned long Value > // maximum value to require support
struct uint_value_t
{
- typedef typename maximum_unsigned_integral<Value>::type least;
- typedef typename int_fast_t<least>::fast fast;
+ typedef typename int_least_helper
+ <
+ 5 +
+ (Value <= integer_traits<unsigned long>::const_max) +
+ (Value <= integer_traits<unsigned int>::const_max) +
+ (Value <= integer_traits<unsigned short>::const_max) +
+ (Value <= integer_traits<unsigned char>::const_max)
+ >::least least;
+ typedef typename int_fast_t<least>::fast fast;
};
Modified: trunk/boost/integer/integer_mask.hpp
==============================================================================
--- trunk/boost/integer/integer_mask.hpp (original)
+++ trunk/boost/integer/integer_mask.hpp 2009-11-11 13:57:24 EST (Wed, 11 Nov 2009)
@@ -12,192 +12,81 @@
#include <boost/integer_fwd.hpp> // self include
-#include <boost/config.hpp> // for BOOST_STATIC_CONSTANT
-#include <boost/cstdint.hpp> // for boost::uintmax_t
-#include <boost/integer.hpp> // for boost::sized_integral
-#include <boost/limits.hpp> // for std::numeric_limits
-#include <boost/mpl/and.hpp> // for boost::mpl::and_
-#include <boost/mpl/bitwise.hpp> // for boost::mpl::bitor_, shift_left
-#include <boost/mpl/bool.hpp> // for boost::mpl::true_
-#include <boost/mpl/comparison.hpp> // for boost::mpl::greater_equal, etc.
-#include <boost/mpl/empty_base.hpp> // for boost::mpl::empty_base
-#include <boost/mpl/if.hpp> // for boost::mpl::if_
-#include <boost/mpl/int.hpp> // for boost::mpl::int_
-#include <boost/mpl/integral_c.hpp> // for boost::integral_c
-#include <boost/mpl/next_prior.hpp> // for boost::mpl::next, prior
-#include <boost/utility/enable_if.hpp> // for boost::enable_if
+#include <boost/config.hpp> // for BOOST_STATIC_CONSTANT
+#include <boost/integer.hpp> // for boost::uint_t
+#include <climits> // for UCHAR_MAX, etc.
#include <cstddef> // for std::size_t
+#include <boost/limits.hpp> // for std::numeric_limits
-namespace boost
-{
-namespace detail
-{
-
-// Helper templates --------------------------------------------------------//
-
-template < int Bits >
-struct hi_integer_mask_builder1
-{
- typedef boost::mpl::int_<Bits> bit_count_type;
-
- typedef typename boost::mpl::next<bit_count_type>::type
- mask_length_type;
- typedef boost::sized_integral<mask_length_type::value, unsigned>
- mask_type;
-
- typedef boost::mpl::integral_c<typename mask_type::type, 1> one_type;
- typedef boost::mpl::shift_left<one_type, bit_count_type> result_type;
-};
-
-template < int Bits >
-struct hi_integer_mask_builder2
-{
- typedef boost::mpl::int_<Bits> bit_count_type;
-
- typedef boost::mpl::greater_equal< bit_count_type, boost::mpl::int_<0> >
- lo_bound_type;
- typedef boost::mpl::less< bit_count_type,
- boost::mpl::int_<std::numeric_limits<boost::uintmax_t>::digits> >
- hi_bound_type;
- typedef boost::mpl::and_<lo_bound_type, hi_bound_type> count_valid_type;
-};
-
-template < int Bits, class Enable = void >
-struct hi_integer_mask_builder3
-{
- BOOST_STATIC_CONSTANT( bool, is_specialized = false );
-};
-
-template < int Bits >
-struct hi_integer_mask_builder3< Bits, typename boost::enable_if<typename
- hi_integer_mask_builder2<Bits>::count_valid_type>::type >
- : hi_integer_mask_builder1<Bits>::result_type
-{
- BOOST_STATIC_CONSTANT( bool, is_specialized = true );
-};
-
-template < int Bits >
-struct lo_integer_mask_builder1
-{
- typedef boost::mpl::int_<Bits> bit_count_type;
-
- typedef typename boost::mpl::prior<bit_count_type>::type
- shift_length_type;
- typedef boost::sized_integral<bit_count_type::value, unsigned>
- mask_type;
-
- typedef boost::mpl::integral_c<typename mask_type::type, 1> one_type;
- typedef boost::mpl::shift_left<one_type, shift_length_type>
- high_bit_type;
- typedef typename boost::mpl::prior<high_bit_type>::type low_bits_type;
- typedef boost::mpl::bitor_<high_bit_type, low_bits_type> result_type;
-};
-
-template < >
-struct lo_integer_mask_builder1< 0 >
-{
- // Let's not deal with negative interim values....
- typedef boost::mpl::integral_c<unsigned char, 0u> result_type;
-};
-template < int Bits >
-struct lo_integer_mask_builder2
-{
- typedef boost::mpl::int_<Bits> bit_count_type;
-
- typedef boost::mpl::greater_equal< bit_count_type, boost::mpl::int_<0> >
- lo_bound_type;
- typedef boost::mpl::less_equal< bit_count_type,
- boost::mpl::int_<std::numeric_limits<boost::uintmax_t>::digits> >
- hi_bound_type;
- typedef boost::mpl::and_<lo_bound_type, hi_bound_type> count_valid_type;
-};
-
-template < >
-struct lo_integer_mask_builder2< 0 >
-{
- typedef boost::mpl::true_ count_valid_type;
-};
-
-template < int Bits, class Enable = void >
-struct lo_integer_mask_builder3
-{
- BOOST_STATIC_CONSTANT( bool, is_specialized = false );
- // No MPL Integral Constant to inherit from
-};
-
-template < int Bits >
-struct lo_integer_mask_builder3< Bits, typename enable_if<typename
- lo_integer_mask_builder2<Bits>::count_valid_type>::type >
- : lo_integer_mask_builder1<Bits>::result_type
-{
- BOOST_STATIC_CONSTANT( bool, is_specialized = true );
-};
-
-} // namespace detail
-
-
-// MPL-compatible integer mask class templates -----------------------------//
-
-// Displaced single-bit mask, 1 << Offset, 0 <= Offset < BitLengthOf(uintmax_t)
-template < int Offset >
-struct integer_hi_mask
- : detail::hi_integer_mask_builder3<Offset>
-{
- BOOST_STATIC_CONSTANT( int, bit_offset = Offset );
-};
-
-// Lowest bit-group mask, 2**Length - 1, 0 <= Length <= BitLengthOf(uintmax_t)
-template < int Length >
-struct integer_lo_mask
- : detail::lo_integer_mask_builder3<Length>
+namespace boost
{
- BOOST_STATIC_CONSTANT( int, bit_count = Length );
-};
// Specified single-bit mask class declaration -----------------------------//
// (Lowest bit starts counting at 0.)
template < std::size_t Bit >
-class high_bit_mask_t
+struct high_bit_mask_t
{
- typedef integer_hi_mask<Bit> impl_type;
-
-public:
- typedef typename impl_type::value_type least;
- typedef typename int_fast_t<least>::fast fast;
+ typedef typename uint_t<(Bit + 1)>::least least;
+ typedef typename uint_t<(Bit + 1)>::fast fast;
- BOOST_STATIC_CONSTANT( least, high_bit = impl_type::value );
- BOOST_STATIC_CONSTANT( fast, high_bit_fast = impl_type::value );
+ BOOST_STATIC_CONSTANT( least, high_bit = (least( 1u ) << Bit) );
+ BOOST_STATIC_CONSTANT( fast, high_bit_fast = (fast( 1u ) << Bit) );
- BOOST_STATIC_CONSTANT( std::size_t, bit_position = impl_type::bit_offset );
+ BOOST_STATIC_CONSTANT( std::size_t, bit_position = Bit );
}; // boost::high_bit_mask_t
// Specified bit-block mask class declaration ------------------------------//
// Makes masks for the lowest N bits
+// (Specializations are needed when N fills up a type.)
template < std::size_t Bits >
-class low_bits_mask_t
+struct low_bits_mask_t
{
- typedef integer_lo_mask<Bits> impl_type;
+ typedef typename uint_t<Bits>::least least;
+ typedef typename uint_t<Bits>::fast fast;
-public:
- typedef typename impl_type::value_type least;
- typedef typename int_fast_t<least>::fast fast;
+ BOOST_STATIC_CONSTANT( least, sig_bits = (~( ~(least( 0u )) << Bits )) );
+ BOOST_STATIC_CONSTANT( fast, sig_bits_fast = fast(sig_bits) );
- BOOST_STATIC_CONSTANT( least, sig_bits = impl_type::value );
- BOOST_STATIC_CONSTANT( fast, sig_bits_fast = impl_type::value );
-
- BOOST_STATIC_CONSTANT( std::size_t, bit_count = impl_type::bit_count );
+ BOOST_STATIC_CONSTANT( std::size_t, bit_count = Bits );
}; // boost::low_bits_mask_t
+#define BOOST_LOW_BITS_MASK_SPECIALIZE( Type ) \
+ template < > struct low_bits_mask_t< std::numeric_limits<Type>::digits > { \
+ typedef std::numeric_limits<Type> limits_type; \
+ typedef uint_t<limits_type::digits>::least least; \
+ typedef uint_t<limits_type::digits>::fast fast; \
+ BOOST_STATIC_CONSTANT( least, sig_bits = (~( least(0u) )) ); \
+ BOOST_STATIC_CONSTANT( fast, sig_bits_fast = fast(sig_bits) ); \
+ BOOST_STATIC_CONSTANT( std::size_t, bit_count = limits_type::digits ); \
+ }
+
+BOOST_LOW_BITS_MASK_SPECIALIZE( unsigned char );
+
+#if USHRT_MAX > UCHAR_MAX
+BOOST_LOW_BITS_MASK_SPECIALIZE( unsigned short );
+#endif
+
+#if UINT_MAX > USHRT_MAX
+BOOST_LOW_BITS_MASK_SPECIALIZE( unsigned int );
+#endif
+
+#if ULONG_MAX > UINT_MAX
+BOOST_LOW_BITS_MASK_SPECIALIZE( unsigned long );
+#endif
+
+#undef BOOST_LOW_BITS_MASK_SPECIALIZE
+
+
} // namespace boost
Modified: trunk/boost/integer_fwd.hpp
==============================================================================
--- trunk/boost/integer_fwd.hpp (original)
+++ trunk/boost/integer_fwd.hpp 2009-11-11 13:57:24 EST (Wed, 11 Nov 2009)
@@ -9,12 +9,11 @@
#ifndef BOOST_INTEGER_FWD_HPP
#define BOOST_INTEGER_FWD_HPP
+#include <climits> // for UCHAR_MAX, etc.
#include <cstddef> // for std::size_t
-#include <boost/config.hpp> // for BOOST_NO_INTRINSIC_WCHAR_T, etc.
-#include <boost/cstdint.hpp> // for boost::uintmax_t, intmax_t
-
-#include <boost/detail/extended_integer.hpp> // for BOOST_HAS_XINT, etc.
+#include <boost/config.hpp> // for BOOST_NO_INTRINSIC_WCHAR_T
+#include <boost/limits.hpp> // for std::numeric_limits
namespace boost
@@ -25,13 +24,6 @@
// Only has typedefs or using statements, with #conditionals
-// ALERT: the forward declarations of items in <boost/integer.hpp> need items
-// from this header. That means that <boost/cstdint.hpp> cannot #include this
-// forwarding header, to avoid infinite recursion! One day, maybe
-// boost::uintmax_t and boost::intmax_t could be segregated into their own
-// header file (which can't #include this header), <boost/integer.hpp> will use
-// that header, and <boost/cstdint.hpp> could refer to <boost/integer.hpp>.
-
// From <boost/integer_traits.hpp> -----------------------------------------//
@@ -73,73 +65,61 @@
template < >
class integer_traits< unsigned long >;
-#if !defined(BOOST_NO_INTEGRAL_INT64_T) && !defined(BOOST_NO_INT64_T) && BOOST_HAS_XINT
+#ifdef ULLONG_MAX
template < >
- class integer_traits< ::boost::detail::xint_t >;
+ class integer_traits< ::boost::long_long_type>;
template < >
- class integer_traits< ::boost::detail::uxint_t >;
+ class integer_traits< ::boost::ulong_long_type >;
#endif
// From <boost/integer.hpp> ------------------------------------------------//
-template < typename BaseInt >
- struct fast_integral;
-
template < typename LeastInt >
struct int_fast_t;
-template < int Bits, typename Signedness >
- struct sized_integral;
-
-template < int Bits, typename Signedness >
- struct exact_integral;
-
-template < intmax_t MaxValue >
- struct maximum_signed_integral;
-
-template < intmax_t MinValue >
- struct minimum_signed_integral;
-
-template < uintmax_t Value >
- struct maximum_unsigned_integral;
-
template< int Bits >
struct int_t;
template< int Bits >
- struct int_exact_t;
-
-template< int Bits >
struct uint_t;
-template< int Bits >
- struct uint_exact_t;
-
-template< intmax_t MaxValue >
+template< long MaxValue >
struct int_max_value_t;
-template< intmax_t MinValue >
+template< long MinValue >
struct int_min_value_t;
-template< uintmax_t Value >
+template< unsigned long Value >
struct uint_value_t;
// From <boost/integer/integer_mask.hpp> -----------------------------------//
-template < int Offset >
- struct integer_hi_mask;
-
-template < int Length >
- struct integer_lo_mask;
-
template < std::size_t Bit >
- class high_bit_mask_t;
+ struct high_bit_mask_t;
template < std::size_t Bits >
- class low_bits_mask_t;
+ struct low_bits_mask_t;
+
+template < >
+ struct low_bits_mask_t< ::std::numeric_limits<unsigned char>::digits >;
+
+#if USHRT_MAX > UCHAR_MAX
+template < >
+ struct low_bits_mask_t< ::std::numeric_limits<unsigned short>::digits >;
+#endif
+
+#if UINT_MAX > USHRT_MAX
+template < >
+ struct low_bits_mask_t< ::std::numeric_limits<unsigned int>::digits >;
+#endif
+
+#if ULONG_MAX > UINT_MAX
+template < >
+ struct low_bits_mask_t< ::std::numeric_limits<unsigned long>::digits >;
+#endif
// From <boost/integer/static_log2.hpp> ------------------------------------//
Modified: trunk/boost/integer_traits.hpp
==============================================================================
--- trunk/boost/integer_traits.hpp (original)
+++ trunk/boost/integer_traits.hpp 2009-11-11 13:57:24 EST (Wed, 11 Nov 2009)
@@ -27,8 +27,6 @@
#include <wchar.h>
#endif
-#include <boost/detail/extended_integer.hpp> // for BOOST_HAS_XINT, etc.
-
namespace boost {
template<class T>
@@ -157,28 +155,77 @@
public detail::integer_traits_base<unsigned long, 0, ULONG_MAX>
{ };
-#if !defined(BOOST_NO_INTEGRAL_INT64_T) && !defined(BOOST_NO_INT64_T) && BOOST_HAS_XINT
+#if !defined(BOOST_NO_INTEGRAL_INT64_T) && !defined(BOOST_NO_INT64_T)
+#if defined(ULLONG_MAX) && defined(BOOST_HAS_LONG_LONG)
-#if defined(__GNUC__) && ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ > 3)))
-//
-// The following code emits warnings when built with -pedantic, and there appears
-// to be no other way of suppressing these warnings as use of __extension__ has no
-// effect, so declare the rest of this header a system header.
-//
-# pragma GCC system_header
-#endif
+template<>
+class integer_traits< ::boost::long_long_type>
+ : public std::numeric_limits< ::boost::long_long_type>,
+ public detail::integer_traits_base< ::boost::long_long_type, LLONG_MIN, LLONG_MAX>
+{ };
+
+template<>
+class integer_traits< ::boost::ulong_long_type>
+ : public std::numeric_limits< ::boost::ulong_long_type>,
+ public detail::integer_traits_base< ::boost::ulong_long_type, 0, ULLONG_MAX>
+{ };
+
+#elif defined(ULONG_LONG_MAX) && defined(BOOST_HAS_LONG_LONG)
+
+template<>
+class integer_traits< ::boost::long_long_type> : public std::numeric_limits< ::boost::long_long_type>, public detail::integer_traits_base< ::boost::long_long_type, LONG_LONG_MIN, LONG_LONG_MAX>{ };
+template<>
+class integer_traits< ::boost::ulong_long_type>
+ : public std::numeric_limits< ::boost::ulong_long_type>,
+ public detail::integer_traits_base< ::boost::ulong_long_type, 0, ULONG_LONG_MAX>
+{ };
+
+#elif defined(ULONGLONG_MAX) && defined(BOOST_HAS_LONG_LONG)
template<>
-class integer_traits< detail::xint_t >
- : public std::numeric_limits< detail::xint_t >,
- public detail::integer_traits_base< detail::xint_t, BOOST_XINT_MIN, BOOST_XINT_MAX >
+class integer_traits< ::boost::long_long_type>
+ : public std::numeric_limits< ::boost::long_long_type>,
+ public detail::integer_traits_base< ::boost::long_long_type, LONGLONG_MIN, LONGLONG_MAX>
{ };
template<>
-class integer_traits< detail::uxint_t >
- : public std::numeric_limits< detail::uxint_t >,
- public detail::integer_traits_base< detail::uxint_t, 0u, BOOST_UXINT_MAX >
+class integer_traits< ::boost::ulong_long_type>
+ : public std::numeric_limits< ::boost::ulong_long_type>,
+ public detail::integer_traits_base< ::boost::ulong_long_type, 0, ULONGLONG_MAX>
{ };
+
+#elif defined(_LLONG_MAX) && defined(_C2) && defined(BOOST_HAS_LONG_LONG)
+
+template<>
+class integer_traits< ::boost::long_long_type>
+ : public std::numeric_limits< ::boost::long_long_type>,
+ public detail::integer_traits_base< ::boost::long_long_type, -_LLONG_MAX - _C2, _LLONG_MAX>
+{ };
+
+template<>
+class integer_traits< ::boost::ulong_long_type>
+ : public std::numeric_limits< ::boost::ulong_long_type>,
+ public detail::integer_traits_base< ::boost::ulong_long_type, 0, _ULLONG_MAX>
+{ };
+
+#elif defined(BOOST_HAS_LONG_LONG)
+//
+// we have long long but no constants, this happens for example with gcc in -ansi mode,
+// we'll just have to work out the values for ourselves (assumes 2's compliment representation):
+//
+template<>
+class integer_traits< ::boost::long_long_type>
+ : public std::numeric_limits< ::boost::long_long_type>,
+ public detail::integer_traits_base< ::boost::long_long_type, (1LL << (sizeof(::boost::long_long_type) - 1)), ~(1LL << (sizeof(::boost::long_long_type) - 1))>
+{ };
+
+template<>
+class integer_traits< ::boost::ulong_long_type>
+ : public std::numeric_limits< ::boost::ulong_long_type>,
+ public detail::integer_traits_base< ::boost::ulong_long_type, 0, ~0uLL>
+{ };
+
+#endif
#endif
} // namespace boost
Modified: trunk/libs/integer/cstdint.htm
==============================================================================
--- trunk/libs/integer/cstdint.htm (original)
+++ trunk/libs/integer/cstdint.htm 2009-11-11 13:57:24 EST (Wed, 11 Nov 2009)
@@ -18,7 +18,7 @@
header <stdint.h>. The 64-bit types required by the C standard are not
required in the boost header, and may not be supplied in all implementations,
because <code>long long</code> is not [yet] included in the C++ standard.</p>
-<p>See cstdint_test.cpp for a test program.</p>
+<p>See cstdint_test.cpp for a test program.</p>
<h2>Exact-width integer types</h2>
<p>The typedef <code>int#_t</code>, with # replaced by the width, designates a
signed integer type of exactly # bits; <code>int8_t</code> denotes an 8-bit
Modified: trunk/libs/integer/doc/integer_mask.html
==============================================================================
--- trunk/libs/integer/doc/integer_mask.html (original)
+++ trunk/libs/integer/doc/integer_mask.html 2009-11-11 13:57:24 EST (Wed, 11 Nov 2009)
@@ -8,11 +8,7 @@
<h1><img src="../../../boost.png" alt="boost.png (6897 bytes)"
align="middle" width="277" height="86">Integer Bit Mask Templates</h1>
-<p>The class templates in <cite><a
-href="../../../boost/integer/integer_mask.hpp"><boost/integer/integer_mask.hpp></a></cite>
-provide bit masks for a certain bit position or a contiguous-bit pack of a
-certain size. The types of the masking constants come from the <a
-href="../integer.htm">integer type selection templates</a> header.</p>
+<p>The class templates in <cite><boost/integer/integer_mask.hpp></cite> provide bit masks for a certain bit position or a contiguous-bit pack of a certain size. The types of the masking constants come from the integer type selection templates header.</p>
<h2><a name="contents">Contents</a></h2>
@@ -21,7 +17,6 @@
<li>Synopsis</li>
<li>Single Bit-Mask Class Template</li>
<li>Group Bit-Mask Class Template</li>
- <li>MPL-Compatible Variants</li>
<li>Example</li>
<li>Demonstration Program</li>
<li>Rationale</li>
@@ -31,68 +26,39 @@
<h2><a name="synopsis">Synopsis</a></h2>
<blockquote><pre>
-#include <boost/integer_fwd.hpp> <i>// forwarding header</i>
-#include <boost/integer.hpp> <i>// for boost::int_fast_t</i>
-#include <cstddef> <i>// for std::size_t</i>
+#include <cstddef> <i>// for std::size_t</i>
namespace boost
{
-// MPL-compatible
-template < int Offset >
-struct integer_hi_mask
-{
- static bool const is_specialized = <em>implementation_supplied</em>;
- static int const bit_offset = Offset;
-
- typedef <em>implementation_supplied</em> type;
- typedef <em>implementation_supplied</em> value_type;
- static value_type const value = <em>implementation_supplied</em>;
- // There are other (optional) operations....
-};
-
-template < int Length >
-struct integer_lo_mask
-{
- static bool const is_specialized = <em>implementation_supplied</em>;
- static int const bit_count = Length;
-
- typedef <em>implementation_supplied</em> type;
- typedef <em>implementation_supplied</em> value_type;
- static value_type const value = <em>implementation_supplied</em>;
- // There are other (optional) operations....
-};
-
-// single
template < std::size_t Bit >
-class high_bit_mask_t
+struct high_bit_mask_t
{
-public:
- typedef typename integer_hi_mask<Bit>::value_type least;
- typedef int_fast_t<least>::fast fast;
+ typedef <em>implementation_supplied</em> least;
+ typedef <em>implementation_supplied</em> fast;
- static const least high_bit = integer_hi_mask<Bit>::value;
- static const fast high_bit_fast = high_bit;
+ static const least high_bit = <em>implementation_defined</em>;
+ static const fast high_bit_fast = <em>implementation_defined</em>;
static const std::size_t bit_position = Bit;
};
-// group
template < std::size_t Bits >
-class low_bits_mask_t
+struct low_bits_mask_t
{
-public:
- typedef typename integer_lo_mask<Bits>::value_type least;
- typedef int_fast_t<least>::fast fast;
+ typedef <em>implementation_supplied</em> least;
+ typedef <em>implementation_supplied</em> fast;
- static const least sig_bits = integer_lo_mask<Bits>::value;
- static const fast sig_bits_fast = sig_bits;
+ static const least sig_bits = <em>implementation_defined</em>;
+ static const fast sig_bits_fast = <em>implementation_defined</em>;
static const std::size_t bit_count = Bits;
};
+// Specializations for low_bits_mask_t exist for certain bit counts.
+
} // namespace boost
</pre></blockquote>
@@ -183,149 +149,16 @@
</tr>
</table>
-<h2><a name="mpl">MPL-Compatible Variants</a></h2>
-
-<p>The single and group bit-mask class templates have several drawbacks:</p>
-
-<ul>
- <li>You must know the valid bit-lengths in advance.</li>
- <li>Using an inappropriate parameter value results in a compiler
- diagnostic.</li>
- <li>The type names used are inconsistent with other transformations in
- Boost, like in MPL.</li>
- <li>The above two facts make use of the regular bit-mask class templates
- incompatible with template meta-programming techniques.</li>
-</ul>
-
-<p>The <code>integer_hi_mask</code> and <code>integer_lo_mask</code> class
-templates provide MPL-compatible alternatives. These alternatives have the
-form:</p>
-
-<blockquote><pre>
-template< int <var>Size</var> >
-struct <var>name</var>
-{
- static bool const is_specialized = <em>implementation_supplied</em>;
- static int const <var>switch_id</var> = <var>Size</var>;
-
- typedef <em>implementation_supplied</em> type;
- typedef <em>implementation_supplied</em> value_type;
- static value_type const value = <em>implementation_supplied</em>;
- // with other operations...
-};
-</pre></blockquote>
-
-<p>Only some of the members are always present. The presence of other members
-and operations is flagged by the (always-present) <code>is_specialized</code>.</p>
-
-<table border="2" cellpadding="5" align="center">
- <caption>Permanent Members of the MPL-Compatible Masking Class Template
- Types</caption>
- <tr>
- <th>Class Template Member</th>
- <th>Meaning</th>
- </tr>
- <tr>
- <td><code>is_specialized</code></td>
- <td>Flag indicating when a particular template class instantiation is a
- valid meta-function (<code>true</code>) or not (<code>false</code>).</td>
- </tr>
- <tr>
- <td><code><var>switch_id</var></code> (Actual name is template-specific.)</td>
- <td>The value of the main control parameter, accessible even if the
- template class instantiation is aliased.</td>
- </tr>
-</table>
-
-<p>The optional members are based from inheriting from a <a
-href="../../mpl/doc/refmanual/integral-constant.html">MPL-style Integral
-Constant</a> type, but only if <code>is_specialized</code> is <code>true</code>.</p>
-
-<table border="2" cellpadding="5" align="center">
- <caption>Optional Members of the MPL-Compatible Masking Types</caption>
- <tr>
- <th>Class Template Member</th>
- <th>Meaning</th>
- </tr>
- <tr>
- <td><code>value</code></td>
- <td>The actual bit mask.</td>
- </tr>
- <tr>
- <td><code>value_type</code></td>
- <td>The type of the bit mask value.</td>
- </tr>
- <tr>
- <td><code>type</code></td>
- <td>The Integral Constant</a> implementation type, which should be
- <code><a href="../../mpl/doc/refmanual/integral-c.html">boost::mpl::
- integral_c</a>< <var>value_type</var>, <var>value</var>
- ></code>.</td>
- </tr>
-</table>
-
-<p>The Integral Constant prototype also adds the following operations:</p>
-
-<table border="2" cellpadding="5" align="center">
- <caption>Optional Operations of the MPL-Compatible Masking Types</caption>
- <tr>
- <th>Operation (with <var>n</var> as a masking type)</th>
- <th>Meaning</th>
- </tr>
- <tr>
- <td><code>boost::mpl::next< n >::type</code></td>
- <td><code>boost::mpl::next< n::type >::type</code>, i.e.
- <code>boost::mpl::integral_c< n::value_type, n::value + 1
- ></code>.</td>
- </tr>
- <tr>
- <td><code>boost::mpl::prior< n >::type</code></td>
- <td><code>boost::mpl::prior< n::type >::type</code>, i.e.
- <code>boost::mpl::integral_c< n::value_type, n::value - 1
- ></code>.</td>
- </tr>
- <tr>
- <td><code>n::value_type const c = n();</code></td>
- <td><var>c</var> is set to <code>n::value</code>.</td>
- </tr>
-</table>
-
-<p>The specifics for each masking class template are:</p>
-
-<table border="2" cellpadding="5" align="center">
- <caption>Criteria for the MPL-Compatible Masking Types<br>
- (Everything besides the parameter ID is in name-space
- <code>boost</code> except where indicated.)</caption>
- <tr>
- <th>Class Template</th>
- <th>Parameter Member ID</th>
- <th>Classic Equivalent</th>
- <th>Value Type</th>
- <th>Value</th>
- <th>Valid Range</th>
- </tr>
- <tr>
- <td><code>integer_hi_mask</code></td>
- <td><code>bit_offset</code></td>
- <td><code>high_bit_mask_t</code></td>
- <td><code>sized_integral < bit_offset + 1, unsigned ></code></td>
- <td>2<sup><code>bit_offset</code></sup></td>
- <td><code>0 <= bit_offset < std::numeric_limits< uintmax_t >::digits</code></td>
- </tr>
- <tr>
- <td><code>integer_lo_mask</code></td>
- <td><code>bit_count</code></td>
- <td><code>low_bits_mask_t</code></td>
- <td><code>sized_integral < bit_count, unsigned ></code></td>
- <td>2<sup><code>bit_offset</code></sup> - 1</td>
- <td><code>0 <= bit_count <= std::numeric_limits< uintmax_t >::digits</code></td>
- </tr>
-</table>
+<p><strong>Implementation Note</strong><br>
+When <code>Bits</code> is the exact size of a built-in unsigned type,
+the implementation has to change to prevent undefined behavior.
+Therefore, there are specializations of <code>low_bits_mask_t</code> at
+those bit counts.</p>
<h2><a name="example">Example</a></h2>
<blockquote><pre>
-#include <boost/integer/integer_mask.hpp>
+#include <boost/integer/integer_mask.hpp>
//...
@@ -367,7 +200,7 @@
<hr>
-<p>Revised July 29, 2008</p>
+<p>Revised September 23, 2001</p>
<p>© Copyright Daryle Walker 2001. Use, modification, and distribution are
subject to the Boost Software License, Version 1.0. (See accompanying file <a
Modified: trunk/libs/integer/integer.htm
==============================================================================
--- trunk/libs/integer/integer.htm (original)
+++ trunk/libs/integer/integer.htm 2009-11-11 13:57:24 EST (Wed, 11 Nov 2009)
@@ -21,9 +21,8 @@
<ul>
<li>Contents</li>
<li>Synopsis</li>
- <li>Processor-Optimized Types</li>
+ <li>Easiest-to-Manipulate Types</li>
<li>Sized Types</li>
- <li>MPL-Compatible Variants</li>
<li>Example</li>
<li>Demonstration Program</li>
<li>Rationale</li>
@@ -33,145 +32,67 @@
<h2><a name="synopsis">Synopsis</a></h2>
-<blockquote><pre>
-#include <boost/integer_fwd.hpp> // forwarding header
-#include <boost/cstdint.hpp> // for boost::uintmax_t, intmax_t
-
-namespace boost
+<blockquote><pre>namespace boost
{
// fast integers from least integers
- template< typename BaseInt >
- struct fast_integral
- {
- typedef <em>implementation_supplied</em> type;
- };
-
template< typename LeastInt >
struct int_fast_t
{
- typedef typename fast_integral<LeastInt>::type fast;
- };
-
- // MPL-compatible
- template< int Bits, typename Signedness >
- struct sized_integral
- {
- static bool const is_specialized = <em>implementation_supplied</em>;
- static bool const is_signed = <em>implementation_supplied</em>;
- static int const bit_count = Bits;
-
- typedef <em>implementation_supplied</em> type;
- };
-
- template< int Bits, typename Signedness >
- struct exact_integral
- {
- static bool const is_specialized = <em>implementation_supplied</em>;
- static bool const is_signed = <em>implementation_supplied</em>;
- static int const bit_count = Bits;
-
- typedef <em>implementation_supplied</em> type;
- };
-
- template< intmax_t MaxValue >
- struct maximum_signed_integral
- {
- static bool const is_specialized = <em>implementation_supplied</em>;
- static bool const is_signed = true;
- static intmax_t const bound = MaxValue;
-
- typedef <em>implementation_supplied</em> type;
- };
-
- template< intmax_t MinValue >
- struct minimum_signed_integral
- {
- static bool const is_specialized = <em>implementation_supplied</em>;
- static bool const is_signed = true;
- static intmax_t const bound = MinValue;
-
- typedef <em>implementation_supplied</em> type;
- };
-
- template< uintmax_t Value >
- struct maximum_unsigned_integral
- {
- static bool const is_specialized = <em>implementation_supplied</em>;
- static bool const is_signed = false;
- static uintmax_t const bound = Value;
-
- typedef <em>implementation_supplied</em> type;
+ typedef <em>implementation_supplied</em> fast;
};
// signed
template< int Bits >
struct int_t
{
- typedef typename sized_integral<Bits, signed>::type least;
- typedef int_fast_t<least>::fast fast;
- };
-
- template< int Bits >
- struct int_exact_t
- {
- typedef typename exact_integral<Bits, signed>::type exact;
+ typedef <em>implementation_supplied</em> least;
+ typedef int_fast_t<least>::fast fast;
};
// unsigned
template< int Bits >
struct uint_t
{
- typedef typename sized_integral<Bits, unsigned>::type least;
- typedef int_fast_t<least>::fast fast;
- };
-
- template< int Bits >
- struct uint_exact_t
- {
- typedef typename exact_integral<Bits, unsigned>::type exact;
+ typedef <em>implementation_supplied</em> least;
+ typedef int_fast_t<least>::fast fast;
};
// signed
- template< intmax_t MaxValue >
+ template< long MaxValue >
struct int_max_value_t
{
- typedef typename maximum_signed_integral<MaxValue>::type least;
- typedef int_fast_t<least>::fast fast;
+ typedef <em>implementation_supplied</em> least;
+ typedef int_fast_t<least>::fast fast;
};
- template< intmax_t MinValue >
+ template< long MinValue >
struct int_min_value_t
{
- typedef typename minimum_signed_integral<MinValue>::type least;
- typedef int_fast_t<least>::fast fast;
+ typedef <em>implementation_supplied</em> least;
+ typedef int_fast_t<least>::fast fast;
};
// unsigned
- template< uintmax_t Value >
+ template< unsigned long Value >
struct uint_value_t
{
- typedef typename maximum_unsigned_integral<Value>::type least;
- typedef int_fast_t<least>::fast fast;
+ typedef <em>implementation_supplied</em> least;
+ typedef int_fast_t<least>::fast fast;
};
} // namespace boost
</pre></blockquote>
-<h2><a name="easy">Processor-Optimized Types</a></h2>
+<h2><a name="easy">Easiest-to-Manipulate Types</a></h2>
-<p>The <code>fast_integral</code> class template maps its input type to the
+<p>The <code>int_fast_t</code> class template maps its input type to the
next-largest type that the processor can manipulate the easiest, or to
itself if the input type is already an easy-to-manipulate type. For
instance, processing a bunch of <code>char</code> objects may go faster
if they were converted to <code>int</code> objects before processing.
-The input type, passed as the only template parameter, can be any built-in
-integral type besides <code>bool</code>. The output type is given as the class
-member <code>type</code>.</p>
-
-<p>The <code>int_fast_t</code> class template is the classic meta-function for
-this operation. Despite the name, it works for unsigned integral types just
-like it works for the signed integral types. The output type is given as the
-class member <code>fast</code>, defined to be the same as the corresponding
-result from the <code>fast_integral</code> meta-function.</p>
+The input type, passed as the only template parameter, must be a
+built-in integral type, except <code>bool</code>. Unsigned integral
+types can be used, as well as signed integral types, despite the name.
+The output type is given as the class member <code>fast</code>.</p>
<p><strong>Implementation Notes</strong><br>
By default, the output type is identical to the input type. Eventually,
@@ -183,286 +104,72 @@
<h2><a name="sized">Sized Types</a></h2>
-<p>The <code>int_t</code>, <code>int_exact_t</code>, <code>uint_t</code>,
-<code>uint_exact_t</code>, <code>int_max_value_t</code>,
-<code>int_min_value_t</code>, and <code>uint_value_t</code> class templates find
-the most appropriate built-in integral type for the given template parameter.
-This type is given by the class member <code>least</code> or <code>exact</code>.
-For the non-exact class templates, the easiest-to-manipulate version of that
-type is given by the class member <code>fast</code>. The following table
-describes each template's criteria.</p>
+<p>The <code>int_t</code>, <code>uint_t</code>,
+<code>int_max_value_t</code>, <code>int_min_value_t</code>, and
+<code>uint_value_t</code> class templates find the most appropiate
+built-in integral type for the given template parameter. This type is
+given by the class member <code>least</code>. The easiest-to-manipulate
+version of that type is given by the class member <code>fast</code>.
+The following table describes each template's criteria.</p>
-<table border="2" cellpadding="5">
+<table border="1" cellpadding="5">
<caption>Criteria for the Sized Type Class Templates</caption>
<tr>
- <th>Class Template (all in name-space <code>boost</code>)</th>
+ <th>Class Template</th>
<th>Template Parameter Mapping</th>
</tr>
<tr>
- <td><code>int_t</code></td>
+ <td><code>boost::int_t</code></td>
<td>The smallest built-in signed integral type with at least the
given number of bits, including the sign bit. The parameter
- <em>must</em> be a positive number. A compile-time error results if
+ should be a positive number. A compile-time error results if
the parameter is larger than the number of bits in a
- <code>boost::intmax_t</code>.</td>
- </tr>
- <tr>
- <td><code>int_exact_t</code></td>
- <td>The smallest built-in signed integral type with exactly the
- given number of bits, including the sign bit. A compile-time error
- results if no qualifying type exists.</td>
+ <code>long</code>.</td>
</tr>
<tr>
- <td><code>uint_t</code></td>
+ <td><code>boost::uint_t</code></td>
<td>The smallest built-in unsigned integral type with at least
- the given number of bits. The parameter <em>must</em> be a
- non-negative number. A compile-time error results if the parameter
- is larger than the number of bits in a
- <code>boost::uintmax_t</code>.</td>
- </tr>
- <tr>
- <td><code>uint_exact_t</code></td>
- <td>The smallest built-in unsigned integral type with exactly the given
- number of bits. A compile-time error results if no qualifying type
- exists.</td>
+ the given number of bits. The parameter should be a positive
+ number. A compile-time error results if the parameter is
+ larger than the number of bits in an <code>unsigned
+ long</code>.</td>
</tr>
<tr>
- <td><code>int_max_value_t</code></td>
+ <td><code>boost::int_max_value_t</code></td>
<td>The smallest built-in signed integral type that supports the
- given value as a maximum. The parameter <em>must</em> be a
+ given value as a maximum. The parameter should be a
positive number.</td>
</tr>
<tr>
- <td><code>int_min_value_t</code></td>
+ <td><code>boost::int_min_value_t</code></td>
<td>The smallest built-in signed integral type that supports the
- given value as a minimum. The parameter <em>must</em> be a
+ given value as a minimum. The parameter should be a
negative number.</td>
</tr>
<tr>
- <td><code>uint_value_t</code></td>
+ <td><code>boost::uint_value_t</code></td>
<td>The smallest built-in unsigned integral type that supports
the given value as a maximum. The parameter should be a
positive number.</td>
</tr>
</table>
-<h2><a name="mpl">MPL-Compatible Variants</a></h2>
-
-<p>The bit-length sized-type class templates have several drawbacks:</p>
-
-<ul>
- <li>You must know the valid bit-lengths in advance.</li>
- <li>There is no way to inspect the parameter used after a size-type template
- class is aliased.</li>
- <li>Using an inappropriate parameter value results in a compiler
- diagnostic.</li>
- <li>The type names used are inconsistent with other transformations in
- Boost, like in MPL.</li>
- <li>The above two facts make use of the size-type class templates
- incompatible with template meta-programming techniques.</li>
-</ul>
-
-<p>The <code>sized_integral</code>, <code>exact_integral</code>,
-<code>maximum_signed_integral</code>, <code>minimum_signed_integral</code>, and
-<code>maximum_unsigned_integral</code> class templates provide MPL-compatible
-alternatives. These alternatives generally have the form:</p>
-
-<blockquote><pre>
-template< <var>SwitchType</var> <var>SwitchValue</var>, typename Signedness >
-struct <var>name</var>
-{
- static bool const is_specialized = <em>implementation_supplied</em>;
- static bool const is_signed = <em>implementation_supplied</em>;
- static <var>SwitchType</var> const <var>switch_id</var> = <var>SwitchValue</var>;
-
- typedef <em>implementation_supplied</em> type;
-};
-</pre></blockquote>
-
-<p>Each member, if present, is defined by:</p>
-
-<table border="2" cellpadding="5">
- <caption>Members in MPL-Compatible Class Templates</caption>
- <tr>
- <th>Class Template Member</th>
- <th>When Defined</th>
- <th>Meaning</th>
- </tr>
- <tr>
- <td><code>is_specialized</code></td>
- <td>Always</td>
- <td>Flag indicating when a particular template class instantiation is a
- valid meta-function (<code>true</code>) or not (<code>false</code>).</td>
- </tr>
- <tr>
- <td><code>is_signed</code></td>
- <td><code>is_specialized == true</code></td>
- <td>Flag indicating whether the signed-variant (<code>true</code>) or
- the unsigned-variant (<code>false</code>) of the meta-function is
- used. This is controlled by the <code>Signedness</code> template
- parameter:
- <table border="1" cellpadding="3" align="center">
- <caption>Effect of <code>Signedness</code> Setting</caption>
- <tr>
- <th><code>Signedness</code> Type</th>
- <th><code>is_signed</code></th>
- </tr>
- <tr>
- <td><code>signed</code></td>
- <td><code>true</code></td>
- </tr>
- <tr>
- <td><code>unsigned</code></td>
- <td><code>false</code></td>
- </tr>
- <tr>
- <td>anything else</td>
- <td><em>not defined</em></td>
- </tr>
- </table>
- The type used is a programmer mnemonic; the compiler cannot prevent
- someone from using <code>int</code> or <code>signed int</code>
- instead of <code>signed</code>, or <code>unsigned int</code> instead
- of <code>unsigned</code>.</td>
- </tr>
- <tr>
- <td><code><var>switch_id</var></code> (Actual name is template-specific.)</td>
- <td>Always</td>
- <td>The value of the main control parameter, accessible even if the
- template class instantiation is aliased.</td>
- </tr>
- <tr>
- <td><code>type</code></td>
- <td><code>is_specialized == true</code></td>
- <td>The meta-function's result. It appears only if the input parameters
- satisfy the template's requirements. Its presence, or lack thereof,
- enables "Substitution Failure Is Not An Error" (SFINAE)
- techniques, instead of a hard compiler diagnostic.</td>
- </tr>
-</table>
-
-<p>The exceptions are the extreme-value class templates
-(<code>maximum_signed_integral</code>, <code>minimum_signed_integral</code>, and
-<code>maximum_unsigned_integral</code>), which do not take a <var>Signedness</var>
-template parameter because the meta-functions already inherently have signedness.
-
-<p>The following table describes each template's criteria. The classic signed
-and unsigned equivalents are the sized-type class templates that each
-MPL-compatible class template emulates. (The setting of <var>Signedness</var>
-controls the appropriate emulation.)</p>
-
-<table border="2" cellpadding="5">
- <caption>Criteria for the MPL-Compatible Class Templates</caption>
- <tr>
- <th rowspan="2">Class Template (all in name-space <code>boost</code>)</th>
- <th rowspan="2">Parameter Type (in name-space <code>boost</code> as needed)</th>
- <th rowspan="2">Parameter Member ID</th>
- <th colspan="2">Classic Equivalent</th>
- <th rowspan="2" colspan="2">Template Parameter Mapping (when <code>type</code> is defined)</th>
- </tr>
- <tr>
- <th>Signed</th>
- <th>Unsigned</th>
- </tr>
- <tr>
- <td><code>sized_integral</code></td>
- <td><code>int</code></td>
- <td><code>bit_count</code></td>
- <td><code>int_t</code></td>
- <td><code>uint_t</code></td>
- <td colspan="2">The smallest built-in integral type with at least
- <code>bit_count</code> bits (including the sign bit when
- <var>Signedness</var> is <code>signed</code>). Not present if no
- type qualifies.</td>
- </tr>
- <tr>
- <td><code>exact_integral</code></td>
- <td><code>int</code></td>
- <td><code>bit_count</code></td>
- <td><code>int_exact_t</code></td>
- <td><code>uint_exact_t</code></td>
- <td colspan="2">The smallest built-in integral type with exactly
- <code>bit_count</code> bits (including the sign bit when
- <var>Signedness</var> is <code>signed</code>). Not present if no
- type qualifies.</td>
- </tr>
- <tr>
- <td><code>maximum_signed_integral</code></td>
- <td><code>intmax_t</code></td>
- <td><code>bound</code></td>
- <td colspan="2"><code>int_max_value_t</code></td>
- <td>The smallest built-in integral type that can perserve the value in
- <code>bound</code>. Not present if <code>bound</code> is non-positive.</td>
- <td rowspan="3">It is possible for a <code>type</code> to be absent if
- a platform supports really-extended integral types (beyond <code>long
- long</code> or <code>__int64</code>), support for those types goes
- into <boost/cstdint.hpp>,
- but said support hadn't yet been added to <<a
- href="../../boost/integer.hpp">boost/integer.hpp</a>></td>
- </tr>
- <tr>
- <td><code>minimum_signed_integral</code></td>
- <td><code>intmax_t</code></td>
- <td><code>bound</code></td>
- <td colspan="2"><code>int_min_value_t</code></td>
- <td>The smallest built-in integral type that can perserve the value in
- <code>bound</code>. Not present if <code>bound</code> is non-negative.</td>
- </tr>
- <tr>
- <td><code>maximum_unsigned_integral</code></td>
- <td><code>uintmax_t</code></td>
- <td><code>bound</code></td>
- <td colspan="2"><code>uint_value_t</code></td>
- <td>The smallest built-in integral type that can perserve the value in
- <code>bound</code>. Should always be present.</td>
- </tr>
-</table>
-
<h2><a name="example">Example</a></h2>
-<blockquote><pre>
-#include <boost/integer.hpp>
-#include <boost/mpl/int.hpp>
-#include <iostream>
-#include <ostream>
-
-//...
-
-template < int Bits >
-bool
-fit_exactly( boost::mpl::int_<Bits> const &x,
- typename boost::exact_integral<Bits, signed>::type *unused = 0 )
-{
- return true;
-}
-
-template < typename T >
-bool
-fit_exactly( T const &x )
-{
- return false;
-}
+<blockquote><pre>#include <boost/integer.hpp>
//...
int main()
{
- typedef boost::mpl::int_<24> twenty_four;
-
- boost::int_t<twenty_four::value>::least my_var;
-
- //...
-
- std::cout << "my_var " << ( fit_exactly(twenty_four()) ? "does" :
- "does not" ) << " fit its type exactly." << std::endl;
-
+ boost::int_t<24>::least my_var;
//...
}
</pre></blockquote>
<h2><a name="demo">Demonstration Program</a></h2>
-<p>The program integer_test.cpp is a
+<p>The program integer_test.cpp is a
simplistic demonstration of the results from instantiating various
examples of the sized type class templates.</p>
@@ -491,11 +198,11 @@
<a href="http://www.boost.org/people/kevlin_henney.htm"> Kevlin Henney</a> for sharing
their designs for similar templates. <a
href="http://www.boost.org/people/daryle_walker.html">Daryle Walker</a> designed the
-exact and value-based sized templates, and the MPL-compatible templates.</p>
+value-based sized templates.</p>
<hr>
-<p>Revised July 16, 2008</p>
+<p>Revised May 20, 2001</p>
<p>© Copyright Beman Dawes 1999. Use, modification, and distribution are
subject to the Boost Software License, Version 1.0. (See accompanying file <a
Modified: trunk/libs/integer/integer_traits.html
==============================================================================
--- trunk/libs/integer/integer_traits.html (original)
+++ trunk/libs/integer/integer_traits.html 2009-11-11 13:57:24 EST (Wed, 11 Nov 2009)
@@ -77,7 +77,7 @@
<p>
-The program <code>integer_traits_test.cpp</code>
+The program <code>integer_traits_test.cpp</code>
exercises the <code>integer_traits</code> class.
<h2>Acknowledgements</h2>
Modified: trunk/libs/integer/test/integer_mask_test.cpp
==============================================================================
--- trunk/libs/integer/test/integer_mask_test.cpp (original)
+++ trunk/libs/integer/test/integer_mask_test.cpp 2009-11-11 13:57:24 EST (Wed, 11 Nov 2009)
@@ -8,149 +8,103 @@
// See http://www.boost.org for most recent version including documentation.
// Revision History
-// 29 Jul 2008 Added MPL-compatible variants of the integer-mask templates.
-// (Daryle Walker)
-// 27 Jul 2008 Changed tests to use the unit-test system; added
-// extended-integer support. (Daryle Walker)
// 23 Sep 2001 Initial version (Daryle Walker)
-#define BOOST_TEST_MODULE "Integer mask tests"
-#include <boost/test/unit_test.hpp> // unit testing framework
+#include <boost/test/minimal.hpp> // for main
-#include <boost/cstdint.hpp> // for boost::uintmax_t
+#include <boost/cstdlib.hpp> // for boost::exit_success
#include <boost/integer/integer_mask.hpp> // for boost::high_bit_mask_t, etc.
-#include <boost/limits.hpp> // for std::numeric_limits
-#include <boost/mpl/assert.hpp> // for BOOST_MPL_ASSERT_RELATION,etc.
-#include <boost/mpl/bool.hpp> // for boost::mpl::bool_
-#include <boost/mpl/bitwise.hpp> // for boost::mpl::bitor_, shift_left
-#include <boost/mpl/equal_to.hpp> // for boost::mpl::equal_to
-#include <boost/mpl/int.hpp> // for boost::mpl::int_
-#include <boost/mpl/integral_c.hpp> // for boost::mpl::integral_c
-#include <boost/mpl/next_prior.hpp> // for boost::mpl::prior
-#include <boost/mpl/range_c.hpp> // for boost::mpl::range_c
-#include <cstddef> // for std::size_t
-#include <ios> // for std::hex
+#include <iostream> // for std::cout (std::endl indirectly)
-// Custom types/templates, helper functions, and objects
-namespace
-{
-
-// List the ranges of template parameters tests (ranges are half-open)
-int const max_offset = std::numeric_limits<boost::uintmax_t>::digits;
-
-typedef boost::mpl::range_c<int, 0, max_offset> high_bit_offsets;
-typedef boost::mpl::range_c<int, 0, max_offset + 1> low_bit_lengths;
-typedef boost::mpl::range_c<int, 1, max_offset + 1> special_low_bit_lengths;
-
-// List a range with out-of-service values
-typedef boost::mpl::range_c<int, -10, max_offset + 11> wild_bit_lengths;
-
-// Use SFINAE to check if a particular parameter is supported
-template < typename ValueT, template<ValueT> class Tmpl, ValueT Value >
-bool
-print_out_template( Tmpl<Value> const &, ValueT setting, char const
- *template_name, typename Tmpl<Value>::type *unused = 0 )
-{
- // Too bad the type-id expression couldn't use the compact form "*unused",
- // but type-ids of dereferenced null pointers throw by order of C++ 2003,
- // sect. 5.2.8, para. 2 (although the result is not conceptually needed).
- BOOST_TEST_MESSAGE( "There is an " << template_name << "<" << setting <<
- "> specialization with type '" << typeid(typename
- Tmpl<Value>::value_type).name() << "' and value '" << std::hex <<
- Tmpl<Value>::value << "'." );
- return true;
-}
-
-template < typename ValueT, typename T >
-bool
-print_out_template( T const &, ValueT setting, char const *template_name )
-{
- BOOST_TEST_MESSAGE( "There is no " << template_name << "<" << setting <<
- "> specialization." );
- return false;
-}
-
-} // unnamed namespace
-
-
-// Check the various integer-valued bit-masks
-BOOST_AUTO_TEST_SUITE( integer_mask_tests )
-
-// Check the bit-masks of one offset bit
-BOOST_AUTO_TEST_CASE_TEMPLATE( high_bit_mask_test, T, high_bit_offsets )
-{
- typedef boost::mpl::integral_c<typename
- boost::high_bit_mask_t<T::value>::least, 1u> one_type;
- typedef boost::mpl::shift_left<one_type, T> result_type;
-
- BOOST_MPL_ASSERT_RELATION( boost::high_bit_mask_t<T::value>::high_bit, ==,
- result_type::value );
- BOOST_MPL_ASSERT_RELATION( boost::high_bit_mask_t<T::value>::high_bit_fast,
- ==, result_type::value );
-}
-
-// Check the bit-masks of a block of low-valued bits, non-zero block-lengths
-BOOST_AUTO_TEST_CASE_TEMPLATE( low_bits_mask_test, T, special_low_bit_lengths )
-{
- // One can express (2^x - 1) in two ways
- // 1. (1 << x) - 1
- // 2. (1 << (x-1)) | ((1 << (x-1)) - 1)
- // Since unsigneds have modulo arithmetic, [1] gives the right answer even
- // when x is the number of bits in the register. However, that last case
- // gives warnings about the sole bit flowing past the register. Applying
- // distributive property backwards gives [2], which works without overflow.
- typedef typename boost::mpl::prior<T>::type shift_type;
- typedef boost::mpl::integral_c<typename
- boost::low_bits_mask_t<T::value>::least, 1u> one_type;
- typedef boost::mpl::shift_left<one_type, shift_type> high_bit_type;
- typedef typename boost::mpl::prior<high_bit_type>::type low_bits_type;
- typedef boost::mpl::bitor_<high_bit_type, low_bits_type> result_type;
-
- BOOST_MPL_ASSERT_RELATION( boost::low_bits_mask_t<T::value>::sig_bits, ==,
- result_type::value );
- BOOST_MPL_ASSERT_RELATION( boost::low_bits_mask_t<T::value>::sig_bits_fast,
- ==, result_type::value );
-}
-
-// Check the bit-masks of a block of low-valued bits, zero block-length
-BOOST_AUTO_TEST_CASE( special_low_bits_mask_test )
-{
- // Just like "low_bits_mask_test" above, except that the shifts are negative
- // when the bit-count is zero. That causes a lot of warnings and errors, so
- // special-case that bit-count.
- BOOST_MPL_ASSERT_RELATION( boost::low_bits_mask_t<0u>::sig_bits, ==, 0 );
- BOOST_MPL_ASSERT_RELATION(boost::low_bits_mask_t<0u>::sig_bits_fast, ==, 0);
-}
+#define PRIVATE_HIGH_BIT_SLOW_TEST(v) BOOST_CHECK( ::boost::high_bit_mask_t< \
+ (v) >::high_bit == (1ul << (v)) );
+#define PRIVATE_HIGH_BIT_FAST_TEST(v) BOOST_CHECK( ::boost::high_bit_mask_t< \
+ (v) >::high_bit_fast == (1ul << (v)) );
+#define PRIVATE_HIGH_BIT_TEST(v) do { PRIVATE_HIGH_BIT_SLOW_TEST(v); \
+ PRIVATE_HIGH_BIT_FAST_TEST(v); } while (false)
+
+#define PRIVATE_LOW_BITS_SLOW_TEST(v) BOOST_CHECK( ::boost::low_bits_mask_t< \
+ (v) >::sig_bits == ((1ul << (v)) - 1) );
+#define PRIVATE_LOW_BITS_FAST_TEST(v) BOOST_CHECK( ::boost::low_bits_mask_t< \
+ (v) >::sig_bits_fast == ((1ul << (v)) - 1) );
+#define PRIVATE_LOW_BITS_TEST(v) do { PRIVATE_LOW_BITS_SLOW_TEST(v); \
+ PRIVATE_LOW_BITS_FAST_TEST(v); } while (false)
+
+
+int test_main( int, char*[] )
+{
+ using std::cout;
+ using std::endl;
+
+ cout << "Doing high_bit_mask_t tests." << endl;
+ PRIVATE_HIGH_BIT_TEST( 31 );
+ PRIVATE_HIGH_BIT_TEST( 30 );
+ PRIVATE_HIGH_BIT_TEST( 29 );
+ PRIVATE_HIGH_BIT_TEST( 28 );
+ PRIVATE_HIGH_BIT_TEST( 27 );
+ PRIVATE_HIGH_BIT_TEST( 26 );
+ PRIVATE_HIGH_BIT_TEST( 25 );
+ PRIVATE_HIGH_BIT_TEST( 24 );
+ PRIVATE_HIGH_BIT_TEST( 23 );
+ PRIVATE_HIGH_BIT_TEST( 22 );
+ PRIVATE_HIGH_BIT_TEST( 21 );
+ PRIVATE_HIGH_BIT_TEST( 20 );
+ PRIVATE_HIGH_BIT_TEST( 19 );
+ PRIVATE_HIGH_BIT_TEST( 18 );
+ PRIVATE_HIGH_BIT_TEST( 17 );
+ PRIVATE_HIGH_BIT_TEST( 16 );
+ PRIVATE_HIGH_BIT_TEST( 15 );
+ PRIVATE_HIGH_BIT_TEST( 14 );
+ PRIVATE_HIGH_BIT_TEST( 13 );
+ PRIVATE_HIGH_BIT_TEST( 12 );
+ PRIVATE_HIGH_BIT_TEST( 11 );
+ PRIVATE_HIGH_BIT_TEST( 10 );
+ PRIVATE_HIGH_BIT_TEST( 9 );
+ PRIVATE_HIGH_BIT_TEST( 8 );
+ PRIVATE_HIGH_BIT_TEST( 7 );
+ PRIVATE_HIGH_BIT_TEST( 6 );
+ PRIVATE_HIGH_BIT_TEST( 5 );
+ PRIVATE_HIGH_BIT_TEST( 4 );
+ PRIVATE_HIGH_BIT_TEST( 3 );
+ PRIVATE_HIGH_BIT_TEST( 2 );
+ PRIVATE_HIGH_BIT_TEST( 1 );
+ PRIVATE_HIGH_BIT_TEST( 0 );
+
+ cout << "Doing low_bits_mask_t tests." << endl;
+ PRIVATE_LOW_BITS_TEST( 32 ); // Undefined behavior? Whoops!
+ PRIVATE_LOW_BITS_TEST( 31 );
+ PRIVATE_LOW_BITS_TEST( 30 );
+ PRIVATE_LOW_BITS_TEST( 29 );
+ PRIVATE_LOW_BITS_TEST( 28 );
+ PRIVATE_LOW_BITS_TEST( 27 );
+ PRIVATE_LOW_BITS_TEST( 26 );
+ PRIVATE_LOW_BITS_TEST( 25 );
+ PRIVATE_LOW_BITS_TEST( 24 );
+ PRIVATE_LOW_BITS_TEST( 23 );
+ PRIVATE_LOW_BITS_TEST( 22 );
+ PRIVATE_LOW_BITS_TEST( 21 );
+ PRIVATE_LOW_BITS_TEST( 20 );
+ PRIVATE_LOW_BITS_TEST( 19 );
+ PRIVATE_LOW_BITS_TEST( 18 );
+ PRIVATE_LOW_BITS_TEST( 17 );
+ PRIVATE_LOW_BITS_TEST( 16 );
+ PRIVATE_LOW_BITS_TEST( 15 );
+ PRIVATE_LOW_BITS_TEST( 14 );
+ PRIVATE_LOW_BITS_TEST( 13 );
+ PRIVATE_LOW_BITS_TEST( 12 );
+ PRIVATE_LOW_BITS_TEST( 11 );
+ PRIVATE_LOW_BITS_TEST( 10 );
+ PRIVATE_LOW_BITS_TEST( 9 );
+ PRIVATE_LOW_BITS_TEST( 8 );
+ PRIVATE_LOW_BITS_TEST( 7 );
+ PRIVATE_LOW_BITS_TEST( 6 );
+ PRIVATE_LOW_BITS_TEST( 5 );
+ PRIVATE_LOW_BITS_TEST( 4 );
+ PRIVATE_LOW_BITS_TEST( 3 );
+ PRIVATE_LOW_BITS_TEST( 2 );
+ PRIVATE_LOW_BITS_TEST( 1 );
-// Check the specialization type status of given bit-offsets/lengths
-BOOST_AUTO_TEST_CASE_TEMPLATE( confirm_bounds_test, T, wild_bit_lengths )
-{
- typedef boost::integer_hi_mask<T::value> hi_type;
- typedef boost::mpl::int_<hi_type::bit_offset> hi_offset_type;
- typedef boost::mpl::bool_<hi_type::is_specialized> special_hi_type;
-
- BOOST_MPL_ASSERT( (boost::mpl::equal_to< hi_offset_type, T >) );
- BOOST_MPL_ASSERT( (boost::mpl::equal_to< special_hi_type,
- boost::mpl::bool_<(T::value >= 0) && (T::value < max_offset)> >) );
- BOOST_CHECK_EQUAL( print_out_template(hi_type(), hi_offset_type::value,
- "integer_hi_mask"), special_hi_type::value );
-
- typedef boost::integer_lo_mask<T::value> lo_type;
- typedef boost::mpl::int_<lo_type::bit_count> lo_length_type;
- typedef boost::mpl::bool_<lo_type::is_specialized> special_lo_type;
-
- BOOST_MPL_ASSERT( (boost::mpl::equal_to< lo_length_type, T >) );
- BOOST_MPL_ASSERT( (boost::mpl::equal_to< special_lo_type,
- boost::mpl::bool_<(T::value >= 0) && (T::value <= max_offset)> >) );
- BOOST_CHECK_EQUAL( print_out_template(lo_type(), lo_length_type::value,
- "integer_lo_mask"), special_lo_type::value );
+ return boost::exit_success;
}
-
-BOOST_AUTO_TEST_SUITE_END()
-
-// Verification of bugs and their fixes
-BOOST_AUTO_TEST_SUITE( bug_fix_tests )
-
-BOOST_AUTO_TEST_SUITE_END()
Modified: trunk/libs/integer/test/integer_test.cpp
==============================================================================
--- trunk/libs/integer/test/integer_test.cpp (original)
+++ trunk/libs/integer/test/integer_test.cpp 2009-11-11 13:57:24 EST (Wed, 11 Nov 2009)
@@ -4,666 +4,288 @@
// Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
// See http://www.boost.org/libs/integer for documentation.
// Revision History
-// 16 Jul 08 Added MPL-compatible variants of the minimum-size and value-
-// based integer templates. (Daryle Walker)
-// 15 Jul 08 Added exact-integer templates; added MPL-compatible variant of
-// processor-optimized integer template. (Daryle Walker)
-// 14 Jul 08 Improved testing of processor-optimized integer template; added
-// extended-integer support. (Daryle Walker)
-// 13 Jul 08 Modernized tests w/ MPL instead of giant macros (Daryle Walker)
-// 07 Jul 08 Changed tests to use the unit-test system (Daryle Walker)
// 04 Oct 01 Added tests for new templates; rewrote code (Daryle Walker)
// 10 Mar 01 Boost Test Library now used for tests (Beman Dawes)
// 31 Aug 99 Initial version
-#define BOOST_TEST_MODULE "Integer size-selection tests"
+#include <boost/test/minimal.hpp> // for main, BOOST_CHECK
-#include <boost/test/unit_test.hpp> // unit testing framework
+#include <boost/config.hpp> // for BOOST_NO_USING_TEMPLATE
+#include <boost/cstdlib.hpp> // for boost::exit_success
+#include <boost/integer.hpp> // for boost::int_t, boost::uint_t
+
+#include <climits> // for ULONG_MAX, LONG_MAX, LONG_MIN
+#include <iostream> // for std::cout (std::endl indirectly)
+#include <typeinfo> // for std::type_info
-#include <boost/config.hpp> // for BOOST_NO_SFINAE
-#include <boost/cstdint.hpp> // for boost::uintmax_t, intmax_t
-#include <boost/integer.hpp> // for boost::int_t, boost::uint_t, etc.
-#include <boost/integer_traits.hpp> // for boost::integer_traits
-#include <boost/limits.hpp> // for std::numeric_limits
-
-#include <boost/detail/extended_integer.hpp> // BOOST_HAS_XINT, BOOST_UXINT_MAX
-
-#include <boost/mpl/arithmetic.hpp> // for boost::mpl::plus, divides
-#include <boost/mpl/assert.hpp> // for BOOST_MPL_ASSERT_RELATION, etc.
-#include <boost/mpl/back.hpp> // for boost::mpl::back
-#include <boost/mpl/copy.hpp> // for boost::mpl::copy
-#include <boost/mpl/equal.hpp> // for boost::mpl::equal
-#include <boost/mpl/front_inserter.hpp> // for boost::mpl::front_inserter
-#include <boost/mpl/int.hpp> // for boost::mpl::int_
-#include <boost/mpl/integral_c.hpp> // for boost::mpl::integral_c
-#include <boost/mpl/joint_view.hpp> // for boost::mpl::joint_view
-#include <boost/mpl/pop_back.hpp> // for boost::mpl::pop_back
-#include <boost/mpl/push_back.hpp> // for boost::mpl::push_back
-#include <boost/mpl/push_front.hpp> // for boost::mpl::push_front
-#include <boost/mpl/range_c.hpp> // for boost::mpl::range_c
-#include <boost/mpl/shift_right.hpp> // for boost::mpl::shift_right
-#include <boost/mpl/sort.hpp> // for boost::mpl::sort
-#include <boost/mpl/transform.hpp> // for boost::mpl::transform
-#include <boost/mpl/transform_view.hpp> // for boost::mpl::transform_view
-#include <boost/mpl/unpack_args.hpp> // for boost::mpl::unpack_args
-#include <boost/mpl/vector.hpp> // for boost::mpl::vector
-#include <boost/mpl/zip_view.hpp> // for boost::mpl::zip_view
-
-#include <boost/type_traits/is_same.hpp> // for boost::is_same
-#include <boost/type_traits/make_signed.hpp> // for boost::make_signed
-
-#include <algorithm> // for std::binary_search
-#include <climits> // for ULONG_MAX, LONG_MAX, LONG_MIN, etc.
-#include <cstddef> // for std::size_t
-#include <typeinfo> // for std::type_info
-
-
-// Control what the "fast" specialization of "short" is
-#ifndef CONTROL_FAST_SHORT
-#define CONTROL_FAST_SHORT long
-#endif
-// Control if every potential bit-count is used, or only a selection
-// For me, full counts increase compile time from 90 seconds to 20 minutes!
-#ifndef CONTROL_FULL_COUNTS
-#define CONTROL_FULL_COUNTS 1
+// Control if the names of the types for each version
+// of the integer templates will be printed.
+#ifndef CONTROL_SHOW_TYPES
+#define CONTROL_SHOW_TYPES 0
#endif
// If specializations have not already been done, then we can confirm
-// the effects of the fast types by making a specialization. If there
-// is a specialization for "short," make sure that CONTROL_FAST_SHORT
-// is set to a type distinct from "short" and the default implementation.
+// the effects of the "fast" types by making a specialization.
namespace boost
{
template < >
- struct fast_integral< short >
+ struct int_fast_t< short >
{
- typedef CONTROL_FAST_SHORT type;
+ typedef long fast;
};
}
-// Custom types/templates, helper functions, and objects
-namespace
-{
-
-// List the built-in integral types, excluding the ones that are strong-typedefs
-// of a lower type.
-typedef boost::mpl::vector<
- unsigned char
-#if USHRT_MAX > UCHAR_MAX
- , unsigned short
-#endif
-#if UINT_MAX > USHRT_MAX
- , unsigned int
-#endif
-#if ULONG_MAX > UINT_MAX
- , unsigned long
-#endif
-#if BOOST_HAS_XINT && (BOOST_UXINT_MAX > ULONG_MAX)
- , boost::detail::uxint_t
-#endif
-> distinct_unsigned_types;
-
-typedef boost::mpl::transform<
- distinct_unsigned_types,
- boost::make_signed< boost::mpl::_1 >
->::type distinct_signed_types;
-
-// List the digit counts for each integral type
-template < typename T >
-struct digits_of
- : boost::mpl::int_< std::numeric_limits<T>::digits >
-{
-};
-
-typedef boost::mpl::transform<
- distinct_unsigned_types,
- digits_of< boost::mpl::_1 >
->::type distinct_integral_bit_counts;
-
-// Make list of bit counts between each offical point, plus CHAR_BIT/2
-typedef boost::mpl::transform_view<
- boost::mpl::zip_view<
- boost::mpl::vector<
- boost::mpl::push_front<
- boost::mpl::pop_back< distinct_integral_bit_counts >::type,
- boost::mpl::integral_c< int, 0 >
- >::type,
- distinct_integral_bit_counts
- >
- >,
- boost::mpl::unpack_args<
- boost::mpl::divides<
- boost::mpl::plus< boost::mpl::_1, boost::mpl::_2 >,
- boost::mpl::integral_c< int, 2 >
- >
- >
-> median_bit_counts;
-
-// Maximum number of bits allowed
-typedef std::numeric_limits<boost:: intmax_t> intmax_limits;
-typedef std::numeric_limits<boost::uintmax_t> uintmax_limits;
-
-int const intmax_bits = intmax_limits::digits + 1;
-int const uintmax_bits = uintmax_limits::digits;
-
-// Make master lists including an outlier beyond all valid bit counts
-#if CONTROL_FULL_COUNTS
-typedef boost::mpl::range_c<int, 0, uintmax_bits + 2> bits_list;
-#else
-typedef boost::mpl::sort<
- boost::mpl::copy<
- boost::mpl::joint_view<
- distinct_integral_bit_counts,
- median_bit_counts
- >,
- boost::mpl::front_inserter<
- boost::mpl::vector<
- boost::mpl::integral_c<int, uintmax_bits + 1>
- >
- >
- >::type
->::type bits_list;
-#endif
-
-// Remove the outlier when all bits counts must be valid
-#if CONTROL_FULL_COUNTS
-typedef boost::mpl::range_c<int, 0, uintmax_bits + 1> valid_bits_list;
+// Show the types of an integer template version
+#if CONTROL_SHOW_TYPES
+#define SHOW_TYPE(Template, Number, Type) ::std::cout << "Type \"" \
+ #Template "<" #Number ">::" #Type "\" is \"" << typeid(Template < \
+ Number > :: Type).name() << ".\"\n"
#else
-typedef boost::mpl::pop_back<bits_list>::type valid_bits_list;
+#define SHOW_TYPE(Template, Number, Type)
#endif
-// Replace the minimum bit count with one more, so right-shifting by a stored
-// value doesn't give an invalid result
-#if CONTROL_FULL_COUNTS
-typedef boost::mpl::range_c<int, 1, uintmax_bits + 1>
- valid_to_decrease_bits_list;
+#define SHOW_TYPES(Template, Type) SHOW_TYPE(Template, 32, Type); \
+ SHOW_TYPE(Template, 31, Type); SHOW_TYPE(Template, 30, Type); \
+ SHOW_TYPE(Template, 29, Type); SHOW_TYPE(Template, 28, Type); \
+ SHOW_TYPE(Template, 27, Type); SHOW_TYPE(Template, 26, Type); \
+ SHOW_TYPE(Template, 25, Type); SHOW_TYPE(Template, 24, Type); \
+ SHOW_TYPE(Template, 23, Type); SHOW_TYPE(Template, 22, Type); \
+ SHOW_TYPE(Template, 21, Type); SHOW_TYPE(Template, 20, Type); \
+ SHOW_TYPE(Template, 19, Type); SHOW_TYPE(Template, 18, Type); \
+ SHOW_TYPE(Template, 17, Type); SHOW_TYPE(Template, 16, Type); \
+ SHOW_TYPE(Template, 15, Type); SHOW_TYPE(Template, 14, Type); \
+ SHOW_TYPE(Template, 13, Type); SHOW_TYPE(Template, 12, Type); \
+ SHOW_TYPE(Template, 11, Type); SHOW_TYPE(Template, 10, Type); \
+ SHOW_TYPE(Template, 9, Type); SHOW_TYPE(Template, 8, Type); \
+ SHOW_TYPE(Template, 7, Type); SHOW_TYPE(Template, 6, Type); \
+ SHOW_TYPE(Template, 5, Type); SHOW_TYPE(Template, 4, Type); \
+ SHOW_TYPE(Template, 3, Type); SHOW_TYPE(Template, 2, Type); \
+ SHOW_TYPE(Template, 1, Type); SHOW_TYPE(Template, 0, Type)
+
+#define SHOW_SHIFTED_TYPE(Template, Number, Type) SHOW_TYPE(Template, (1UL << Number), Type)
+
+#define SHOW_SHIFTED_TYPES(Template, Type) SHOW_SHIFTED_TYPE(Template, 30, Type); \
+ SHOW_SHIFTED_TYPE(Template, 29, Type); SHOW_SHIFTED_TYPE(Template, 28, Type); \
+ SHOW_SHIFTED_TYPE(Template, 27, Type); SHOW_SHIFTED_TYPE(Template, 26, Type); \
+ SHOW_SHIFTED_TYPE(Template, 25, Type); SHOW_SHIFTED_TYPE(Template, 24, Type); \
+ SHOW_SHIFTED_TYPE(Template, 23, Type); SHOW_SHIFTED_TYPE(Template, 22, Type); \
+ SHOW_SHIFTED_TYPE(Template, 21, Type); SHOW_SHIFTED_TYPE(Template, 20, Type); \
+ SHOW_SHIFTED_TYPE(Template, 19, Type); SHOW_SHIFTED_TYPE(Template, 18, Type); \
+ SHOW_SHIFTED_TYPE(Template, 17, Type); SHOW_SHIFTED_TYPE(Template, 16, Type); \
+ SHOW_SHIFTED_TYPE(Template, 15, Type); SHOW_SHIFTED_TYPE(Template, 14, Type); \
+ SHOW_SHIFTED_TYPE(Template, 13, Type); SHOW_SHIFTED_TYPE(Template, 12, Type); \
+ SHOW_SHIFTED_TYPE(Template, 11, Type); SHOW_SHIFTED_TYPE(Template, 10, Type); \
+ SHOW_SHIFTED_TYPE(Template, 9, Type); SHOW_SHIFTED_TYPE(Template, 8, Type); \
+ SHOW_SHIFTED_TYPE(Template, 7, Type); SHOW_SHIFTED_TYPE(Template, 6, Type); \
+ SHOW_SHIFTED_TYPE(Template, 5, Type); SHOW_SHIFTED_TYPE(Template, 4, Type); \
+ SHOW_SHIFTED_TYPE(Template, 3, Type); SHOW_SHIFTED_TYPE(Template, 2, Type); \
+ SHOW_SHIFTED_TYPE(Template, 1, Type); SHOW_SHIFTED_TYPE(Template, 0, Type)
+
+#define SHOW_POS_SHIFTED_TYPE(Template, Number, Type) SHOW_TYPE(Template, +(1L << Number), Type)
+
+#define SHOW_POS_SHIFTED_TYPES(Template, Type) SHOW_POS_SHIFTED_TYPE(Template, 30, Type); \
+ SHOW_POS_SHIFTED_TYPE(Template, 29, Type); SHOW_POS_SHIFTED_TYPE(Template, 28, Type); \
+ SHOW_POS_SHIFTED_TYPE(Template, 27, Type); SHOW_POS_SHIFTED_TYPE(Template, 26, Type); \
+ SHOW_POS_SHIFTED_TYPE(Template, 25, Type); SHOW_POS_SHIFTED_TYPE(Template, 24, Type); \
+ SHOW_POS_SHIFTED_TYPE(Template, 23, Type); SHOW_POS_SHIFTED_TYPE(Template, 22, Type); \
+ SHOW_POS_SHIFTED_TYPE(Template, 21, Type); SHOW_POS_SHIFTED_TYPE(Template, 20, Type); \
+ SHOW_POS_SHIFTED_TYPE(Template, 19, Type); SHOW_POS_SHIFTED_TYPE(Template, 18, Type); \
+ SHOW_POS_SHIFTED_TYPE(Template, 17, Type); SHOW_POS_SHIFTED_TYPE(Template, 16, Type); \
+ SHOW_POS_SHIFTED_TYPE(Template, 15, Type); SHOW_POS_SHIFTED_TYPE(Template, 14, Type); \
+ SHOW_POS_SHIFTED_TYPE(Template, 13, Type); SHOW_POS_SHIFTED_TYPE(Template, 12, Type); \
+ SHOW_POS_SHIFTED_TYPE(Template, 11, Type); SHOW_POS_SHIFTED_TYPE(Template, 10, Type); \
+ SHOW_POS_SHIFTED_TYPE(Template, 9, Type); SHOW_POS_SHIFTED_TYPE(Template, 8, Type); \
+ SHOW_POS_SHIFTED_TYPE(Template, 7, Type); SHOW_POS_SHIFTED_TYPE(Template, 6, Type); \
+ SHOW_POS_SHIFTED_TYPE(Template, 5, Type); SHOW_POS_SHIFTED_TYPE(Template, 4, Type); \
+ SHOW_POS_SHIFTED_TYPE(Template, 3, Type); SHOW_POS_SHIFTED_TYPE(Template, 2, Type); \
+ SHOW_POS_SHIFTED_TYPE(Template, 1, Type); SHOW_POS_SHIFTED_TYPE(Template, 0, Type)
+
+#define SHOW_NEG_SHIFTED_TYPE(Template, Number, Type) SHOW_TYPE(Template, -(1L << Number), Type)
+
+#define SHOW_NEG_SHIFTED_TYPES(Template, Type) SHOW_NEG_SHIFTED_TYPE(Template, 30, Type); \
+ SHOW_NEG_SHIFTED_TYPE(Template, 29, Type); SHOW_NEG_SHIFTED_TYPE(Template, 28, Type); \
+ SHOW_NEG_SHIFTED_TYPE(Template, 27, Type); SHOW_NEG_SHIFTED_TYPE(Template, 26, Type); \
+ SHOW_NEG_SHIFTED_TYPE(Template, 25, Type); SHOW_NEG_SHIFTED_TYPE(Template, 24, Type); \
+ SHOW_NEG_SHIFTED_TYPE(Template, 23, Type); SHOW_NEG_SHIFTED_TYPE(Template, 22, Type); \
+ SHOW_NEG_SHIFTED_TYPE(Template, 21, Type); SHOW_NEG_SHIFTED_TYPE(Template, 20, Type); \
+ SHOW_NEG_SHIFTED_TYPE(Template, 19, Type); SHOW_NEG_SHIFTED_TYPE(Template, 18, Type); \
+ SHOW_NEG_SHIFTED_TYPE(Template, 17, Type); SHOW_NEG_SHIFTED_TYPE(Template, 16, Type); \
+ SHOW_NEG_SHIFTED_TYPE(Template, 15, Type); SHOW_NEG_SHIFTED_TYPE(Template, 14, Type); \
+ SHOW_NEG_SHIFTED_TYPE(Template, 13, Type); SHOW_NEG_SHIFTED_TYPE(Template, 12, Type); \
+ SHOW_NEG_SHIFTED_TYPE(Template, 11, Type); SHOW_NEG_SHIFTED_TYPE(Template, 10, Type); \
+ SHOW_NEG_SHIFTED_TYPE(Template, 9, Type); SHOW_NEG_SHIFTED_TYPE(Template, 8, Type); \
+ SHOW_NEG_SHIFTED_TYPE(Template, 7, Type); SHOW_NEG_SHIFTED_TYPE(Template, 6, Type); \
+ SHOW_NEG_SHIFTED_TYPE(Template, 5, Type); SHOW_NEG_SHIFTED_TYPE(Template, 4, Type); \
+ SHOW_NEG_SHIFTED_TYPE(Template, 3, Type); SHOW_NEG_SHIFTED_TYPE(Template, 2, Type); \
+ SHOW_NEG_SHIFTED_TYPE(Template, 1, Type); SHOW_NEG_SHIFTED_TYPE(Template, 0, Type)
+
+
+// Test if a constant can fit within a certain type
+#define PRIVATE_FIT_TEST(Template, Number, Type, Value) BOOST_CHECK( Template < Number > :: Type ( Value ) == Value )
+
+#if ULONG_MAX > 0xFFFFFFFFL
+#define PRIVATE_FIT_TESTS(Template, Type, ValType, InitVal) do { ValType v = InitVal ; \
+ PRIVATE_FIT_TEST(Template, 64, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 63, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 62, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 61, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 60, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 59, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 58, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 57, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 56, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 55, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 54, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 53, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 52, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 51, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 50, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 49, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 48, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 47, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 46, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 45, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 44, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 43, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 42, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 41, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 40, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 39, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 38, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 37, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 36, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 35, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 34, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 33, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 32, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 31, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 30, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 29, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 28, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 27, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 26, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 25, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 24, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 23, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 22, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 21, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 20, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 19, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 18, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 17, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 16, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 15, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 14, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 13, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 12, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 11, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 10, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 9, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 8, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 7, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 6, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 5, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 4, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 3, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 2, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 1, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 0, Type, v); } while ( false )
#else
-typedef valid_bits_list valid_to_decrease_bits_list;
-#endif
-
-// Replace the maximum bit count with one less, so left-shifting by a stored
-// value doesn't give an invalid result
-#if CONTROL_FULL_COUNTS
-typedef boost::mpl::range_c<int, 0, uintmax_bits> valid_to_increase_ubits_list;
-#else
-typedef boost::mpl::push_back<
- boost::mpl::pop_back< valid_bits_list >::type,
- boost::mpl::integral_c< int, uintmax_bits - 1 >
->::type valid_to_increase_ubits_list;
-#endif
-
-// Do it again for signed types since they have one-less bit to use for the
-// mantissa (don't want to shift into the sign bit)
-#if CONTROL_FULL_COUNTS
-typedef boost::mpl::range_c<int, 0, intmax_bits - 2>
- valid_to_increase_sbits_list;
-#else
-typedef boost::mpl::push_back<
- boost::mpl::pop_back< valid_bits_list >::type,
- boost::mpl::integral_c< int, intmax_bits - 3 >
->::type valid_to_increase_sbits_list;
-#endif
-
-// List the digit counts for each integral type, this time as an object, an
-// array working as a sorted list
-int const integral_bit_lengths[] = {
- std::numeric_limits< unsigned char >::digits
-#if USHRT_MAX > UCHAR_MAX
- , std::numeric_limits< unsigned short >::digits
-#endif
-#if UINT_MAX > USHRT_MAX
- , std::numeric_limits< unsigned int >::digits
-#endif
-#if ULONG_MAX > UINT_MAX
- , std::numeric_limits< unsigned long >::digits
-#endif
-#if BOOST_HAS_XINT && (BOOST_UXINT_MAX > ULONG_MAX)
- , std::numeric_limits< boost::detail::uxint_t >::digits
-#endif
-};
-
-std::size_t const integral_type_count = sizeof(integral_bit_lengths) /
- sizeof(integral_bit_lengths[0]);
-
-// "Template-typedefs" to reduce two-argument templates to single-argument.
-// This way, all the MPL-compatible templates have the same form, for below.
-template < int Bits >
-struct signed_sized_integral : boost::sized_integral<Bits, signed> {};
-
-template < int Bits >
-struct unsigned_sized_integral : boost::sized_integral<Bits, unsigned> {};
-
-template < int Bits >
-struct signed_exact_integral : boost::exact_integral<Bits, signed> {};
-
-template < int Bits >
-struct unsigned_exact_integral : boost::exact_integral<Bits, unsigned> {};
-
-// Use SFINAE to check if a particular parameter is supported
-#ifndef BOOST_NO_SFINAE
-template < typename ValueT, template<ValueT> class Tmpl, ValueT Value >
-bool
-print_out_template( Tmpl<Value> const &, ValueT setting, char const
- *template_pre_name, char const *template_post_name, typename Tmpl<Value>::type
- *unused = 0 )
-{
- // Too bad the type-id expression couldn't use the compact form "*unused",
- // but type-ids of dereferenced null pointers throw by order of C++ 2003,
- // sect. 5.2.8, para. 2 (although the result is not conceptually needed).
- BOOST_TEST_MESSAGE( "This is " << template_pre_name << setting
- << template_post_name << " specialization, with type '" << typeid(typename
- Tmpl<Value>::type).name() << "'." );
- return true;
-}
-
-template < typename ValueT, typename T >
-bool
-print_out_template( T const &, ValueT setting, char const *template_pre_name,
- char const *template_post_name )
-{
- BOOST_TEST_MESSAGE( "Looking for " << template_pre_name << setting
- << template_post_name << " specialization? It doesn't exist." );
- return false;
-}
+#define PRIVATE_FIT_TESTS(Template, Type, ValType, InitVal) do { ValType v = InitVal ; \
+ PRIVATE_FIT_TEST(Template, 32, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 31, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 30, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 29, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 28, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 27, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 26, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 25, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 24, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 23, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 22, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 21, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 20, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 19, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 18, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 17, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 16, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 15, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 14, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 13, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 12, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 11, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 10, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 9, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 8, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 7, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 6, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 5, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 4, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 3, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 2, Type, v); v >>= 1; \
+ PRIVATE_FIT_TEST(Template, 1, Type, v); v >>= 1; PRIVATE_FIT_TEST(Template, 0, Type, v); } while ( false )
+#endif
+
+#define PRIVATE_SHIFTED_FIT_TEST(Template, Number, Type, Value) BOOST_CHECK( Template < (ULONG_MAX >> Number) > :: Type ( Value ) == Value )
+
+#define PRIVATE_SHIFTED_FIT_TESTS(Template, Type, ValType, InitVal) do { ValType v = InitVal ; \
+ PRIVATE_SHIFTED_FIT_TEST(Template, 0, Type, v); v >>= 1; PRIVATE_SHIFTED_FIT_TEST(Template, 1, Type, v); v >>= 1; \
+ PRIVATE_SHIFTED_FIT_TEST(Template, 2, Type, v); v >>= 1; PRIVATE_SHIFTED_FIT_TEST(Template, 3, Type, v); v >>= 1; \
+ PRIVATE_SHIFTED_FIT_TEST(Template, 4, Type, v); v >>= 1; PRIVATE_SHIFTED_FIT_TEST(Template, 5, Type, v); v >>= 1; \
+ PRIVATE_SHIFTED_FIT_TEST(Template, 6, Type, v); v >>= 1; PRIVATE_SHIFTED_FIT_TEST(Template, 7, Type, v); v >>= 1; \
+ PRIVATE_SHIFTED_FIT_TEST(Template, 8, Type, v); v >>= 1; PRIVATE_SHIFTED_FIT_TEST(Template, 9, Type, v); v >>= 1; \
+ PRIVATE_SHIFTED_FIT_TEST(Template, 10, Type, v); v >>= 1; PRIVATE_SHIFTED_FIT_TEST(Template, 11, Type, v); v >>= 1; \
+ PRIVATE_SHIFTED_FIT_TEST(Template, 12, Type, v); v >>= 1; PRIVATE_SHIFTED_FIT_TEST(Template, 13, Type, v); v >>= 1; \
+ PRIVATE_SHIFTED_FIT_TEST(Template, 14, Type, v); v >>= 1; PRIVATE_SHIFTED_FIT_TEST(Template, 15, Type, v); v >>= 1; \
+ PRIVATE_SHIFTED_FIT_TEST(Template, 16, Type, v); v >>= 1; PRIVATE_SHIFTED_FIT_TEST(Template, 17, Type, v); v >>= 1; \
+ PRIVATE_SHIFTED_FIT_TEST(Template, 18, Type, v); v >>= 1; PRIVATE_SHIFTED_FIT_TEST(Template, 19, Type, v); v >>= 1; \
+ PRIVATE_SHIFTED_FIT_TEST(Template, 20, Type, v); v >>= 1; PRIVATE_SHIFTED_FIT_TEST(Template, 21, Type, v); v >>= 1; \
+ PRIVATE_SHIFTED_FIT_TEST(Template, 22, Type, v); v >>= 1; PRIVATE_SHIFTED_FIT_TEST(Template, 23, Type, v); v >>= 1; \
+ PRIVATE_SHIFTED_FIT_TEST(Template, 24, Type, v); v >>= 1; PRIVATE_SHIFTED_FIT_TEST(Template, 25, Type, v); v >>= 1; \
+ PRIVATE_SHIFTED_FIT_TEST(Template, 26, Type, v); v >>= 1; PRIVATE_SHIFTED_FIT_TEST(Template, 27, Type, v); v >>= 1; \
+ PRIVATE_SHIFTED_FIT_TEST(Template, 28, Type, v); v >>= 1; PRIVATE_SHIFTED_FIT_TEST(Template, 29, Type, v); v >>= 1; \
+ PRIVATE_SHIFTED_FIT_TEST(Template, 30, Type, v); v >>= 1; PRIVATE_SHIFTED_FIT_TEST(Template, 31, Type, v); } while ( false )
+
+#define PRIVATE_POS_SHIFTED_FIT_TEST(Template, Number, Type, Value) BOOST_CHECK( Template < (LONG_MAX >> Number) > :: Type ( Value ) == Value )
+
+#define PRIVATE_POS_FIT_TESTS(Template, Type, ValType, InitVal) do { ValType v = InitVal ; \
+ PRIVATE_POS_SHIFTED_FIT_TEST(Template, 0, Type, v); v >>= 1; PRIVATE_POS_SHIFTED_FIT_TEST(Template, 1, Type, v); v >>= 1; \
+ PRIVATE_POS_SHIFTED_FIT_TEST(Template, 2, Type, v); v >>= 1; PRIVATE_POS_SHIFTED_FIT_TEST(Template, 3, Type, v); v >>= 1; \
+ PRIVATE_POS_SHIFTED_FIT_TEST(Template, 4, Type, v); v >>= 1; PRIVATE_POS_SHIFTED_FIT_TEST(Template, 5, Type, v); v >>= 1; \
+ PRIVATE_POS_SHIFTED_FIT_TEST(Template, 6, Type, v); v >>= 1; PRIVATE_POS_SHIFTED_FIT_TEST(Template, 7, Type, v); v >>= 1; \
+ PRIVATE_POS_SHIFTED_FIT_TEST(Template, 8, Type, v); v >>= 1; PRIVATE_POS_SHIFTED_FIT_TEST(Template, 9, Type, v); v >>= 1; \
+ PRIVATE_POS_SHIFTED_FIT_TEST(Template, 10, Type, v); v >>= 1; PRIVATE_POS_SHIFTED_FIT_TEST(Template, 11, Type, v); v >>= 1; \
+ PRIVATE_POS_SHIFTED_FIT_TEST(Template, 12, Type, v); v >>= 1; PRIVATE_POS_SHIFTED_FIT_TEST(Template, 13, Type, v); v >>= 1; \
+ PRIVATE_POS_SHIFTED_FIT_TEST(Template, 14, Type, v); v >>= 1; PRIVATE_POS_SHIFTED_FIT_TEST(Template, 15, Type, v); v >>= 1; \
+ PRIVATE_POS_SHIFTED_FIT_TEST(Template, 16, Type, v); v >>= 1; PRIVATE_POS_SHIFTED_FIT_TEST(Template, 17, Type, v); v >>= 1; \
+ PRIVATE_POS_SHIFTED_FIT_TEST(Template, 18, Type, v); v >>= 1; PRIVATE_POS_SHIFTED_FIT_TEST(Template, 19, Type, v); v >>= 1; \
+ PRIVATE_POS_SHIFTED_FIT_TEST(Template, 20, Type, v); v >>= 1; PRIVATE_POS_SHIFTED_FIT_TEST(Template, 21, Type, v); v >>= 1; \
+ PRIVATE_POS_SHIFTED_FIT_TEST(Template, 22, Type, v); v >>= 1; PRIVATE_POS_SHIFTED_FIT_TEST(Template, 23, Type, v); v >>= 1; \
+ PRIVATE_POS_SHIFTED_FIT_TEST(Template, 24, Type, v); v >>= 1; PRIVATE_POS_SHIFTED_FIT_TEST(Template, 25, Type, v); v >>= 1; \
+ PRIVATE_POS_SHIFTED_FIT_TEST(Template, 26, Type, v); v >>= 1; PRIVATE_POS_SHIFTED_FIT_TEST(Template, 27, Type, v); v >>= 1; \
+ PRIVATE_POS_SHIFTED_FIT_TEST(Template, 28, Type, v); v >>= 1; PRIVATE_POS_SHIFTED_FIT_TEST(Template, 29, Type, v); v >>= 1; \
+ PRIVATE_POS_SHIFTED_FIT_TEST(Template, 30, Type, v); v >>= 1; PRIVATE_POS_SHIFTED_FIT_TEST(Template, 31, Type, v); } while ( false )
+
+#define PRIVATE_NEG_SHIFTED_FIT_TEST(Template, Number, Type, Value) BOOST_CHECK( Template < (LONG_MIN >> Number) > :: Type ( Value ) == Value )
+
+#define PRIVATE_NEG_FIT_TESTS(Template, Type, ValType, InitVal) do { ValType v = InitVal ; \
+ PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 0, Type, v); v >>= 1; PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 1, Type, v); v >>= 1; \
+ PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 2, Type, v); v >>= 1; PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 3, Type, v); v >>= 1; \
+ PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 4, Type, v); v >>= 1; PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 5, Type, v); v >>= 1; \
+ PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 6, Type, v); v >>= 1; PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 7, Type, v); v >>= 1; \
+ PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 8, Type, v); v >>= 1; PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 9, Type, v); v >>= 1; \
+ PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 10, Type, v); v >>= 1; PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 11, Type, v); v >>= 1; \
+ PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 12, Type, v); v >>= 1; PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 13, Type, v); v >>= 1; \
+ PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 14, Type, v); v >>= 1; PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 15, Type, v); v >>= 1; \
+ PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 16, Type, v); v >>= 1; PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 17, Type, v); v >>= 1; \
+ PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 18, Type, v); v >>= 1; PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 19, Type, v); v >>= 1; \
+ PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 20, Type, v); v >>= 1; PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 21, Type, v); v >>= 1; \
+ PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 22, Type, v); v >>= 1; PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 23, Type, v); v >>= 1; \
+ PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 24, Type, v); v >>= 1; PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 25, Type, v); v >>= 1; \
+ PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 26, Type, v); v >>= 1; PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 27, Type, v); v >>= 1; \
+ PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 28, Type, v); v >>= 1; PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 29, Type, v); v >>= 1; \
+ PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 30, Type, v); v >>= 1; PRIVATE_NEG_SHIFTED_FIT_TEST(Template, 31, Type, v); } while ( false )
+
+
+// Test program
+int
+test_main
+(
+ int,
+ char*[]
+)
+{
+#ifndef BOOST_NO_USING_TEMPLATE
+ using boost::int_t;
+ using boost::uint_t;
+ using boost::int_max_value_t;
+ using boost::int_min_value_t;
+ using boost::uint_value_t;
#else
-#error "These tests cannot work without Substitution-Failure-Is-Not-An-Error"
+ using namespace boost;
#endif
-// Get the extreme values for each integral type
-template < typename T >
-struct minimum_of
- : boost::mpl::integral_c< T, boost::integer_traits<T>::const_min >
-{
-};
-
-template < typename T >
-struct maximum_of
- : boost::mpl::integral_c< T, boost::integer_traits<T>::const_max >
-{
-};
-
-} // unnamed namespace
-
-
-// Check the processor-optimzed type system
-BOOST_AUTO_TEST_SUITE( optimized_type_tests )
-
-// Check the optimzed type override of a given type
-BOOST_AUTO_TEST_CASE( fast_type_test )
-{
- typedef short least_type;
- typedef boost::int_fast_t<least_type>::fast fast_type;
- typedef std::numeric_limits<least_type> least_limits;
- typedef std::numeric_limits<fast_type> fast_limits;
-
- typedef boost::fast_integral<least_type>::type real_fast_type;
-
- BOOST_MPL_ASSERT_RELATION( (boost::is_same<least_type, fast_type>::value),
- ==, false );
- BOOST_MPL_ASSERT_RELATION( (boost::is_same<fast_type,
- real_fast_type>::value), ==, true );
- BOOST_MPL_ASSERT_RELATION( fast_limits::is_specialized, ==, true );
- BOOST_MPL_ASSERT_RELATION( fast_limits::is_signed &&
- fast_limits::is_bounded, ==, true );
- BOOST_MPL_ASSERT_RELATION( fast_limits::radix, ==, 2 );
- BOOST_MPL_ASSERT_RELATION( fast_limits::digits, >=, least_limits::digits );
+ SHOW_TYPES( int_t, least );
+ SHOW_TYPES( int_t, fast );
+ SHOW_TYPES( uint_t, least );
+ SHOW_TYPES( uint_t, fast );
+ SHOW_POS_SHIFTED_TYPES( int_max_value_t, least );
+ SHOW_POS_SHIFTED_TYPES( int_max_value_t, fast );
+ SHOW_NEG_SHIFTED_TYPES( int_min_value_t, least );
+ SHOW_NEG_SHIFTED_TYPES( int_min_value_t, fast );
+ SHOW_SHIFTED_TYPES( uint_value_t, least );
+ SHOW_SHIFTED_TYPES( uint_value_t, fast );
+
+ PRIVATE_FIT_TESTS( int_t, least, long, LONG_MAX );
+ PRIVATE_FIT_TESTS( int_t, fast, long, LONG_MAX );
+ PRIVATE_FIT_TESTS( uint_t, least, unsigned long, ULONG_MAX );
+ PRIVATE_FIT_TESTS( uint_t, fast, unsigned long, ULONG_MAX );
+ PRIVATE_POS_FIT_TESTS( int_max_value_t, least, long, LONG_MAX );
+ PRIVATE_POS_FIT_TESTS( int_max_value_t, fast, long, LONG_MAX );
+ PRIVATE_NEG_FIT_TESTS( int_min_value_t, least, long, LONG_MIN );
+ PRIVATE_NEG_FIT_TESTS( int_min_value_t, fast, long, LONG_MIN );
+ PRIVATE_SHIFTED_FIT_TESTS( uint_value_t, least, unsigned long, ULONG_MAX );
+ PRIVATE_SHIFTED_FIT_TESTS( uint_value_t, fast, unsigned long, ULONG_MAX );
+
+ return boost::exit_success;
}
-
-BOOST_AUTO_TEST_SUITE_END()
-
-// Check if given types can support given size parameters
-BOOST_AUTO_TEST_SUITE( show_type_tests )
-
-// Check the specialization type status of given bit lengths, minimum
-BOOST_AUTO_TEST_CASE_TEMPLATE( show_types_for_lengths_test, T, bits_list )
-{
- BOOST_CHECK_EQUAL( print_out_template(signed_sized_integral<T::value>(),
- T::value, "a sized_integral<", ", signed>"), T::value && (T::value <=
- intmax_bits) );
- BOOST_CHECK_EQUAL( print_out_template(unsigned_sized_integral<T::value>(),
- T::value, "a sized_integral<", ", unsigned>"), T::value <= uintmax_bits );
-}
-
-// Check the classic specialization type status of given bit lengths, minimum,
-// unsigned
-BOOST_AUTO_TEST_CASE_TEMPLATE( show_types_for_classic_lengths_unsigned_test, T,
- valid_bits_list )
-{
- // This test is supposed to replace the following printouts given in
- // puesdo-code by:
- // Routine: Template, Type
- // for N := 32 downto 0
- // cout << "Type '" << Template << "<" N << ">::" << Type << "' is '"
- // << typeid(Template<N>::Type).name << ".'\n"
- // end for
- // end Routine
- // with Template = {int_t, uint_t}; Type = {least, fast}
- // But now we'll use template meta-programming instead of macros. The limit
- // of type-lists is usually less than 32 (not to mention 64) elements, so we
- // have to take selected values. The only interesting part is if the bit
- // count is too large, and we can't check that yet.
- BOOST_MPL_ASSERT_RELATION( std::numeric_limits<typename
- boost::uint_t<T::value>::least>::digits, >=, T::value );
- BOOST_MPL_ASSERT_RELATION( std::numeric_limits<typename
- boost::uint_t<T::value>::fast>::digits, >=, T::value );
-}
-
-// Check the classic specialization type status of given bit lengths, minimum,
-// signed
-BOOST_AUTO_TEST_CASE_TEMPLATE( show_types_for_classic_lengths_signed_test, T,
- valid_to_decrease_bits_list )
-{
- BOOST_MPL_ASSERT_RELATION( std::numeric_limits<typename
- boost::int_t<T::value>::least>::digits, >=, T::value - 1 );
- BOOST_MPL_ASSERT_RELATION( std::numeric_limits<typename
- boost::int_t<T::value>::fast>::digits, >=, T::value - 1 );
-}
-
-// Check size comparisons of given value support, unsigned
-BOOST_AUTO_TEST_CASE_TEMPLATE( show_types_for_shifted_unsigned_values_test, T,
- valid_to_increase_ubits_list )
-{
- // This test is supposed to replace the following printouts given in
- // puesdo-code by:
- // Routine: Type
- // for N := 30 downto 0
- // cout << "Type '" << uint_value_t << "<" (1ul << N) << ">::" << Type
- // << "' is '"<< typeid(uint_value_t<(1ul << N)>::Type).name << ".'\n"
- // end for
- // end Routine
- // with Type = {least, fast}
- // But now we'll use template meta-programming instead of macros. The limit
- // of type-lists is usually less than 32 (not to mention 64) elements, so we
- // have to take selected values. The interesting parts are where N is the
- // length of a integral type, so 1 << N would have to fit in the next larger
- // type. (This is why N can't be more than bitlength(uintmax_t) - 1.)
- boost::uintmax_t const one = 1u;
-
- BOOST_MPL_ASSERT( (boost::mpl::equal< boost::maximum_unsigned_integral<(one
- << T::value)>, unsigned_sized_integral<T::value + 1> >) );
-}
-
-// Check size comparisons of given value support, signed
-BOOST_AUTO_TEST_CASE_TEMPLATE( show_types_for_shifted_signed_values_test, T,
- valid_to_increase_sbits_list )
-{
- // This test is supposed to replace the following printouts given in
- // puesdo-code by:
- // Routine: Type
- // for N := 30 downto 0
- // cout << "Type '" << int_max_value_t << "<" +(1ul << N) << ">::" <<
- // Type << "' is '" << typeid(int_max_value_t<+(1ul << N)>::Type).name
- // << ".'\n"
- // cout << "Type '" << int_min_value_t << "<" -(1ul << N) << ">::" <<
- // Type << "' is '" << typeid(int_min_value_t<-(1ul << N)>::Type).name
- // << ".'\n"
- // end for
- // end Routine
- // with Type = {least, fast}
- // But now we'll use template meta-programming instead of macros. The limit
- // of type-lists is usually less than 32 (not to mention 64) elements, so we
- // have to take selected values. The interesting parts are where N is the
- // length of a integral type, so 1 << N would have to fit in the next larger
- // type. (This is why N can't be more than bitlength(intmax_t) - 1. Note
- // that bitlength(intmax_t) + 1 == bitlength(uintmax_t).)
- static boost::intmax_t const one = 1;
-
- BOOST_MPL_ASSERT( (boost::mpl::equal< boost::maximum_signed_integral<+(one
- << T::value)>, signed_sized_integral<T::value + 1> >) );
- BOOST_MPL_ASSERT( (boost::mpl::equal< boost::minimum_signed_integral<-(one
- << T::value)>, signed_sized_integral<T::value + 1> >) );
-}
-
-// Check the specialization type status of given bit lengths, exact only
-BOOST_AUTO_TEST_CASE_TEMPLATE( show_types_for_exact_lengths_test, T, bits_list )
-{
- bool const is_exact_length = std::binary_search( integral_bit_lengths,
- integral_bit_lengths + integral_type_count, T::value );
-
- BOOST_CHECK_EQUAL( print_out_template(signed_exact_integral<T::value>(),
- T::value, "an exact_integral<", ", signed>"), is_exact_length );
- BOOST_CHECK_EQUAL( print_out_template(unsigned_exact_integral<T::value>(),
- T::value, "an exact_integral<", ", unsigned>"), is_exact_length );
-}
-
-// Check the classic specialization type status of given bit lengths, exact only
-BOOST_AUTO_TEST_CASE_TEMPLATE( show_types_for_classic_exact_lengths_test, T,
- distinct_integral_bit_counts )
-{
- BOOST_MPL_ASSERT_RELATION( std::numeric_limits<typename
- boost::int_exact_t<T::value>::exact>::digits, ==, T::value - 1 );
- BOOST_MPL_ASSERT_RELATION( std::numeric_limits<typename
- boost::uint_exact_t<T::value>::exact>::digits, ==, T::value );
-}
-
-// Check if MPL-compatible templates give bad returns for out-of-range values
-BOOST_AUTO_TEST_CASE( show_not_type_for_parameter_test )
-{
- typedef signed_sized_integral< 3> ssz3_type;
- typedef signed_sized_integral< 0> ssz0_type;
- typedef signed_sized_integral<-3> ssz3n_type;
-
- BOOST_CHECK( print_out_template(ssz3_type(), ssz3_type::bit_count,
- "a sized_integral<", ", signed>") );
- BOOST_CHECK( !print_out_template(ssz0_type(), ssz0_type::bit_count,
- "a sized_integral<", ", signed>") );
- BOOST_CHECK( !print_out_template(ssz3n_type(), ssz3n_type::bit_count,
- "a sized_integral<", ", signed>") );
-
- typedef unsigned_sized_integral< 3> usz3_type;
- typedef unsigned_sized_integral< 0> usz0_type;
- typedef unsigned_sized_integral<-3> usz3n_type;
-
- BOOST_CHECK( print_out_template(usz3_type(), usz3_type::bit_count,
- "a sized_integral<", ", unsigned>") );
- BOOST_CHECK( print_out_template(usz0_type(), usz0_type::bit_count,
- "a sized_integral<", ", unsigned>") );
- BOOST_CHECK( !print_out_template(usz3n_type(), usz3n_type::bit_count,
- "a sized_integral<", ", unsigned>") );
-
- typedef signed_exact_integral< CHAR_BIT > se8_type;
- typedef signed_exact_integral< 3> se3_type;
- typedef signed_exact_integral< 0> se0_type;
- typedef signed_exact_integral<-3> se3n_type;
- typedef signed_exact_integral< - CHAR_BIT > se8n_type;
-
- BOOST_CHECK( print_out_template(se8_type(), se8_type::bit_count,
- "an exact_integral<", ", signed>") );
- BOOST_CHECK( !print_out_template(se3_type(), se3_type::bit_count,
- "an exact_integral<", ", signed>") );
- BOOST_CHECK( !print_out_template(se0_type(), se0_type::bit_count,
- "an exact_integral<", ", signed>") );
- BOOST_CHECK( !print_out_template(se3n_type(), se3n_type::bit_count,
- "an exact_integral<", ", signed>") );
- BOOST_CHECK( !print_out_template(se8n_type(), se8n_type::bit_count,
- "an exact_integral<", ", signed>") );
-
- typedef unsigned_exact_integral< CHAR_BIT > ue8_type;
- typedef unsigned_exact_integral< 3> ue3_type;
- typedef unsigned_exact_integral< 0> ue0_type;
- typedef unsigned_exact_integral<-3> ue3n_type;
- typedef unsigned_exact_integral< - CHAR_BIT > ue8n_type;
-
- BOOST_CHECK( print_out_template(ue8_type(), ue8_type::bit_count,
- "an exact_integral<", ", unsigned>") );
- BOOST_CHECK( !print_out_template(ue3_type(), ue3_type::bit_count,
- "an exact_integral<", ", unsigned>") );
- BOOST_CHECK( !print_out_template(ue0_type(), ue0_type::bit_count,
- "an exact_integral<", ", unsigned>") );
- BOOST_CHECK( !print_out_template(ue3n_type(), ue3n_type::bit_count,
- "an exact_integral<", ", unsigned>") );
- BOOST_CHECK( !print_out_template(ue8n_type(), ue8n_type::bit_count,
- "an exact_integral<", ", unsigned>") );
-
- typedef boost::maximum_signed_integral< 15> max15_type;
- typedef boost::maximum_signed_integral< 0> max0_type;
- typedef boost::maximum_signed_integral<-15> max15n_type;
-
- BOOST_CHECK( print_out_template(max15_type(), max15_type::bound,
- "a maximum_signed_integral<", ">") );
- BOOST_CHECK( !print_out_template(max0_type(), max0_type::bound,
- "a maximum_signed_integral<", ">") );
- BOOST_CHECK( !print_out_template(max15n_type(), max15n_type::bound,
- "a maximum_signed_integral<", ">") );
-
- typedef boost::minimum_signed_integral< 15> min15_type;
- typedef boost::minimum_signed_integral< 0> min0_type;
- typedef boost::minimum_signed_integral<-15> min15n_type;
-
- BOOST_CHECK( !print_out_template(min15_type(), min15_type::bound,
- "a minimum_signed_integral<", ">") );
- BOOST_CHECK( !print_out_template(min0_type(), min0_type::bound,
- "a minimum_signed_integral<", ">") );
- BOOST_CHECK( print_out_template(min15n_type(), min15n_type::bound,
- "a minimum_signed_integral<", ">") );
-
- typedef boost::maximum_unsigned_integral<15> umax15_type;
- typedef boost::maximum_unsigned_integral< 0> umax0_type;
-
- BOOST_CHECK( print_out_template(umax15_type(), umax15_type::bound,
- "a maximum_unsigned_integral<", ">") );
- BOOST_CHECK( print_out_template(umax0_type(), umax0_type::bound,
- "a maximum_unsigned_integral<", ">") );
-}
-
-BOOST_AUTO_TEST_SUITE_END()
-
-// Check if given constants can fit in given types
-BOOST_AUTO_TEST_SUITE( fit_type_tests )
-
-// Check if large value can fit its minimum required size, by size
-BOOST_AUTO_TEST_CASE_TEMPLATE( fit_for_masked_values_test, T,
- valid_to_decrease_bits_list )
-{
- // This test is supposed to replace the following checks given in
- // puesdo-code by:
- // Routine: Template, Type
- // for ( N = 32, V = Template:Max ; N >= 0 ; --N, V >>= 1 )
- // Confirm( static_cast<typename Template<N>::Type>(V) == V );
- // end for
- // end Routine
- // with Template = {int_t, uint_t}; Type = {least, fast};
- // Template:Max = { intmax_t.Max for int_t, uintmax_t.Max for uint_t }
- // In other words, the selected type doesn't mask out any bits it's not
- // supposed to. But now we'll use template meta-programming instead of
- // macros. The limit of type-lists is usually less than 32 (not to mention
- // 64) elements, so we have to take selected values.
- static int const count = T::value;
- int const shift = uintmax_bits - count;
- boost::uintmax_t const value_u = uintmax_limits::max
- BOOST_PREVENT_MACRO_SUBSTITUTION () >> shift;
- boost::intmax_t const value_s = intmax_limits::max
- BOOST_PREVENT_MACRO_SUBSTITUTION () >> shift;
-
- BOOST_CHECK_EQUAL( static_cast<typename
- unsigned_sized_integral<count>::type>(value_u), value_u );
- BOOST_CHECK_EQUAL( static_cast<typename
- boost::uint_t<count>::least>(value_u), value_u );
- BOOST_CHECK_EQUAL( static_cast<typename
- boost::uint_t<count>::fast>(value_u), value_u );
-
- BOOST_CHECK_EQUAL( static_cast<typename
- signed_sized_integral<count>::type>(value_s), value_s );
- BOOST_CHECK_EQUAL( static_cast<typename
- boost::int_t<count>::least>(value_s), value_s );
- BOOST_CHECK_EQUAL( static_cast<typename
- boost::int_t<count>::fast>(value_s), value_s );
-}
-
-// Check if a large value can only fit of its exact bit length
-BOOST_AUTO_TEST_CASE_TEMPLATE( fit_for_exact_lengths_test, T,
- distinct_integral_bit_counts )
-{
- typename boost::exact_integral<T::value, unsigned>::type const one_u( 1u ),
- high_bit_u( one_u << (T::value - 1) ), repeated_bits_u( (high_bit_u << 1) |
- high_bit_u );
-
- BOOST_CHECK( high_bit_u );
- BOOST_CHECK_EQUAL( repeated_bits_u, high_bit_u );
-
- typename boost::exact_integral<T::value, signed>::type const one_s( 1 ),
- high_bit_s( one_s << (T::value - 2) ), repeated_bits_s( (high_bit_s << 1) |
- high_bit_s ), repeated_2bits_s( (repeated_bits_s << 1) | high_bit_s );
-
- BOOST_CHECK( high_bit_s > 0 );
- BOOST_CHECK( repeated_bits_s < 0 );
- BOOST_CHECK_EQUAL( repeated_bits_s, repeated_2bits_s );
-}
-
-// Check if large value can fit its minimum required size, by value, unsigned
-BOOST_AUTO_TEST_CASE_TEMPLATE( fit_for_shifted_unsigned_values_test, T,
- valid_to_increase_ubits_list )
-{
- // This test is supposed to replace the following checks given in
- // puesdo-code by:
- // Routine: Template, Type
- // for ( N = 0, V = Template:Extreme ; N < 32 ; ++N, V >>= 1 )
- // Confirm( static_cast<typename Template<V>::Type>(V) == V );
- // end for
- // end Routine
- // with Template = {uint_value_t}; Type = {least, fast}; Template:Extreme =
- // {uintmax_t.Max for uint_value_t}
- // In other words, the selected type doesn't mask out any bits it's not
- // supposed to. But now we'll use template meta-programming instead of
- // macros. The limit of type-lists is usually less than 32 (not to mention
- // 64) elements, so we have to take selected values.
- using boost::uintmax_t;
-
- typedef boost::mpl::shift_right<maximum_of<uintmax_t>, T> maxi_type;
-
- uintmax_t const maxi = maxi_type::value;
-
- BOOST_CHECK_EQUAL( static_cast<typename
- boost::uint_value_t<maxi_type::value>::least>(maxi), maxi );
- BOOST_CHECK_EQUAL( static_cast<typename
- boost::uint_value_t<maxi_type::value>::fast>(maxi), maxi );
-}
-
-// Check if large value can fit its minimum required size, by value, signed
-BOOST_AUTO_TEST_CASE_TEMPLATE( fit_for_shifted_signed_values_test, T,
- valid_to_increase_sbits_list )
-{
- // This test is supposed to replace the following checks given in
- // puesdo-code by:
- // Routine: Template, Type
- // for ( N = 0, V = Template:Extreme ; N < 32 ; ++N, V >>= 1 )
- // Confirm( static_cast<typename Template<V>::Type>(V) == V );
- // end for
- // end Routine
- // with Template = {int_max_value_t, int_min_value_t}; Type = {least, fast};
- // Template:Extreme = {intmax_t.Min for int_min_value_t, intmax_t.Max
- // for int_max_value_t}
- // In other words, the selected type doesn't mask out any bits it's not
- // supposed to. But now we'll use template meta-programming instead of
- // macros. The limit of type-lists is usually less than 32 (not to mention
- // 64) elements, so we have to take selected values.
- using boost::intmax_t;
-
- typedef boost::mpl::shift_right<minimum_of<intmax_t>, T> mini_type;
- typedef boost::mpl::shift_right<maximum_of<intmax_t>, T> maxi_type;
-
- intmax_t const maxi = maxi_type::value, mini = mini_type::value;
-
- BOOST_CHECK_EQUAL( static_cast<typename
- boost::int_max_value_t<maxi_type::value>::least>(maxi), maxi );
- BOOST_CHECK_EQUAL( static_cast<typename
- boost::int_max_value_t<maxi_type::value>::fast>(maxi), maxi );
-
- BOOST_CHECK_EQUAL( static_cast<typename
- boost::int_min_value_t<mini_type::value>::least>(mini), mini );
- BOOST_CHECK_EQUAL( static_cast<typename
- boost::int_min_value_t<mini_type::value>::fast>(mini), mini );
-}
-
-BOOST_AUTO_TEST_SUITE_END()
-
-// Verification of bugs and their fixes
-BOOST_AUTO_TEST_SUITE( bug_fix_tests )
-
-BOOST_AUTO_TEST_SUITE_END()
Deleted: trunk/libs/integer/test/issue_2134.cpp
==============================================================================
--- trunk/libs/integer/test/issue_2134.cpp 2009-11-11 13:57:24 EST (Wed, 11 Nov 2009)
+++ (empty file)
@@ -1,33 +0,0 @@
-// boost Issue #2134 test program ------------------------------------------//
-
-// Copyright Daryle Walker 2008. Distributed under the Boost
-// Software License, Version 1.0. (See the accompanying file
-// LICENSE_1_0.txt or a copy at <http://www.boost.org/LICENSE_1_0.txt>.)
-
-// See <http://www.boost.org/libs/integer> for documentation.
-// See <http://svn.boost.org/trac/boost/ticket/2134> for the issue involved.
-
-// Revision History
-// 23 Jul 2008 Initial version
-
-// Control if the inclusion error is triggered
-#ifndef CONTROL_INCLUDE_TRAITS
-#define CONTROL_INCLUDE_TRAITS 1
-#endif
-
-#if CONTROL_INCLUDE_TRAITS
-// This file defines boost::detail::integer_traits.
-#include <boost/detail/numeric_traits.hpp>
-#endif
-
-// This is the file with the issue. It has items within the boost::detail
-// namespace that referenced an unadorned "integer_traits". This was meant to
-// refer to boost::integer_traits. However, <boost/detail/numeric_traits.hpp>
-// defines a boost::detail::integer_traits. If that header is #included before
-// this one, then b.d.integer_traits (rightfully) took priority, which lead to a
-// syntax error.
-#include <boost/integer.hpp>
-
-
-// Main program, minimal (since this is a compile test)
-int main() { return 0; }
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk