diff --git a/include/boost/cstdint.hpp b/include/boost/cstdint.hpp index d51ef8a..975d3ff 100644 --- a/include/boost/cstdint.hpp +++ b/include/boost/cstdint.hpp @@ -223,14 +223,14 @@ namespace boost # error defaults not correct; you must hand modify boost/cstdint.hpp # endif - typedef long long intmax_t; - typedef unsigned long long uintmax_t; - typedef long long int64_t; - typedef long long int_least64_t; - typedef long long int_fast64_t; - typedef unsigned long long uint64_t; - typedef unsigned long long uint_least64_t; - typedef unsigned long long uint_fast64_t; + typedef ::boost::long_long_type intmax_t; + typedef ::boost::ulong_long_type uintmax_t; + typedef ::boost::long_long_type int64_t; + typedef ::boost::long_long_type int_least64_t; + typedef ::boost::long_long_type int_fast64_t; + typedef ::boost::ulong_long_type uint64_t; + typedef ::boost::ulong_long_type uint_least64_t; + typedef ::boost::ulong_long_type uint_fast64_t; # elif ULONG_MAX != 0xffffffff diff --git a/include/boost/integer_fwd.hpp b/include/boost/integer_fwd.hpp index e2d5d38..33cfc99 100644 --- a/include/boost/integer_fwd.hpp +++ b/include/boost/integer_fwd.hpp @@ -67,10 +67,10 @@ template < > #ifdef ULLONG_MAX template < > - class integer_traits< long long >; + class integer_traits< ::boost::long_long_type>; template < > - class integer_traits< unsigned long long >; + class integer_traits< ::boost::ulong_long_type >; #endif diff --git a/include/boost/integer_traits.hpp b/include/boost/integer_traits.hpp index 26869e9..53e7089 100644 --- a/include/boost/integer_traits.hpp +++ b/include/boost/integer_traits.hpp @@ -154,53 +154,70 @@ class integer_traits #if defined(ULLONG_MAX) && defined(BOOST_HAS_LONG_LONG) template<> -class integer_traits - : public std::numeric_limits, - public detail::integer_traits_base +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 - : public std::numeric_limits, - public detail::integer_traits_base +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 : public std::numeric_limits, public detail::integer_traits_base{ }; +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 - : public std::numeric_limits, - public detail::integer_traits_base +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 - : public std::numeric_limits, - public detail::integer_traits_base +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 - : public std::numeric_limits, - public detail::integer_traits_base +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 - : public std::numeric_limits, - public detail::integer_traits_base +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 - : public std::numeric_limits, - public detail::integer_traits_base +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