X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3dd4d0ec9e6ccfe8a9e6e892ca21a67e1fb1b225..0fb731b8bf830e2b495b2038200ab1d2444d748d:/include/wx/longlong.h diff --git a/include/wx/longlong.h b/include/wx/longlong.h index b90bd71873..19c580110e 100644 --- a/include/wx/longlong.h +++ b/include/wx/longlong.h @@ -404,15 +404,20 @@ public: // convert to ulong with range checking in debug mode (only!) unsigned long ToULong() const { - wxASSERT_MSG( m_ll <= LONG_MAX, + wxASSERT_MSG( m_ll <= ULONG_MAX, wxT("wxULongLong to long conversion loss of precision") ); return wx_truncate_cast(unsigned long, m_ll); } // convert to double -#ifdef _MSC_VER - double ToDouble() const { return wx_truncate_cast(double, (__int64) m_ll); } + // + // For some completely obscure reasons compiling the cast below with + // VC6 in DLL builds only (!) results in "error C2520: conversion from + // unsigned __int64 to double not implemented, use signed __int64" so + // we must use a different version for that compiler. +#ifdef __VISUALC6__ + double ToDouble() const; #else double ToDouble() const { return wx_truncate_cast(double, m_ll); } #endif @@ -1081,25 +1086,60 @@ WXDLLIMPEXP_BASE class wxTextInputStream &operator>>(class wxTextInputStream &st #if wxUSE_LONGLONG_NATIVE +// VC6 is known to not have __int64 specializations of numeric_limits<> in its +// anyhow so don't bother including it, especially as it results in +// tons of warnings because the standard header itself uses obsolete template +// specialization syntax. +#ifndef __VISUALC6__ + #include namespace std { -template<> class numeric_limits - : public numeric_limits -{ -}; - -template<> class numeric_limits - : public numeric_limits -{ -}; +#ifdef __clang__ + // libstdc++ (used by Clang) uses struct for numeric_limits; unlike gcc, clang + // warns about this + template<> struct numeric_limits : public numeric_limits {}; + template<> struct numeric_limits : public numeric_limits {}; +#else + template<> class numeric_limits : public numeric_limits {}; + template<> class numeric_limits : public numeric_limits {}; +#endif } // namespace std +#endif // !VC6 + #endif // wxUSE_LONGLONG_NATIVE +// ---------------------------------------------------------------------------- +// Specialize wxArgNormalizer to allow using wxLongLong directly with wx pseudo +// vararg functions. +// ---------------------------------------------------------------------------- + +// Notice that this must be done here and not in wx/strvararg.h itself because +// we can't include wx/longlong.h from there as this header itself includes +// wx/string.h which includes wx/strvararg.h too, so to avoid the circular +// dependencies we can only do it here (or add another header just for this but +// it doesn't seem necessary). +#include "wx/strvararg.h" + +template<> +struct WXDLLIMPEXP_BASE wxArgNormalizer +{ + wxArgNormalizer(wxLongLong value, + const wxFormatString *fmt, unsigned index) + : m_value(value) + { + wxASSERT_ARG_TYPE( fmt, index, wxFormatString::Arg_LongLongInt ); + } + + wxLongLong_t get() const { return m_value.GetValue(); } + + wxLongLong m_value; +}; + #endif // wxUSE_LONGLONG #endif // _WX_LONGLONG_H