From: Jaakko Salli Date: Sun, 18 Apr 2010 11:15:26 +0000 (+0000) Subject: Fix wxAny for VC6 by removing 'wxAny& operator=(const wxVariant &variant)' for it... X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/0aaed451fd4af3e87499d5eb69433f7edbe06225 Fix wxAny for VC6 by removing 'wxAny& operator=(const wxVariant &variant)' for it. This will break some cases of implicit wxVariant->wxAny conversion (for VC6). git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@64022 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/any.h b/include/wx/any.h index 125f556f74..8ee3d3c830 100644 --- a/include/wx/any.h +++ b/include/wx/any.h @@ -772,7 +772,18 @@ public: return *this; } -#if wxUSE_VARIANT +#if wxUSE_VARIANT && (!defined(__VISUALC__) || __VISUALC__ >= 1300) + // + // Adding this operator for VC6 breaks wxAny, and also + // some cases of implicit conversion from wxVariant to wxAny. + // + // e.g. wxAny any = variant; // should work + // + // wxAny any; + // any = 16; + // any = variant; // probably doesn't work - uses template + // // assignment, most likely + // wxAny& operator=(const wxVariant &variant) { AssignVariant(variant); diff --git a/src/common/any.cpp b/src/common/any.cpp index 1e49badd81..a1e21b57c2 100644 --- a/src/common/any.cpp +++ b/src/common/any.cpp @@ -201,7 +201,13 @@ bool wxConvertAnyToVariant(const wxAny& any, wxVariant* variant) { // Check if wxAny wrapped wxVariantData* if ( !any.GetAs(&data) ) + { + // Ok, one last chance: while unlikely, it is possible that the + // wxAny actually contains wxVariant. + if ( wxANY_CHECK_TYPE(any, wxVariant) ) + *variant = wxANY_AS(any, wxVariant); return false; + } // Wrapper's GetValue() does not increase reference // count, se have to do it before the data gets passed diff --git a/src/common/variant.cpp b/src/common/variant.cpp index f297b3c4d6..0470d2d4b3 100644 --- a/src/common/variant.cpp +++ b/src/common/variant.cpp @@ -225,11 +225,10 @@ wxVariant::wxVariant(const wxAny& any) wxAny wxVariant::GetAny() const { - wxAny any; - if ( IsNull() ) - return any; + return wxAny(); + wxAny any; wxVariantData* data = GetData(); if ( data->GetAsAny(&any) ) diff --git a/tests/any/anytest.cpp b/tests/any/anytest.cpp index 6912bd622f..35e585224c 100644 --- a/tests/any/anytest.cpp +++ b/tests/any/anytest.cpp @@ -482,13 +482,16 @@ void wxAnyTestCase::wxVariantConversions() CPPUNIT_ASSERT(variant.GetType() == "ulonglong"); CPPUNIT_ASSERT(variant.GetLong() == 1000); - any = vString; + // FIXME-VC6: for VC6, any = variant needs to be any = wxAny(variant). + // Note that 'wxAny any = variant' does work, probably because + // ctor is used in that case instead of assignment operator. + any = wxAny(vString); CPPUNIT_ASSERT(any == "ABC"); res = any.GetAs(&variant); CPPUNIT_ASSERT(res); CPPUNIT_ASSERT(variant.GetString() == "ABC"); - any = vDouble; + any = wxAny(vDouble); double d = wxANY_AS(any, double); CPPUNIT_ASSERT_DOUBLES_EQUAL(d, TEST_FLOAT_CONST, FEQ_DELTA); res = any.GetAs(&variant); @@ -497,27 +500,27 @@ void wxAnyTestCase::wxVariantConversions() TEST_FLOAT_CONST, FEQ_DELTA); - any = vBool; + any = wxAny(vBool); CPPUNIT_ASSERT(wxANY_AS(any, bool) == true); res = any.GetAs(&variant); CPPUNIT_ASSERT(res); CPPUNIT_ASSERT(variant.GetBool() == true); - any = vChar; + any = wxAny(vChar); //CPPUNIT_ASSERT(wxANY_AS(any, wxUniChar) == 'A'); res = any.GetAs(&variant); CPPUNIT_ASSERT(res); CPPUNIT_ASSERT(variant.GetChar() == 'A'); #ifdef wxLongLong_t - any = vLongLong; + any = wxAny(vLongLong); CPPUNIT_ASSERT(any == wxLL(0xFFFFFFFFFF)); res = any.GetAs(&variant); CPPUNIT_ASSERT(res); CPPUNIT_ASSERT(variant.GetLongLong() == wxLongLong(wxLL(0xFFFFFFFFFF))); CPPUNIT_ASSERT(variant.GetType() == "longlong"); - any = vULongLong; + any = wxAny(vULongLong); CPPUNIT_ASSERT(any == wxLL(123456)); res = any.GetAs(&variant); CPPUNIT_ASSERT(res); @@ -526,7 +529,7 @@ void wxAnyTestCase::wxVariantConversions() // Cannot test equality for the rest, just test that they convert // back correctly. - any = vArrayString; + any = wxAny(vArrayString); res = any.GetAs(&variant); CPPUNIT_ASSERT(res); wxArrayString arrstr2 = variant.GetArrayString(); @@ -534,18 +537,18 @@ void wxAnyTestCase::wxVariantConversions() any = m_testDateTime; CPPUNIT_ASSERT(wxANY_AS(any, wxDateTime) == m_testDateTime); - any = vDateTime; + any = wxAny(vDateTime); CPPUNIT_ASSERT(wxANY_AS(any, wxDateTime) == m_testDateTime); res = any.GetAs(&variant); CPPUNIT_ASSERT(res); CPPUNIT_ASSERT(variant == m_testDateTime); - any = vVoidPtr; + any = wxAny(vVoidPtr); res = any.GetAs(&variant); CPPUNIT_ASSERT(res); CPPUNIT_ASSERT(variant.GetVoidPtr() == dummyVoidPointer); - any = vList; + any = wxAny(vList); CPPUNIT_ASSERT(wxANY_CHECK_TYPE(any, wxAnyList)); wxAnyList anyList = wxANY_AS(any, wxAnyList); CPPUNIT_ASSERT(anyList.GetCount() == 2); @@ -558,7 +561,7 @@ void wxAnyTestCase::wxVariantConversions() CPPUNIT_ASSERT(variant[0].GetLong() == 15); CPPUNIT_ASSERT(variant[1].GetString() == "abc"); - any = vCustomType; + any = wxAny(vCustomType); CPPUNIT_ASSERT(wxANY_CHECK_TYPE(any, wxVariantData*)); res = any.GetAs(&variant); CPPUNIT_ASSERT(res);