From 0efe5cf57e524aa197fbb57aee8a5548cb32f34a Mon Sep 17 00:00:00 2001 From: David Ostrovsky Date: Thu, 7 Feb 2013 00:13:33 +0100 Subject: ORowSetValue: move float and double to union MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Ic5de8ad2cf9ef1143b1a5468e5fc5c9974aca5ec Reviewed-on: https://gerrit.libreoffice.org/2021 Tested-by: LibreOffice gerrit bot Reviewed-by: Caolán McNamara Tested-by: Caolán McNamara --- connectivity/inc/connectivity/FValue.hxx | 5 +- .../qa/connectivity/commontools/FValue_test.cxx | 44 ++++++++ connectivity/source/commontools/FValue.cxx | 124 +++++++++------------ 3 files changed, 98 insertions(+), 75 deletions(-) (limited to 'connectivity') diff --git a/connectivity/inc/connectivity/FValue.hxx b/connectivity/inc/connectivity/FValue.hxx index 3f72b41e7323..02b4a4ba390b 100644 --- a/connectivity/inc/connectivity/FValue.hxx +++ b/connectivity/inc/connectivity/FValue.hxx @@ -60,9 +60,12 @@ namespace connectivity sal_Int64 m_nInt64; sal_uInt64 m_uInt64; + float m_nFloat; + double m_nDouble; + rtl_uString* m_pString; - void* m_pValue; // can contains double, etc + void* m_pValue; // date/time/timestamp/sequence } m_aValue; sal_Int32 m_eTypeKind; // the database type diff --git a/connectivity/qa/connectivity/commontools/FValue_test.cxx b/connectivity/qa/connectivity/commontools/FValue_test.cxx index be3024e32c9d..b460f646ded5 100644 --- a/connectivity/qa/connectivity/commontools/FValue_test.cxx +++ b/connectivity/qa/connectivity/commontools/FValue_test.cxx @@ -43,6 +43,9 @@ public: void test_Int64(); void test_uInt64(); + void test_float(); + void test_double(); + CPPUNIT_TEST_SUITE(FValueTest); CPPUNIT_TEST(test_Bool); @@ -59,6 +62,9 @@ public: CPPUNIT_TEST(test_Int64); CPPUNIT_TEST(test_uInt64); + CPPUNIT_TEST(test_float); + CPPUNIT_TEST(test_double); + CPPUNIT_TEST_SUITE_END(); }; @@ -239,6 +245,44 @@ void FValueTest::test_uInt64() CPPUNIT_ASSERT_MESSAGE("sal_uInt64 conversion from Any didn't work", src_saluInt64 == trg_saluInt64); } +void FValueTest::test_float() +{ + float src_float = 1.234f; + ORowSetValue v(src_float); + float trg_float = v.getFloat(); + + std::cerr << "src_float: " << src_float << std::endl; + std::cerr << "trg_float: " << trg_float << std::endl; + + CPPUNIT_ASSERT_MESSAGE("float conversion to ORowSetValue didn't work", src_float == trg_float); + + Any any_float = v.makeAny(); + ORowSetValue t; + t.fill(any_float); + trg_float = t.getFloat(); + + CPPUNIT_ASSERT_MESSAGE("float conversion from Any didn't work", src_float == trg_float); +} + +void FValueTest::test_double() +{ + double src_double = 1.23456789; + ORowSetValue v(src_double); + double trg_double = v.getDouble(); + + std::cerr << "src_double: " << src_double << std::endl; + std::cerr << "trg_double: " << trg_double << std::endl; + + CPPUNIT_ASSERT_MESSAGE("double conversion to ORowSetValue didn't work", src_double == trg_double); + + Any any_double = v.makeAny(); + ORowSetValue t; + t.fill(any_double); + trg_double = t.getDouble(); + + CPPUNIT_ASSERT_MESSAGE("double conversion from Any didn't work", src_double == trg_double); +} + CPPUNIT_TEST_SUITE_REGISTRATION(FValueTest); }} diff --git a/connectivity/source/commontools/FValue.cxx b/connectivity/source/commontools/FValue.cxx index e4580ddc52cd..fef5087e8ca8 100644 --- a/connectivity/source/commontools/FValue.cxx +++ b/connectivity/source/commontools/FValue.cxx @@ -274,17 +274,6 @@ void ORowSetValue::free() rtl_uString_release(m_aValue.m_pString); m_aValue.m_pString = NULL; break; - case DataType::FLOAT: - delete (float*)m_aValue.m_pValue; - TRACE_FREE( float ) - m_aValue.m_pValue = NULL; - break; - case DataType::DOUBLE: - case DataType::REAL: - delete (double*)m_aValue.m_pValue; - TRACE_FREE( double ) - m_aValue.m_pValue = NULL; - break; case DataType::DATE: delete (::com::sun::star::util::Date*)m_aValue.m_pValue; TRACE_FREE( Date ) @@ -320,6 +309,9 @@ void ORowSetValue::free() case DataType::INTEGER: case DataType::BIGINT: case DataType::BOOLEAN: + case DataType::FLOAT: + case DataType::DOUBLE: + case DataType::REAL: break; default: if ( m_aValue.m_pValue ) @@ -359,15 +351,6 @@ ORowSetValue& ORowSetValue::operator=(const ORowSetValue& _rRH) rtl_uString_acquire(_rRH.m_aValue.m_pString); m_aValue.m_pString = _rRH.m_aValue.m_pString; break; - case DataType::FLOAT: - m_aValue.m_pValue = new float(*(float*)_rRH.m_aValue.m_pValue); - TRACE_ALLOC( float ) - break; - case DataType::DOUBLE: - case DataType::REAL: - m_aValue.m_pValue = new double(*(double*)_rRH.m_aValue.m_pValue); - TRACE_ALLOC( double ) - break; case DataType::DATE: m_aValue.m_pValue = new Date(*(Date*)_rRH.m_aValue.m_pValue); TRACE_ALLOC( Date ) @@ -414,6 +397,13 @@ ORowSetValue& ORowSetValue::operator=(const ORowSetValue& _rRH) else m_aValue.m_uInt64 = _rRH.m_aValue.m_uInt64; break; + case DataType::FLOAT: + m_aValue.m_nFloat = _rRH.m_aValue.m_nFloat; + break; + case DataType::DOUBLE: + case DataType::REAL: + m_aValue.m_nDouble = _rRH.m_aValue.m_nDouble; + break; default: m_aValue.m_pValue = new Any(*(Any*)_rRH.m_aValue.m_pValue); TRACE_ALLOC( Any ) @@ -430,13 +420,6 @@ ORowSetValue& ORowSetValue::operator=(const ORowSetValue& _rRH) case DataType::LONGVARCHAR: (*this) = ::rtl::OUString(_rRH.m_aValue.m_pString); break; - case DataType::FLOAT: - (*this) = *(float*)_rRH.m_aValue.m_pValue; - break; - case DataType::DOUBLE: - case DataType::REAL: - (*this) = *(double*)_rRH.m_aValue.m_pValue; - break; case DataType::DATE: (*this) = *(Date*)_rRH.m_aValue.m_pValue; break; @@ -479,6 +462,13 @@ ORowSetValue& ORowSetValue::operator=(const ORowSetValue& _rRH) else m_aValue.m_uInt64 = _rRH.m_aValue.m_uInt64; break; + case DataType::FLOAT: + m_aValue.m_nFloat = _rRH.m_aValue.m_nFloat; + break; + case DataType::DOUBLE: + case DataType::REAL: + m_aValue.m_nDouble = _rRH.m_aValue.m_nDouble; + break; default: (*(Any*)m_aValue.m_pValue) = (*(Any*)_rRH.m_aValue.m_pValue); } @@ -564,18 +554,12 @@ ORowSetValue& ORowSetValue::operator=(const ::rtl::OUString& _rRH) ORowSetValue& ORowSetValue::operator=(const double& _rRH) { - if( !isStorageCompatible(m_eTypeKind,DataType::DOUBLE) ) + if(m_eTypeKind != DataType::DOUBLE) free(); - if(m_bNull) - { - m_aValue.m_pValue = new double(_rRH); - TRACE_ALLOC( double ) - m_eTypeKind = DataType::DOUBLE; - m_bNull = sal_False; - } - else - *(double*)m_aValue.m_pValue = _rRH; + m_aValue.m_nDouble = _rRH; + m_eTypeKind = DataType::DOUBLE; + m_bNull = sal_False; return *this; } @@ -585,15 +569,9 @@ ORowSetValue& ORowSetValue::operator=(const float& _rRH) if(m_eTypeKind != DataType::FLOAT) free(); - if(m_bNull) - { - m_aValue.m_pValue = new float(_rRH); - TRACE_ALLOC( float ) - m_eTypeKind = DataType::FLOAT; - m_bNull = sal_False; - } - else - *(float*)m_aValue.m_pValue = _rRH; + m_aValue.m_nFloat = _rRH; + m_eTypeKind = DataType::FLOAT; + m_bNull = sal_False; return *this; } @@ -839,11 +817,11 @@ bool ORowSetValue::operator==(const ORowSetValue& _rRH) const } break; case DataType::FLOAT: - bRet = *(float*)m_aValue.m_pValue == *(float*)_rRH.m_aValue.m_pValue; + bRet = m_aValue.m_nFloat == _rRH.m_aValue.m_nFloat; break; case DataType::DOUBLE: case DataType::REAL: - bRet = *(double*)m_aValue.m_pValue == *(double*)_rRH.m_aValue.m_pValue; + bRet = m_aValue.m_nDouble == _rRH.m_aValue.m_nDouble; break; case DataType::TINYINT: bRet = m_bSigned ? ( m_aValue.m_nInt8 == _rRH.m_aValue.m_nInt8 ) : (m_aValue.m_uInt8 == _rRH.m_aValue.m_uInt8); @@ -906,13 +884,11 @@ Any ORowSetValue::makeAny() const rValue <<= (::rtl::OUString)m_aValue.m_pString; break; case DataType::FLOAT: - OSL_ENSURE(m_aValue.m_pValue,"Value is null!"); - rValue <<= *(float*)m_aValue.m_pValue; + rValue <<= m_aValue.m_nFloat; break; case DataType::DOUBLE: case DataType::REAL: - OSL_ENSURE(m_aValue.m_pValue,"Value is null!"); - rValue <<= *(double*)m_aValue.m_pValue; + rValue <<= m_aValue.m_nDouble; break; case DataType::DATE: OSL_ENSURE(m_aValue.m_pValue,"Value is null!"); @@ -1104,11 +1080,11 @@ bool ORowSetValue::getBool() const bRet = ::rtl::OUString(m_aValue.m_pString).toInt32() != 0; break; case DataType::FLOAT: - bRet = *(float*)m_aValue.m_pValue != 0.0; + bRet = m_aValue.m_nFloat != 0.0; break; case DataType::DOUBLE: case DataType::REAL: - bRet = *(double*)m_aValue.m_pValue != 0.0; + bRet = m_aValue.m_nDouble != 0.0; break; case DataType::DATE: case DataType::TIME: @@ -1164,11 +1140,11 @@ sal_Int8 ORowSetValue::getInt8() const nRet = sal_Int8(::rtl::OUString(m_aValue.m_pString).toInt32()); break; case DataType::FLOAT: - nRet = sal_Int8(*(float*)m_aValue.m_pValue); + nRet = sal_Int8(m_aValue.m_nFloat); break; case DataType::DOUBLE: case DataType::REAL: - nRet = sal_Int8(*(double*)m_aValue.m_pValue); + nRet = sal_Int8(m_aValue.m_nDouble); break; case DataType::DATE: case DataType::TIME: @@ -1235,11 +1211,11 @@ sal_uInt8 ORowSetValue::getUInt8() const nRet = sal_uInt8(::rtl::OUString(m_aValue.m_pString).toInt32()); break; case DataType::FLOAT: - nRet = sal_uInt8(*(float*)m_aValue.m_pValue); + nRet = sal_uInt8(m_aValue.m_nFloat); break; case DataType::DOUBLE: case DataType::REAL: - nRet = sal_uInt8(*(double*)m_aValue.m_pValue); + nRet = sal_uInt8(m_aValue.m_nDouble); break; case DataType::DATE: case DataType::TIME: @@ -1310,11 +1286,11 @@ sal_Int16 ORowSetValue::getInt16() const nRet = sal_Int16(::rtl::OUString(m_aValue.m_pString).toInt32()); break; case DataType::FLOAT: - nRet = sal_Int16(*(float*)m_aValue.m_pValue); + nRet = sal_Int16(m_aValue.m_nFloat); break; case DataType::DOUBLE: case DataType::REAL: - nRet = sal_Int16(*(double*)m_aValue.m_pValue); + nRet = sal_Int16(m_aValue.m_nDouble); break; case DataType::DATE: case DataType::TIME: @@ -1381,11 +1357,11 @@ sal_uInt16 ORowSetValue::getUInt16() const nRet = sal_uInt16(::rtl::OUString(m_aValue.m_pString).toInt32()); break; case DataType::FLOAT: - nRet = sal_uInt16(*(float*)m_aValue.m_pValue); + nRet = sal_uInt16(m_aValue.m_nFloat); break; case DataType::DOUBLE: case DataType::REAL: - nRet = sal_uInt16(*(double*)m_aValue.m_pValue); + nRet = sal_uInt16(m_aValue.m_nDouble); break; case DataType::DATE: case DataType::TIME: @@ -1453,11 +1429,11 @@ sal_Int32 ORowSetValue::getInt32() const nRet = ::rtl::OUString(m_aValue.m_pString).toInt32(); break; case DataType::FLOAT: - nRet = sal_Int32(*(float*)m_aValue.m_pValue); + nRet = sal_Int32(m_aValue.m_nFloat); break; case DataType::DOUBLE: case DataType::REAL: - nRet = sal_Int32(*(double*)m_aValue.m_pValue); + nRet = sal_Int32(m_aValue.m_nDouble); break; case DataType::DATE: nRet = dbtools::DBTypeConversion::toDays(*(::com::sun::star::util::Date*)m_aValue.m_pValue); @@ -1526,11 +1502,11 @@ sal_uInt32 ORowSetValue::getUInt32() const nRet = ::rtl::OUString(m_aValue.m_pString).toInt32(); break; case DataType::FLOAT: - nRet = sal_uInt32(*(float*)m_aValue.m_pValue); + nRet = sal_uInt32(m_aValue.m_nFloat); break; case DataType::DOUBLE: case DataType::REAL: - nRet = sal_uInt32(*(double*)m_aValue.m_pValue); + nRet = sal_uInt32(m_aValue.m_nDouble); break; case DataType::DATE: nRet = dbtools::DBTypeConversion::toDays(*(::com::sun::star::util::Date*)m_aValue.m_pValue); @@ -1600,11 +1576,11 @@ sal_Int64 ORowSetValue::getLong() const nRet = ::rtl::OUString(m_aValue.m_pString).toInt64(); break; case DataType::FLOAT: - nRet = sal_Int64(*(float*)m_aValue.m_pValue); + nRet = sal_Int64(m_aValue.m_nFloat); break; case DataType::DOUBLE: case DataType::REAL: - nRet = sal_Int64(*(double*)m_aValue.m_pValue); + nRet = sal_Int64(m_aValue.m_nDouble); break; case DataType::DATE: nRet = dbtools::DBTypeConversion::toDays(*(::com::sun::star::util::Date*)m_aValue.m_pValue); @@ -1673,11 +1649,11 @@ sal_uInt64 ORowSetValue::getULong() const nRet = static_cast(::rtl::OUString(m_aValue.m_pString).toInt64()); break; case DataType::FLOAT: - nRet = sal_uInt64(*(float*)m_aValue.m_pValue); + nRet = sal_uInt64(m_aValue.m_nFloat); break; case DataType::DOUBLE: case DataType::REAL: - nRet = sal_uInt64(*(double*)m_aValue.m_pValue); + nRet = sal_uInt64(m_aValue.m_nDouble); break; case DataType::DATE: nRet = dbtools::DBTypeConversion::toDays(*(::com::sun::star::util::Date*)m_aValue.m_pValue); @@ -1747,11 +1723,11 @@ float ORowSetValue::getFloat() const nRet = ::rtl::OUString(m_aValue.m_pString).toFloat(); break; case DataType::FLOAT: - nRet = *(float*)m_aValue.m_pValue; + nRet = m_aValue.m_nFloat; break; case DataType::DOUBLE: case DataType::REAL: - nRet = (float)*(double*)m_aValue.m_pValue; + nRet = (float)m_aValue.m_nDouble; break; case DataType::DATE: nRet = (float)dbtools::DBTypeConversion::toDouble(*(::com::sun::star::util::Date*)m_aValue.m_pValue); @@ -1826,11 +1802,11 @@ double ORowSetValue::getDouble() const nRet = ::rtl::OUString(m_aValue.m_pString).toDouble(); break; case DataType::FLOAT: - nRet = *(float*)m_aValue.m_pValue; + nRet = m_aValue.m_nFloat; break; case DataType::DOUBLE: case DataType::REAL: - nRet = *(double*)m_aValue.m_pValue; + nRet = m_aValue.m_nDouble; break; case DataType::DATE: nRet = dbtools::DBTypeConversion::toDouble(*(::com::sun::star::util::Date*)m_aValue.m_pValue); -- cgit