From 715efa4e254cf811bd14617d121b92fa82d64f8c Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Tue, 17 May 2011 22:12:39 +0000 Subject: [PATCH] Allow passing wxLongLong values directly to wx pseudo-vararg functions. Allow passing wxLongLong objects when a "%lld" format specifier (or equivalent) is used just as we already do for wxString objects when "%s" is used. This is more convenient and makes wxLongLong closes to the native type. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@67760 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/longlong.h | 27 +++++++++++++++++++++++++++ include/wx/strvararg.h | 2 +- tests/strings/vararg.cpp | 18 ++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/include/wx/longlong.h b/include/wx/longlong.h index f248bb6d21..7c76d5f677 100644 --- a/include/wx/longlong.h +++ b/include/wx/longlong.h @@ -1113,6 +1113,33 @@ template<> class numeric_limits #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 diff --git a/include/wx/strvararg.h b/include/wx/strvararg.h index eff6e627cb..0bde80b3a6 100644 --- a/include/wx/strvararg.h +++ b/include/wx/strvararg.h @@ -825,7 +825,7 @@ WX_ARG_NORMALIZER_FORWARD(const signed char&, signed char); #undef WX_ARG_NORMALIZER_FORWARD #undef _WX_ARG_NORMALIZER_FORWARD_IMPL -#undef wxASSERT_ARG_TYPE +// NB: Don't #undef wxASSERT_ARG_TYPE here as it's also used in wx/longlong.h. // ---------------------------------------------------------------------------- // WX_VA_ARG_STRING diff --git a/tests/strings/vararg.cpp b/tests/strings/vararg.cpp index 56582e9a67..14fb85ff94 100644 --- a/tests/strings/vararg.cpp +++ b/tests/strings/vararg.cpp @@ -39,6 +39,9 @@ private: CPPUNIT_TEST( CharPrintf ); #if wxUSE_STD_STRING CPPUNIT_TEST( StdString ); +#endif +#if wxUSE_LONGLONG + CPPUNIT_TEST( LongLongPrintf ); #endif CPPUNIT_TEST( Sscanf ); CPPUNIT_TEST( RepeatedPrintf ); @@ -49,6 +52,9 @@ private: void CharPrintf(); #if wxUSE_STD_STRING void StdString(); +#endif +#if wxUSE_LONGLONG + void LongLongPrintf(); #endif void Sscanf(); void RepeatedPrintf(); @@ -152,6 +158,18 @@ void VarArgTestCase::StdString() } #endif // wxUSE_STD_STRING +#if wxUSE_LONGLONG +void VarArgTestCase::LongLongPrintf() +{ + const char * const llfmt = "%" wxLongLongFmtSpec "d"; + + CPPUNIT_ASSERT_EQUAL( "17", wxString::Format(llfmt, wxLL(17)) ); + + wxLongLong ll = 1234567890; + CPPUNIT_ASSERT_EQUAL( "1234567890", wxString::Format(llfmt, ll) ); +} +#endif // wxUSE_LONGLONG + void VarArgTestCase::Sscanf() { int i = 0; -- 2.45.2