bool wxConvertAnyToVariant(const wxAny& any, wxVariant* variant) { if ( any.IsNull() ) { variant->MakeNull(); return true; } // (signed) integer is a special case, because there is only one type // in wxAny, and two ("long" and "longlong") in wxVariant. For better // backwards compatibility, convert all values that fit in "long", // and others to "longlong". if ( wxANY_CHECK_TYPE(any, signed int) ) { #ifdef wxLongLong_t wxLongLong_t ll = 0; if ( any.GetAs(&ll) ) { // NB: Do not use LONG_MAX here. Explicitly using 32-bit // integer constraint yields more consistent behaviour across // builds. if ( ll > wxINT32_MAX || ll < wxINT32_MIN ) *variant = wxLongLong(ll); else *variant = (long) wxLongLong(ll).GetLo(); } else { return false; } #else long l; if ( any.GetAs(&l) ) *variant = l; else return false; #endif return true; }
void wxAnyTestCase::GetAs() { // // Test dynamic conversion bool res; long l = 0; short int si = 0; unsigned long ul = 0; wxString s; // Let's test against float instead of double, since the former // is not the native underlying type the code converts to, but // should still work, all the same. float f = 0.0; bool b = false; // Conversions from signed long type // The first check should be enough to make sure that the sub-type system // has not failed. res = m_anySignedLong1.GetAs(&si); CPPUNIT_ASSERT(res); CPPUNIT_ASSERT_EQUAL(si, 15); res = m_anySignedLong1.GetAs(&ul); CPPUNIT_ASSERT(res); CPPUNIT_ASSERT_EQUAL(ul, 15UL); res = m_anySignedLong1.GetAs(&s); CPPUNIT_ASSERT(res); CPPUNIT_ASSERT(s == "15"); res = m_anySignedLong1.GetAs(&f); CPPUNIT_ASSERT(res); CPPUNIT_ASSERT_DOUBLES_EQUAL(f, 15.0, FEQ_DELTA); res = m_anySignedLong1.GetAs(&b); CPPUNIT_ASSERT(res); CPPUNIT_ASSERT(b == true); // Conversions from unsigned long type res = m_anyUnsignedLong1.GetAs(&l); CPPUNIT_ASSERT(res); CPPUNIT_ASSERT(l == static_cast<signed long>(15)); res = m_anyUnsignedLong1.GetAs(&s); CPPUNIT_ASSERT(res); CPPUNIT_ASSERT(s == "15"); res = m_anyUnsignedLong1.GetAs(&f); CPPUNIT_ASSERT(res); CPPUNIT_ASSERT_DOUBLES_EQUAL(f, 15.0, FEQ_DELTA); res = m_anyUnsignedLong1.GetAs(&b); CPPUNIT_ASSERT(res); CPPUNIT_ASSERT(b == true); // Conversions from default "abc" string to other types // should not work. CPPUNIT_ASSERT(!m_anyStringString1.GetAs(&l)); CPPUNIT_ASSERT(!m_anyStringString1.GetAs(&ul)); CPPUNIT_ASSERT(!m_anyStringString1.GetAs(&f)); CPPUNIT_ASSERT(!m_anyStringString1.GetAs(&b)); // Let's test some other conversions from string that should work. wxAny anyString; anyString = "15"; res = anyString.GetAs(&l); CPPUNIT_ASSERT(res); CPPUNIT_ASSERT(l == static_cast<signed long>(15)); res = anyString.GetAs(&ul); CPPUNIT_ASSERT(res); CPPUNIT_ASSERT_EQUAL(ul, static_cast<unsigned long>(15)); res = anyString.GetAs(&f); CPPUNIT_ASSERT(res); CPPUNIT_ASSERT_DOUBLES_EQUAL(f, 15.0, FEQ_DELTA); anyString = "TRUE"; res = anyString.GetAs(&b); CPPUNIT_ASSERT(res); CPPUNIT_ASSERT(b == true); anyString = "0"; res = anyString.GetAs(&b); CPPUNIT_ASSERT(res); CPPUNIT_ASSERT(b == false); // Conversions from bool type res = m_anyBool1.GetAs(&l); CPPUNIT_ASSERT(res); CPPUNIT_ASSERT(l == static_cast<signed long>(1)); res = m_anyBool1.GetAs(&ul); CPPUNIT_ASSERT(res); CPPUNIT_ASSERT_EQUAL(ul, static_cast<unsigned long>(1)); res = m_anyBool1.GetAs(&s); CPPUNIT_ASSERT(res); CPPUNIT_ASSERT(s == "true"); CPPUNIT_ASSERT(!m_anyBool1.GetAs(&f)); // Conversions from floating point type res = m_anyDoubleDouble1.GetAs(&l); CPPUNIT_ASSERT(res); CPPUNIT_ASSERT(l == static_cast<signed long>(123)); res = m_anyDoubleDouble1.GetAs(&ul); CPPUNIT_ASSERT(res); CPPUNIT_ASSERT_EQUAL(ul, static_cast<unsigned long>(123)); res = m_anyDoubleDouble1.GetAs(&s); CPPUNIT_ASSERT(res); double d2; res = s.ToDouble(&d2); CPPUNIT_ASSERT(res); CPPUNIT_ASSERT_DOUBLES_EQUAL(d2, TEST_FLOAT_CONST, FEQ_DELTA); }