From: <man...@us...> - 2015-06-05 20:13:58
|
Revision: 5254 http://sourceforge.net/p/modplug/code/5254 Author: manxorist Date: 2015-06-05 20:13:52 +0000 (Fri, 05 Jun 2015) Log Message: ----------- [Ref] The most common and useful case of mpt::String::Print is using it for our main string type, mpt::ustring. However this is the most tedious version to write: 'mpt::String::Print(MPT_USTRING("foo %1 %2"), bar, baz);'. Add a macro that simplifies this to 'MPT_UFORMAT("foo %1 %2", bar, baz);' which is way easier to type and read. MPT_FORMAT, MPT_WFORMAT and MPT_TFORMAT (for std::string, std::wstring and CString respectively) are also added. In order to support wide string literals depending on different compile time options, this has to be a variadic macro in these cases. Proper compiler feature selection macros are provided in CompilerDetect.h. The wide string versions are currently only required for OpenMPT builds and for libopenmpt MSVC builds. Existing users are not converted as there is no pressure to do so. Updating can be done gradually over time. Modified Paths: -------------- trunk/OpenMPT/common/CompilerDetect.h trunk/OpenMPT/common/mptStringFormat.h trunk/OpenMPT/test/test.cpp Modified: trunk/OpenMPT/common/CompilerDetect.h =================================================================== --- trunk/OpenMPT/common/CompilerDetect.h 2015-06-05 12:15:08 UTC (rev 5253) +++ trunk/OpenMPT/common/CompilerDetect.h 2015-06-05 20:13:52 UTC (rev 5254) @@ -202,10 +202,34 @@ #define MPT_COMPILER_HAS_RVALUE_REF 1 #endif #endif + #ifndef MPT_COMPILER_HAS_RVALUE_REF #define MPT_COMPILER_HAS_RVALUE_REF 0 #endif + +// C++11 includes variadic macros. +// C99 includes variadic macros. + +#if MPT_COMPILER_CLANG +#if MPT_CLANG_AT_LEAST(3,0,0) +#define MPT_COMPILER_HAS_VARIADIC_MACROS 1 +#endif +#elif MPT_COMPILER_MSVC +#if MPT_MSVC_AT_LEAST(2005,0) +#define MPT_COMPILER_HAS_VARIADIC_MACROS 1 +#endif +#elif MPT_COMPILER_GCC +#if MPT_GCC_AT_LEAST(3,0,0) +#define MPT_COMPILER_HAS_VARIADIC_MACROS 1 +#endif +#endif + +#ifndef MPT_COMPILER_HAS_VARIADIC_MACROS +#define MPT_COMPILER_HAS_VARIADIC_MACROS 0 +#endif + + #if MPT_MSVC_AT_LEAST(2010,0) || MPT_CLANG_AT_LEAST(3,0,0) || MPT_GCC_AT_LEAST(4,5,0) #define HAS_TYPE_TRAITS #endif Modified: trunk/OpenMPT/common/mptStringFormat.h =================================================================== --- trunk/OpenMPT/common/mptStringFormat.h 2015-06-05 12:15:08 UTC (rev 5253) +++ trunk/OpenMPT/common/mptStringFormat.h 2015-06-05 20:13:52 UTC (rev 5254) @@ -731,4 +731,44 @@ } } // namespace mpt::String +#if MPT_WSTRING_FORMAT || MPT_USTRING_MODE_WIDE || (defined(_MFC_VER) && defined(UNICODE)) +#if MPT_COMPILER_HAS_VARIADIC_MACROS +#define MPT_FORMAT_MACROS_VARIADIC 1 +#else +#error "Variadic macro support is required by MPT_FORMAT macros and it is unknown if your compiler supports those. Please tune CompilerSettings.h and/or BuildSettings.h and report an OpenMPT bug." +#endif +#else +#define MPT_FORMAT_MACROS_VARIADIC 0 +#endif + +#if MPT_FORMAT_MACROS_VARIADIC + +#define MPT_FORMAT( ... ) mpt::String::Print<std::string >( __VA_ARGS__ ) +#if MPT_WSTRING_FORMAT +#define MPT_WFORMAT( ... ) mpt::String::Print<std::wstring>( L ## __VA_ARGS__ ) +#endif +#if MPT_USTRING_MODE_WIDE +#define MPT_UFORMAT( ... ) mpt::String::Print<mpt::ustring>( L ## __VA_ARGS__ ) +#else +#define MPT_UFORMAT( ... ) mpt::String::Print<mpt::ustring>( __VA_ARGS__ ) +#endif +#if defined(_MFC_VER) +#ifdef UNICODE +#define MPT_TFORMAT( ... ) mpt::String::Print<CString >( L ## __VA_ARGS__ ) +#else +#define MPT_TFORMAT( ... ) mpt::String::Print<CString >( __VA_ARGS__ ) +#endif +#endif + +#else // !MPT_FORMAT_MACROS_VARIADIC + +#define MPT_FORMAT mpt::String::Print<std::string> +#define MPT_UFORMAT mpt::String::Print<mpt::ustring> +#if defined(_MFC_VER) +#define MPT_TFORMAT mpt::String::Print<CString> +#endif + +#endif // MPT_FORMAT_MACROS_VARIADIC + + OPENMPT_NAMESPACE_END Modified: trunk/OpenMPT/test/test.cpp =================================================================== --- trunk/OpenMPT/test/test.cpp 2015-06-05 12:15:08 UTC (rev 5253) +++ trunk/OpenMPT/test/test.cpp 2015-06-05 20:13:52 UTC (rev 5254) @@ -479,32 +479,32 @@ #endif // basic functionality - VERIFY_EQUAL(mpt::String::Print("%1%2%3",1,2,3), "123"); - VERIFY_EQUAL(mpt::String::Print("%1%1%1",1,2,3), "111"); - VERIFY_EQUAL(mpt::String::Print("%3%3%3",1,2,3), "333"); + VERIFY_EQUAL(MPT_FORMAT("%1%2%3",1,2,3), "123"); + VERIFY_EQUAL(MPT_FORMAT("%1%1%1",1,2,3), "111"); + VERIFY_EQUAL(MPT_FORMAT("%3%3%3",1,2,3), "333"); // template argument deduction of string type - VERIFY_EQUAL(mpt::String::Print(std::string("%1%2%3"),1,2,3), "123"); + VERIFY_EQUAL(MPT_FORMAT(std::string("%1%2%3"),1,2,3), "123"); #if MPT_WSTRING_FORMAT - VERIFY_EQUAL(mpt::String::Print(std::wstring(L"%1%2%3"),1,2,3), L"123"); - VERIFY_EQUAL(mpt::String::Print(L"%1%2%3",1,2,3), L"123"); + VERIFY_EQUAL(MPT_WFORMAT("%1%2%3",1,2,3), L"123"); + VERIFY_EQUAL(MPT_WFORMAT("%1%2%3",1,2,3), L"123"); #endif // escaping and error behviour of '%' - VERIFY_EQUAL(mpt::String::Print("%"), "%"); - VERIFY_EQUAL(mpt::String::Print("%%"), "%"); - VERIFY_EQUAL(mpt::String::Print("%%%"), "%%"); - VERIFY_EQUAL(mpt::String::Print("%1", "a"), "a"); - VERIFY_EQUAL(mpt::String::Print("%1%", "a"), "a%"); - VERIFY_EQUAL(mpt::String::Print("%1%%", "a"), "a%"); - VERIFY_EQUAL(mpt::String::Print("%1%%%", "a"), "a%%"); - VERIFY_EQUAL(mpt::String::Print("%%1", "a"), "%1"); - VERIFY_EQUAL(mpt::String::Print("%%%1", "a"), "%a"); - VERIFY_EQUAL(mpt::String::Print("%b", "a"), "%b"); + VERIFY_EQUAL(MPT_FORMAT("%"), "%"); + VERIFY_EQUAL(MPT_FORMAT("%%"), "%"); + VERIFY_EQUAL(MPT_FORMAT("%%%"), "%%"); + VERIFY_EQUAL(MPT_FORMAT("%1", "a"), "a"); + VERIFY_EQUAL(MPT_FORMAT("%1%", "a"), "a%"); + VERIFY_EQUAL(MPT_FORMAT("%1%%", "a"), "a%"); + VERIFY_EQUAL(MPT_FORMAT("%1%%%", "a"), "a%%"); + VERIFY_EQUAL(MPT_FORMAT("%%1", "a"), "%1"); + VERIFY_EQUAL(MPT_FORMAT("%%%1", "a"), "%a"); + VERIFY_EQUAL(MPT_FORMAT("%b", "a"), "%b"); #if defined(_MFC_VER) - VERIFY_EQUAL(mpt::String::Print(CString(_T("%1%2%3")),1,2,3), _T("123")); - VERIFY_EQUAL(mpt::String::Print(CString(_T("%1%2%3")),1,mpt::tfmt::dec0<3>(2),3), _T("10023")); + VERIFY_EQUAL(MPT_TFORMAT("%1%2%3",1,2,3), _T("123")); + VERIFY_EQUAL(MPT_TFORMAT("%1%2%3",1,mpt::tfmt::dec0<3>(2),3), _T("10023")); #endif } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |