Compare commits

..

8 Commits

Author SHA1 Message Date
be6ee86efc Create branch to keep WIP patch for modular build.
[SVN r85883]
2013-09-25 08:12:19 +00:00
365d61fc4e Patch for recent versions of glibc which always assume int64_t support.
Fixes #8731.

[SVN r84950]
2013-07-04 09:13:23 +00:00
72438055a9 Extracted intptr_t and uintptr_t types to cstdint.hpp. Refs #7823.
[SVN r84805]
2013-06-16 15:02:27 +00:00
d131434ef1 Fix PDF install rule so that it's explicit and automatically invokes a PDF build when specified on the command line.
So "bjam pdfinstall" will now build and install the PDF to the current directory.
This works around some problems that the previous versions had if the user did not have an FO processor installed (basically Daniel James was unable to build the HTML docs for the distribution if the pdfinstall rule was implicit).

[SVN r79492]
2012-07-14 11:21:03 +00:00
90f779a9a3 Fix integer.hpp so a compiler error is generated when the number of bits requested is greater than the max available.
Added new tests to catch this case.

[SVN r78307]
2012-05-02 17:10:20 +00:00
1898e66238 Apply patch from Vincent Botet Escriba: fix check for size > long long.
[SVN r77109]
2012-02-24 16:57:13 +00:00
cc73477d13 Fix typo.
Refs #6003.

[SVN r76137]
2011-12-24 17:29:03 +00:00
8457bd01b1 Fix integer_traits<long long> when no macro from limits.h is available.
[SVN r68802]
2011-02-12 15:06:21 +00:00
12 changed files with 204 additions and 108 deletions

View File

@ -50,6 +50,7 @@ boostbook standalone
<format>pdf:<xsl:param>boost.url.prefix=http://www.boost.org/doc/libs/release/libs/regex/doc/html <format>pdf:<xsl:param>boost.url.prefix=http://www.boost.org/doc/libs/release/libs/regex/doc/html
; ;
install pdf-install : standalone : <location>. <install-type>PDF ; install pdfinstall : standalone/<format>pdf : <location>. <install-type>PDF ;
explicit pdfinstall ;

View File

@ -41,7 +41,10 @@
// so we disable use of stdint.h when GLIBC does not define __GLIBC_HAVE_LONG_LONG. // so we disable use of stdint.h when GLIBC does not define __GLIBC_HAVE_LONG_LONG.
// See https://svn.boost.org/trac/boost/ticket/3548 and http://sources.redhat.com/bugzilla/show_bug.cgi?id=10990 // See https://svn.boost.org/trac/boost/ticket/3548 and http://sources.redhat.com/bugzilla/show_bug.cgi?id=10990
// //
#if defined(BOOST_HAS_STDINT_H) && (!defined(__GLIBC__) || defined(__GLIBC_HAVE_LONG_LONG)) #if defined(BOOST_HAS_STDINT_H) \
&& (!defined(__GLIBC__) \
|| defined(__GLIBC_HAVE_LONG_LONG) \
|| (defined(__GLIBC__) && ((__GLIBC__ > 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 17)))))
// The following #include is an implementation artifact; not part of interface. // The following #include is an implementation artifact; not part of interface.
# ifdef __hpux # ifdef __hpux
@ -358,6 +361,40 @@ namespace boost
#endif // BOOST_HAS_STDINT_H #endif // BOOST_HAS_STDINT_H
// intptr_t/uintptr_t are defined separately because they are optional and not universally available
#if defined(BOOST_WINDOWS) && !defined(_WIN32_WCE) && !defined(BOOST_HAS_STDINT_H)
// Older MSVC don't have stdint.h and have intptr_t/uintptr_t defined in stddef.h
#include <stddef.h>
#endif
// PGI seems to not support intptr_t/uintptr_t properly. BOOST_HAS_STDINT_H is not defined for this compiler by Boost.Config.
#if !defined(__PGIC__)
#if (defined(BOOST_WINDOWS) && !defined(_WIN32_WCE)) \
|| (defined(_XOPEN_UNIX) && (_XOPEN_UNIX+0 > 0) && !defined(__UCLIBC__)) \
|| defined(__CYGWIN__) \
|| defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__) \
|| defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
namespace boost {
using ::intptr_t;
using ::uintptr_t;
}
#define BOOST_HAS_INTPTR_T
// Clang pretends to be GCC, so it'll match this condition
#elif defined(__GNUC__) && defined(__INTPTR_TYPE__) && defined(__UINTPTR_TYPE__)
namespace boost {
typedef __INTPTR_TYPE__ intptr_t;
typedef __UINTPTR_TYPE__ uintptr_t;
}
#define BOOST_HAS_INTPTR_T
#endif
#endif // !defined(__PGIC__)
#endif // BOOST_CSTDINT_HPP #endif // BOOST_CSTDINT_HPP

