From 425eee416409ae654df52a7f77d417eb176817de Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Mon, 9 Jun 2008 22:50:55 +0000 Subject: [PATCH] correct some compatibility problems with the existing Unicode-mode code (#9513), more remains to be done (#9560) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@54060 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/datetime.h | 43 +++++++++++++++++++++------------ tests/datetime/datetimetest.cpp | 25 +++++++++++++++++++ 2 files changed, 52 insertions(+), 16 deletions(-) diff --git a/include/wx/datetime.h b/include/wx/datetime.h index 45afb33748..7da0c17a28 100644 --- a/include/wx/datetime.h +++ b/include/wx/datetime.h @@ -1088,22 +1088,39 @@ public: // the missing (in the string) fields with the values of dateDef (by // default, they will not change if they had valid values or will // default to Today() otherwise) + + // notice that we unfortunately need all those overloads because we use + // the type of the date string to select the return value of the + // function: it's wchar_t if a wide string is passed for compatibility + // with the code doing "const wxChar *p = dt.ParseFormat(_T("..."))", + // but char* in all other cases for compatibility with ANSI build which + // allowed code like "const char *p = dt.ParseFormat("...")" + // + // so we need wchar_t overload and now passing s.c_str() as first + // argument is ambiguous because it's convertible to both wxString and + // wchar_t* and now it's passing char* which becomes ambiguous as it is + // convertible to both wxString and wxCStrData hence we need char* + // overload too + // + // and to make our life more miserable we also pay for having the + // optional dateDef parameter: as it's almost never used, we want to + // allow people to omit it when specifying the end iterator output + // parameter but we still have to allow specifying dateDef too, so we + // need another overload for this + // + // FIXME: all this mess could be avoided by using some class similar to + // wxFormatString, i.e. remembering string [pointer] of any type + // and convertible to either char* or wchar_t* as wxCStrData and + // having only 1 (or 2, because of the last paragraph above) + // overload taking it, see #9560 const char *ParseFormat(const wxString& date, const wxString& format = wxDefaultDateTimeFormat, const wxDateTime& dateDef = wxDefaultDateTime, wxString::const_iterator *end = NULL); const char *ParseFormat(const wxString& date, - const char *format = wxDefaultDateTimeFormat, - const wxDateTime& dateDef = wxDefaultDateTime, - wxString::const_iterator *end = NULL) - { - return ParseFormat(date, wxString(format), dateDef, end); - } - - const char *ParseFormat(const wxString& date, - const wxString& format = wxDefaultDateTimeFormat, - wxString::const_iterator *end = NULL) + const wxString& format, + wxString::const_iterator *end) { return ParseFormat(date, format, wxDefaultDateTime, end); } @@ -1135,12 +1152,6 @@ public: return ParseFormat(wxString(date), format, dateDef); } - const char *ParseFormat(const char *date, - const char *format = wxDefaultDateTimeFormat, - const wxDateTime& dateDef = wxDefaultDateTime) - { - return ParseFormat(wxString(date), wxString(format), dateDef); - } // parse a string containing date, time or both in ISO 8601 format // diff --git a/tests/datetime/datetimetest.cpp b/tests/datetime/datetimetest.cpp index 2da45ba1d1..3e26e83549 100644 --- a/tests/datetime/datetimetest.cpp +++ b/tests/datetime/datetimetest.cpp @@ -684,6 +684,31 @@ void DateTimeTestCase::TestTimeFormat() } } } + + // test compilation of some calls which should compile (and not result in + // ambiguity because of char*<->wxCStrData<->wxString conversions) + wxDateTime dt; + wxString s("foo"); + CPPUNIT_ASSERT( !dt.ParseFormat("foo") ); + CPPUNIT_ASSERT( !dt.ParseFormat(wxT("foo")) ); + CPPUNIT_ASSERT( !dt.ParseFormat(s) ); + CPPUNIT_ASSERT( !dt.ParseFormat(s.c_str()) ); + + CPPUNIT_ASSERT( !dt.ParseFormat("foo", "%c") ); + CPPUNIT_ASSERT( !dt.ParseFormat(wxT("foo"), "%c") ); + CPPUNIT_ASSERT( !dt.ParseFormat(s, "%c") ); + CPPUNIT_ASSERT( !dt.ParseFormat(s.c_str(), "%c") ); + + CPPUNIT_ASSERT( !dt.ParseFormat("foo", wxT("%c")) ); + CPPUNIT_ASSERT( !dt.ParseFormat(wxT("foo"), wxT("%c")) ); + CPPUNIT_ASSERT( !dt.ParseFormat(s, "%c") ); + CPPUNIT_ASSERT( !dt.ParseFormat(s.c_str(), wxT("%c")) ); + + wxString spec("%c"); + CPPUNIT_ASSERT( !dt.ParseFormat("foo", spec) ); + CPPUNIT_ASSERT( !dt.ParseFormat(wxT("foo"), spec) ); + CPPUNIT_ASSERT( !dt.ParseFormat(s, spec) ); + CPPUNIT_ASSERT( !dt.ParseFormat(s.c_str(), spec) ); } void DateTimeTestCase::TestTimeSpanFormat() -- 2.47.2