forked from boostorg/config
Added new types boost::long_long_type and boost::ulong_long_type in boost/config.hpp and applied these types in place of "long long" throughout. As a result, almost all of boost now compiles cleanly with -ansi -pedantic with gcc. Changes tested with gcc 3.3, 2.95, VC7.1 and Intel 8.
[SVN r24899]
This commit is contained in:
@ -399,6 +399,21 @@ namespace std {
|
||||
# define BOOST_DEDUCED_TYPENAME
|
||||
#endif
|
||||
|
||||
// long long workaround ------------------------------------------//
|
||||
// On gcc (and maybe other compilers?) long long is alway supported
|
||||
// but it's use may generate either warnings (with -ansi), or errors
|
||||
// (with -pedantic -ansi) unless it's use is prefixed by __extension__
|
||||
//
|
||||
namespace boost{
|
||||
#ifdef __GNUC__
|
||||
__extension__ typedef long long long_long_type;
|
||||
__extension__ typedef unsigned long long ulong_long_type;
|
||||
#else
|
||||
typedef long long long_long_type;
|
||||
typedef unsigned long long ulong_long_type;
|
||||
#endif
|
||||
}
|
||||
|
||||
// BOOST_[APPEND_]EXPLICIT_TEMPLATE_[NON_]TYPE macros --------------------------//
|
||||
//
|
||||
// Some compilers have problems with function templates whose
|
||||
|
@ -24,8 +24,10 @@
|
||||
// Add missing specializations for numeric_limits:
|
||||
#ifdef BOOST_HAS_MS_INT64
|
||||
# define BOOST_LLT __int64
|
||||
# define BOOST_ULLT unsigned __int64
|
||||
#else
|
||||
# define BOOST_LLT long long
|
||||
# define BOOST_LLT ::boost::long_long_type
|
||||
# define BOOST_ULLT ::boost::ulong_long_type
|
||||
#endif
|
||||
|
||||
namespace std
|
||||
@ -84,23 +86,23 @@ namespace std
|
||||
};
|
||||
|
||||
template<>
|
||||
class numeric_limits<unsigned BOOST_LLT>
|
||||
class numeric_limits<BOOST_ULLT>
|
||||
{
|
||||
public:
|
||||
|
||||
BOOST_STATIC_CONSTANT(bool, is_specialized = true);
|
||||
#ifdef BOOST_HAS_MS_INT64
|
||||
static unsigned BOOST_LLT min BOOST_PREVENT_MACRO_SUBSTITUTION (){ return 0ui64; }
|
||||
static unsigned BOOST_LLT max BOOST_PREVENT_MACRO_SUBSTITUTION (){ return 0xFFFFFFFFFFFFFFFFui64; }
|
||||
static BOOST_ULLT min BOOST_PREVENT_MACRO_SUBSTITUTION (){ return 0ui64; }
|
||||
static BOOST_ULLT max BOOST_PREVENT_MACRO_SUBSTITUTION (){ return 0xFFFFFFFFFFFFFFFFui64; }
|
||||
#elif defined(ULLONG_MAX) && defined(ULLONG_MIN)
|
||||
static unsigned BOOST_LLT min BOOST_PREVENT_MACRO_SUBSTITUTION (){ return ULLONG_MIN; }
|
||||
static unsigned BOOST_LLT max BOOST_PREVENT_MACRO_SUBSTITUTION (){ return ULLONG_MAX; }
|
||||
static BOOST_ULLT min BOOST_PREVENT_MACRO_SUBSTITUTION (){ return ULLONG_MIN; }
|
||||
static BOOST_ULLT max BOOST_PREVENT_MACRO_SUBSTITUTION (){ return ULLONG_MAX; }
|
||||
#elif defined(ULONGLONG_MAX) && defined(ULONGLONG_MIN)
|
||||
static unsigned BOOST_LLT min BOOST_PREVENT_MACRO_SUBSTITUTION (){ return ULONGLONG_MIN; }
|
||||
static unsigned BOOST_LLT max BOOST_PREVENT_MACRO_SUBSTITUTION (){ return ULONGLONG_MAX; }
|
||||
static BOOST_ULLT min BOOST_PREVENT_MACRO_SUBSTITUTION (){ return ULONGLONG_MIN; }
|
||||
static BOOST_ULLT max BOOST_PREVENT_MACRO_SUBSTITUTION (){ return ULONGLONG_MAX; }
|
||||
#else
|
||||
static unsigned BOOST_LLT min BOOST_PREVENT_MACRO_SUBSTITUTION (){ return 0uLL; }
|
||||
static unsigned BOOST_LLT max BOOST_PREVENT_MACRO_SUBSTITUTION (){ return ~0uLL; }
|
||||
static BOOST_ULLT min BOOST_PREVENT_MACRO_SUBSTITUTION (){ return 0uLL; }
|
||||
static BOOST_ULLT max BOOST_PREVENT_MACRO_SUBSTITUTION (){ return ~0uLL; }
|
||||
#endif
|
||||
BOOST_STATIC_CONSTANT(int, digits = sizeof(BOOST_LLT) * CHAR_BIT);
|
||||
BOOST_STATIC_CONSTANT(int, digits10 = (CHAR_BIT * sizeof (BOOST_LLT)) * 301L / 1000);
|
||||
@ -108,8 +110,8 @@ namespace std
|
||||
BOOST_STATIC_CONSTANT(bool, is_integer = true);
|
||||
BOOST_STATIC_CONSTANT(bool, is_exact = true);
|
||||
BOOST_STATIC_CONSTANT(int, radix = 2);
|
||||
static unsigned BOOST_LLT epsilon() throw() { return 0; };
|
||||
static unsigned BOOST_LLT round_error() throw() { return 0; };
|
||||
static BOOST_ULLT epsilon() throw() { return 0; };
|
||||
static BOOST_ULLT round_error() throw() { return 0; };
|
||||
|
||||
BOOST_STATIC_CONSTANT(int, min_exponent = 0);
|
||||
BOOST_STATIC_CONSTANT(int, min_exponent10 = 0);
|
||||
@ -121,10 +123,10 @@ namespace std
|
||||
BOOST_STATIC_CONSTANT(bool, has_signaling_NaN = false);
|
||||
BOOST_STATIC_CONSTANT(bool, has_denorm = false);
|
||||
BOOST_STATIC_CONSTANT(bool, has_denorm_loss = false);
|
||||
static unsigned BOOST_LLT infinity() throw() { return 0; };
|
||||
static unsigned BOOST_LLT quiet_NaN() throw() { return 0; };
|
||||
static unsigned BOOST_LLT signaling_NaN() throw() { return 0; };
|
||||
static unsigned BOOST_LLT denorm_min() throw() { return 0; };
|
||||
static BOOST_ULLT infinity() throw() { return 0; };
|
||||
static BOOST_ULLT quiet_NaN() throw() { return 0; };
|
||||
static BOOST_ULLT signaling_NaN() throw() { return 0; };
|
||||
static BOOST_ULLT denorm_min() throw() { return 0; };
|
||||
|
||||
BOOST_STATIC_CONSTANT(bool, is_iec559 = false);
|
||||
BOOST_STATIC_CONSTANT(bool, is_bounded = false);
|
||||
|
@ -16,8 +16,13 @@ namespace boost_has_long_long{
|
||||
|
||||
int test()
|
||||
{
|
||||
#ifdef __GNUC__
|
||||
__extension__ long long lli = 0LL;
|
||||
__extension__ unsigned long long ulli = 0uLL;
|
||||
#else
|
||||
long long lli = 0LL;
|
||||
unsigned long long ulli = 0uLL;
|
||||
#endif
|
||||
(void)&lli;
|
||||
(void)&ulli;
|
||||
return 0;
|
||||
|
@ -23,11 +23,20 @@ struct llt
|
||||
enum{ value = m };
|
||||
};
|
||||
#else
|
||||
#ifdef __GNUC__
|
||||
__extension__
|
||||
#endif
|
||||
static const unsigned long long mask = 1uLL << 50;
|
||||
|
||||
#ifdef __GNUC__
|
||||
__extension__
|
||||
#endif
|
||||
template <unsigned long long m>
|
||||
struct llt
|
||||
{
|
||||
#ifdef __GNUC__
|
||||
__extension__
|
||||
#endif
|
||||
static const unsigned long long value = m;
|
||||
};
|
||||
#endif
|
||||
|
@ -16,8 +16,16 @@ namespace boost_no_long_long_numeric_limits{
|
||||
|
||||
int test()
|
||||
{
|
||||
if(0 == std::numeric_limits<long long>::is_specialized) return -1;
|
||||
if(0 == std::numeric_limits<unsigned long long>::is_specialized) return -1;
|
||||
#ifdef __GNUC__
|
||||
__extension__
|
||||
#endif
|
||||
typedef long long llt;
|
||||
#ifdef __GNUC__
|
||||
__extension__
|
||||
#endif
|
||||
typedef unsigned long long ullt;
|
||||
if(0 == std::numeric_limits<llt>::is_specialized) return -1;
|
||||
if(0 == std::numeric_limits<ullt>::is_specialized) return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -170,10 +170,8 @@ int test_main(int, char*[])
|
||||
typedef unsigned long unsigned_long;
|
||||
test_integral_limits(unsigned_long(), "unsigned long");
|
||||
#if defined(BOOST_HAS_LONG_LONG)
|
||||
typedef long long long_long;
|
||||
test_integral_limits(long_long(), "long long");
|
||||
typedef unsigned long long unsigned_long_long;
|
||||
test_integral_limits(unsigned_long_long(), "unsigned long long");
|
||||
test_integral_limits(::boost::long_long_type(), "long long");
|
||||
test_integral_limits(::boost::ulong_long_type(), "unsigned long long");
|
||||
#endif
|
||||
#ifdef BOOST_HAS_MS_INT64
|
||||
typedef __int64 long_long2;
|
||||
|
Reference in New Issue
Block a user