X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1f5df2688450c3d5706a9600b33348197e005600..99d82720737ebf91d3a387d53dd0cf6c8cf9a643:/include/wx/strvararg.h diff --git a/include/wx/strvararg.h b/include/wx/strvararg.h index 56ea3007f7..ed16e5ed90 100644 --- a/include/wx/strvararg.h +++ b/include/wx/strvararg.h @@ -154,11 +154,15 @@ public: // n-th variadic argument desired representation ArgumentType GetArgumentType(unsigned n) const; + // returns the value passed to ctor, only converted to wxString, similarly + // to other InputAsXXX() methods + wxString InputAsString() const; + #if !wxUSE_UNICODE_WCHAR operator const char*() const - { return wx_const_cast(wxFormatString*, this)->AsChar(); } + { return const_cast(this)->AsChar(); } private: - // InputAsChar() returns the value converted passed to ctor, only converted + // InputAsChar() returns the value passed to ctor, only converted // to char, while AsChar() takes the the string returned by InputAsChar() // and does format string conversion on it as well (and similarly for // ..AsWChar() below) @@ -170,7 +174,7 @@ private: #if wxUSE_UNICODE && !wxUSE_UTF8_LOCALE_ONLY public: operator const wchar_t*() const - { return wx_const_cast(wxFormatString*, this)->AsWChar(); } + { return const_cast(this)->AsWChar(); } private: const wchar_t* InputAsWChar(); const wchar_t* AsWChar(); @@ -178,16 +182,8 @@ private: #endif // wxUSE_UNICODE && !wxUSE_UTF8_LOCALE_ONLY private: -#ifdef __VISUALC__ - // "struct 'ConvertedBuffer' needs to have dll-interface to be used by - // clients of class 'wxString'" - this is private, we don't care - #pragma warning (disable:4251) -#endif wxCharBuffer m_char; wxWCharBuffer m_wchar; -#ifdef __VISUALC__ - #pragma warning (default:4251) -#endif // NB: we can use a pointer here, because wxFormatString is only used // as function argument, so it has shorter life than the string @@ -195,7 +191,7 @@ private: const wxString * const m_str; const wxCStrData * const m_cstr; - DECLARE_NO_COPY_CLASS(wxFormatString) + DECLARE_NO_ASSIGN_CLASS(wxFormatString) }; // these two helper classes are used to find wxFormatString argument among fixed @@ -217,18 +213,40 @@ struct wxFormatStringArgument }; template -inline wxFormatStringArgument wxFindFormatStringArgument(T WXUNUSED(arg)) +struct wxFormatStringArgumentFinder { - // by default, arguments are not format strings, so return "not found" - return wxFormatStringArgument(); -} + static wxFormatStringArgument find(T) + { + // by default, arguments are not format strings, so return "not found" + return wxFormatStringArgument(); + } +}; -inline wxFormatStringArgument -wxFindFormatStringArgument(const wxFormatString& arg) +template<> +struct wxFormatStringArgumentFinder { - return wxFormatStringArgument(&arg); + static wxFormatStringArgument find(const wxFormatString& arg) + { return wxFormatStringArgument(&arg); } }; +template<> +struct wxFormatStringArgumentFinder + : public wxFormatStringArgumentFinder {}; + +// avoid passing big objects by value to wxFormatStringArgumentFinder::find() +// (and especially wx[W]CharBuffer with its auto_ptr<> style semantics!): +template<> +struct wxFormatStringArgumentFinder + : public wxFormatStringArgumentFinder {}; + +template<> +struct wxFormatStringArgumentFinder + : public wxFormatStringArgumentFinder {}; + +template<> +struct wxFormatStringArgumentFinder + : public wxFormatStringArgumentFinder {}; + // ---------------------------------------------------------------------------- // wxArgNormalizer* converters @@ -550,7 +568,7 @@ struct wxArgNormalizerNarrowChar // FIXME-UTF8: which one is better default in absence of fmt string // (i.e. when used like e.g. Foo("foo", "bar", 'c', NULL)? if ( !fmt || fmt->GetArgumentType(index) == wxFormatString::Arg_Char ) - m_value = wxUniChar(value).GetValue(); + m_value = wx_truncate_cast(T, wxUniChar(value).GetValue()); else m_value = value; } @@ -715,6 +733,15 @@ private: #define _WX_VARARG_FIXED_UNUSED_EXPAND_4(t1,t2,t3,t4) \ t1 WXUNUSED(f1), t2 WXUNUSED(f2), t3 WXUNUSED(f3), t4 WXUNUSED(f4) +#define _WX_VARARG_FIXED_TYPEDEFS_1(t1) \ + typedef t1 TF1 +#define _WX_VARARG_FIXED_TYPEDEFS_2(t1,t2) \ + _WX_VARARG_FIXED_TYPEDEFS_1(t1); typedef t2 TF2 +#define _WX_VARARG_FIXED_TYPEDEFS_3(t1,t2,t3) \ + _WX_VARARG_FIXED_TYPEDEFS_2(t1,t2); typedef t3 TF3 +#define _WX_VARARG_FIXED_TYPEDEFS_4(t1,t2,t3,t4) \ + _WX_VARARG_FIXED_TYPEDEFS_3(t1,t2,t3); typedef t4 TF4 + // This macro expands N-items tuple of fixed arguments types into part of // function's declaration. For example, // "_WX_VARARG_FIXED_EXPAND(3, (int, char*, int))" expands into @@ -730,6 +757,14 @@ private: #define _WX_VARARG_FIXED_UNUSED_EXPAND_IMPL(N, args) \ _WX_VARARG_FIXED_UNUSED_EXPAND_##N args +// Declarates typedefs for fixed arguments types; i-th fixed argument types +// will have TFi typedef. +#define _WX_VARARG_FIXED_TYPEDEFS(N, args) \ + _WX_VARARG_FIXED_TYPEDEFS_IMPL(N, args) +#define _WX_VARARG_FIXED_TYPEDEFS_IMPL(N, args) \ + _WX_VARARG_FIXED_TYPEDEFS_##N args + + // This macro calls another macro 'm' passed as second argument 'N' times, // with its only argument set to 1..N, and concatenates the results using // comma as separator. @@ -784,9 +819,11 @@ private: // And the same for fixed arguments, _not_ normalizing it: #define _WX_VARARG_PASS_FIXED(i) f##i -#define _WX_VARARG_FIND_FMT(i) (wxFindFormatStringArgument(f##i)) +#define _WX_VARARG_FIND_FMT(i) \ + (wxFormatStringArgumentFinder::find(f##i)) #define _WX_VARARG_FORMAT_STRING(numfixed, fixed) \ + _WX_VARARG_FIXED_TYPEDEFS(numfixed, fixed); \ const wxFormatString *fmt = \ (_WX_VARARG_JOIN(numfixed, _WX_VARARG_FIND_FMT))