View File

@ -20,6 +20,7 @@
#include <boost/integer_traits.hpp> // for boost::::boost::integer_traits #include <boost/integer_traits.hpp> // for boost::::boost::integer_traits
#include <boost/limits.hpp> // for ::std::numeric_limits #include <boost/limits.hpp> // for ::std::numeric_limits
#include <boost/cstdint.hpp> // for boost::int64_t and BOOST_NO_INTEGRAL_INT64_T #include <boost/cstdint.hpp> // for boost::int64_t and BOOST_NO_INTEGRAL_INT64_T
#include <boost/static_assert.hpp>
// //
// We simply cannot include this header on gcc without getting copious warnings of the kind: // We simply cannot include this header on gcc without getting copious warnings of the kind:
@ -51,6 +52,7 @@ namespace boost
// convert category to type // convert category to type
template< int Category > struct int_least_helper {}; // default is empty template< int Category > struct int_least_helper {}; // default is empty
template< int Category > struct uint_least_helper {}; // default is empty
// specializatons: 1=long, 2=int, 3=short, 4=signed char, // specializatons: 1=long, 2=int, 3=short, 4=signed char,
// 6=unsigned long, 7=unsigned int, 8=unsigned short, 9=unsigned char // 6=unsigned long, 7=unsigned int, 8=unsigned short, 9=unsigned char
@ -65,14 +67,14 @@ namespace boost
template<> struct int_least_helper<4> { typedef short least; }; template<> struct int_least_helper<4> { typedef short least; };
template<> struct int_least_helper<5> { typedef signed char least; }; template<> struct int_least_helper<5> { typedef signed char least; };
#ifdef BOOST_HAS_LONG_LONG #ifdef BOOST_HAS_LONG_LONG
template<> struct int_least_helper<6> { typedef boost::ulong_long_type least; }; template<> struct uint_least_helper<1> { typedef boost::ulong_long_type least; };
#elif defined(BOOST_HAS_MS_INT64) #elif defined(BOOST_HAS_MS_INT64)
template<> struct int_least_helper<6> { typedef unsigned __int64 least; }; template<> struct uint_least_helper<1> { typedef unsigned __int64 least; };
#endif #endif
template<> struct int_least_helper<7> { typedef unsigned long least; }; template<> struct uint_least_helper<2> { typedef unsigned long least; };
template<> struct int_least_helper<8> { typedef unsigned int least; }; template<> struct uint_least_helper<3> { typedef unsigned int least; };
template<> struct int_least_helper<9> { typedef unsigned short least; }; template<> struct uint_least_helper<4> { typedef unsigned short least; };
template<> struct int_least_helper<10> { typedef unsigned char least; }; template<> struct uint_least_helper<5> { typedef unsigned char least; };
template <int Bits> template <int Bits>
struct exact_signed_base_helper{}; struct exact_signed_base_helper{};
@ -111,10 +113,12 @@ namespace boost
template< int Bits > // bits (including sign) required template< int Bits > // bits (including sign) required
struct int_t : public detail::exact_signed_base_helper<Bits> struct int_t : public detail::exact_signed_base_helper<Bits>
{ {
BOOST_STATIC_ASSERT_MSG(Bits <= (int)(sizeof(boost::intmax_t) * CHAR_BIT),
"No suitable signed integer type with the requested number of bits is available.");
typedef typename detail::int_least_helper typedef typename detail::int_least_helper
< <
#ifdef BOOST_HAS_LONG_LONG #ifdef BOOST_HAS_LONG_LONG
(Bits-1 <= (int)(sizeof(boost::long_long_type) * CHAR_BIT)) + (Bits <= (int)(sizeof(boost::long_long_type) * CHAR_BIT)) +
#else #else
1 + 1 +
#endif #endif
@ -130,6 +134,8 @@ namespace boost
template< int Bits > // bits required template< int Bits > // bits required
struct uint_t : public detail::exact_unsigned_base_helper<Bits> struct uint_t : public detail::exact_unsigned_base_helper<Bits>
{ {
BOOST_STATIC_ASSERT_MSG(Bits <= (int)(sizeof(boost::uintmax_t) * CHAR_BIT),
"No suitable unsigned integer type with the requested number of bits is available.");
#if (defined(__BORLANDC__) || defined(__CODEGEAR__)) && defined(BOOST_NO_INTEGRAL_INT64_T) #if (defined(__BORLANDC__) || defined(__CODEGEAR__)) && defined(BOOST_NO_INTEGRAL_INT64_T)
// It's really not clear why this workaround should be needed... shrug I guess! JM // It's really not clear why this workaround should be needed... shrug I guess! JM
BOOST_STATIC_CONSTANT(int, s = BOOST_STATIC_CONSTANT(int, s =
@ -140,11 +146,10 @@ namespace boost
(Bits <= ::std::numeric_limits<unsigned char>::digits)); (Bits <= ::std::numeric_limits<unsigned char>::digits));
typedef typename detail::int_least_helper< ::boost::uint_t<Bits>::s>::least least; typedef typename detail::int_least_helper< ::boost::uint_t<Bits>::s>::least least;
#else #else
typedef typename detail::int_least_helper typedef typename detail::uint_least_helper
< <
5 +
#ifdef BOOST_HAS_LONG_LONG #ifdef BOOST_HAS_LONG_LONG
(Bits-1 <= (int)(sizeof(boost::long_long_type) * CHAR_BIT)) + (Bits <= (int)(sizeof(boost::long_long_type) * CHAR_BIT)) +
#else #else
1 + 1 +
#endif #endif
@ -217,7 +222,7 @@ namespace boost
// It's really not clear why this workaround should be needed... shrug I guess! JM // It's really not clear why this workaround should be needed... shrug I guess! JM
#if defined(BOOST_NO_INTEGRAL_INT64_T) #if defined(BOOST_NO_INTEGRAL_INT64_T)
BOOST_STATIC_CONSTANT(unsigned, which = BOOST_STATIC_CONSTANT(unsigned, which =
6 + 1 +
(MaxValue <= ::boost::integer_traits<unsigned long>::const_max) + (MaxValue <= ::boost::integer_traits<unsigned long>::const_max) +
(MaxValue <= ::boost::integer_traits<unsigned int>::const_max) + (MaxValue <= ::boost::integer_traits<unsigned int>::const_max) +
(MaxValue <= ::boost::integer_traits<unsigned short>::const_max) + (MaxValue <= ::boost::integer_traits<unsigned short>::const_max) +
@ -225,18 +230,17 @@ namespace boost
typedef typename detail::int_least_helper< ::boost::uint_value_t<MaxValue>::which>::least least; typedef typename detail::int_least_helper< ::boost::uint_value_t<MaxValue>::which>::least least;
#else // BOOST_NO_INTEGRAL_INT64_T #else // BOOST_NO_INTEGRAL_INT64_T
BOOST_STATIC_CONSTANT(unsigned, which = BOOST_STATIC_CONSTANT(unsigned, which =
5 + 1 +
(MaxValue <= ::boost::integer_traits<boost::ulong_long_type>::const_max) + (MaxValue <= ::boost::integer_traits<boost::ulong_long_type>::const_max) +
(MaxValue <= ::boost::integer_traits<unsigned long>::const_max) + (MaxValue <= ::boost::integer_traits<unsigned long>::const_max) +
(MaxValue <= ::boost::integer_traits<unsigned int>::const_max) + (MaxValue <= ::boost::integer_traits<unsigned int>::const_max) +
(MaxValue <= ::boost::integer_traits<unsigned short>::const_max) + (MaxValue <= ::boost::integer_traits<unsigned short>::const_max) +
(MaxValue <= ::boost::integer_traits<unsigned char>::const_max)); (MaxValue <= ::boost::integer_traits<unsigned char>::const_max));
typedef typename detail::int_least_helper< ::boost::uint_value_t<MaxValue>::which>::least least; typedef typename detail::uint_least_helper< ::boost::uint_value_t<MaxValue>::which>::least least;
#endif // BOOST_NO_INTEGRAL_INT64_T #endif // BOOST_NO_INTEGRAL_INT64_T
#else #else
typedef typename detail::int_least_helper typedef typename detail::uint_least_helper
< <
5 +
#if !defined(BOOST_NO_INTEGRAL_INT64_T) && defined(BOOST_HAS_LONG_LONG) #if !defined(BOOST_NO_INTEGRAL_INT64_T) && defined(BOOST_HAS_LONG_LONG)
(MaxValue <= ::boost::integer_traits<boost::ulong_long_type>::const_max) + (MaxValue <= ::boost::integer_traits<boost::ulong_long_type>::const_max) +
#else #else

View File

@ -227,7 +227,7 @@ class integer_traits< ::boost::ulong_long_type>
template<> template<>
class integer_traits< ::boost::long_long_type> class integer_traits< ::boost::long_long_type>
: public std::numeric_limits< ::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))> public detail::integer_traits_base< ::boost::long_long_type, (1LL << (sizeof(::boost::long_long_type) * CHAR_BIT - 1)), ~(1LL << (sizeof(::boost::long_long_type) * CHAR_BIT - 1))>
{ }; { };
template<> template<>

View File

@ -22,4 +22,10 @@ test-suite integer
[ compile static_log2_include_test.cpp ] [ compile static_log2_include_test.cpp ]
[ compile static_min_max_include_test.cpp ] [ compile static_min_max_include_test.cpp ]
[ compile integer_fwd_include_test.cpp ] [ compile integer_fwd_include_test.cpp ]
[ compile-fail fail_int_exact.cpp ]
[ compile-fail fail_int_fast.cpp ]
[ compile-fail fail_int_least.cpp ]
[ compile-fail fail_uint_exact.cpp ]
[ compile-fail fail_uint_fast.cpp ]
[ compile-fail fail_uint_least.cpp ]
; ;

8
test/fail_int_exact.cpp Normal file
View File

@ -0,0 +1,8 @@
// Copyright John Maddock 2012.
// Distributed under the Boost
// Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
#include <boost/integer.hpp>
typedef boost::int_t<sizeof(boost::intmax_t)*CHAR_BIT + 1>::exact fail_int_exact;

8
test/fail_int_fast.cpp Normal file
View File

@ -0,0 +1,8 @@
// Copyright John Maddock 2012.
// Distributed under the Boost
// Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
#include <boost/integer.hpp>
typedef boost::int_t<sizeof(boost::intmax_t)*CHAR_BIT + 1>::fast fail_int_fast;

8
test/fail_int_least.cpp Normal file
View File

@ -0,0 +1,8 @@
// Copyright John Maddock 2012.
// Distributed under the Boost
// Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
#include <boost/integer.hpp>
typedef boost::int_t<sizeof(boost::intmax_t)*CHAR_BIT + 1>::least fail_int_least;

8
test/fail_uint_exact.cpp Normal file
View File

@ -0,0 +1,8 @@
// Copyright John Maddock 2012.
// Distributed under the Boost
// Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
#include <boost/integer.hpp>
typedef boost::uint_t<sizeof(boost::intmax_t)*CHAR_BIT + 1>::exact fail_uint_exact;

8
test/fail_uint_fast.cpp Normal file
View File

@ -0,0 +1,8 @@
// Copyright John Maddock 2012.
// Distributed under the Boost
// Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
#include <boost/integer.hpp>
typedef boost::uint_t<sizeof(boost::intmax_t)*CHAR_BIT + 1>::fast fail_uint_fast;

8
test/fail_uint_least.cpp Normal file
View File

@ -0,0 +1,8 @@
// Copyright John Maddock 2012.
// Distributed under the Boost
// Software License, Version 1.0. (See accompanying file
// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
#include <boost/integer.hpp>
typedef boost::uint_t<sizeof(boost::intmax_t)*CHAR_BIT + 1>::least fail_uint_least;

View File

@ -152,7 +152,7 @@ void do_test_bits()
if(boost::detail::test_errors() != last_error_count) if(boost::detail::test_errors() != last_error_count)
{ {
last_error_count = boost::detail::test_errors(); last_error_count = boost::detail::test_errors();
std::cout << "Errors occured while testing with bit count = " << Bits << std::endl; std::cout << "Errors occurred while testing with bit count = " << Bits << std::endl;
std::cout << "Type int_t<" << Bits << ">::least was " << get_name_of_type(least_int(0)) << std::endl; std::cout << "Type int_t<" << Bits << ">::least was " << get_name_of_type(least_int(0)) << std::endl;
std::cout << "Type int_t<" << Bits << ">::fast was " << get_name_of_type(fast_int(0)) << std::endl; std::cout << "Type int_t<" << Bits << ">::fast was " << get_name_of_type(fast_int(0)) << std::endl;
std::cout << "Type uint_t<" << Bits << ">::least was " << get_name_of_type(least_uint(0)) << std::endl; std::cout << "Type uint_t<" << Bits << ">::least was " << get_name_of_type(least_uint(0)) << std::endl;