connectivity/source/commontools/dbexception.cxx | 17 ++-- connectivity/source/commontools/dbtools.cxx | 73 ++++++++---------- connectivity/source/commontools/warningscontainer.cxx | 3 connectivity/source/drivers/postgresql/pq_tools.cxx | 35 ++++---- include/o3tl/any.hxx | 41 ++++++++-- scaddins/source/analysis/analysis.cxx | 3 scaddins/source/analysis/analysishelper.cxx | 14 +-- 7 files changed, 111 insertions(+), 75 deletions(-)
New commits: commit 9f0ed9d8ebdc31fe546ba280966481a0b2a6994e Author: Stephan Bergmann <sberg...@redhat.com> Date: Mon Jun 6 09:47:11 2016 +0200 Use o3tl/any.hxx in scaddins Change-Id: Ifb19d216a00db90d6a267099077f90e6c54cd942 diff --git a/scaddins/source/analysis/analysis.cxx b/scaddins/source/analysis/analysis.cxx index 3375481..b7e1c98 100644 --- a/scaddins/source/analysis/analysis.cxx +++ b/scaddins/source/analysis/analysis.cxx @@ -24,6 +24,7 @@ #include <comphelper/processfactory.hxx> #include <comphelper/random.hxx> #include <cppuhelper/supportsservice.hxx> +#include <o3tl/any.hxx> #include <osl/diagnose.h> #include <rtl/ustrbuf.hxx> #include <rtl/math.hxx> @@ -1150,7 +1151,7 @@ OUString SAL_CALL AnalysisAddIn::getComplex( double fR, double fI, const uno::An break; case uno::TypeClass_STRING: { - const OUString* pSuff = static_cast<const OUString*>(rSuff.getValue()); + auto pSuff = o3tl::forceGet<OUString>(rSuff); bi = *pSuff == "i" || pSuff->isEmpty(); if( !bi && *pSuff != "j" ) throw lang::IllegalArgumentException(); diff --git a/scaddins/source/analysis/analysishelper.cxx b/scaddins/source/analysis/analysishelper.cxx index 8c65fcb..8bb963e 100644 --- a/scaddins/source/analysis/analysishelper.cxx +++ b/scaddins/source/analysis/analysishelper.cxx @@ -22,6 +22,7 @@ #include <string.h> #include <stdio.h> +#include <o3tl/any.hxx> #include <tools/resary.hxx> #include <rtl/math.hxx> #include <sal/macros.h> @@ -1591,8 +1592,9 @@ void ScaDoubleList::Append( const uno::Any& rAny, bool bIgnoreEmpty ) throw( uno::RuntimeException, lang::IllegalArgumentException ) { - if( rAny.getValueTypeClass() == uno::TypeClass_SEQUENCE ) - Append( rAnyConv, *static_cast< const uno::Sequence< uno::Sequence< uno::Any > >* >( rAny.getValue() ), bIgnoreEmpty ); + if( auto s = o3tl::tryGet< + css::uno::Sequence<css::uno::Sequence<css::uno::Any>>>(rAny) ) + Append( rAnyConv, *s, bIgnoreEmpty ); else { double fValue; @@ -2120,10 +2122,10 @@ void ComplexList::Append( const uno::Sequence< uno::Any >& aMultPars, ComplListA case uno::TypeClass_VOID: break; case uno::TypeClass_STRING: { - const OUString* pStr = static_cast<const OUString*>(r.getValue()); + auto pStr = o3tl::forceGet<OUString>(r); if( !pStr->isEmpty() ) - Append( new Complex( *static_cast<OUString const *>(r.getValue()) ) ); + Append( new Complex( *pStr ) ); else if( bEmpty0 ) Append( new Complex( 0.0 ) ); else if( bErrOnEmpty ) @@ -2131,7 +2133,7 @@ void ComplexList::Append( const uno::Sequence< uno::Any >& aMultPars, ComplListA } break; case uno::TypeClass_DOUBLE: - Append( new Complex( *static_cast<double const *>(r.getValue()), 0.0 ) ); + Append( new Complex( *o3tl::forceGet<double>(r), 0.0 ) ); break; case uno::TypeClass_SEQUENCE: { @@ -2870,7 +2872,7 @@ bool ScaAnyConverter::getDouble( break; case uno::TypeClass_STRING: { - const OUString* pString = static_cast< const OUString* >( rAny.getValue() ); + auto pString = o3tl::forceGet< OUString >( rAny ); if( !pString->isEmpty() ) rfResult = convertToDouble( *pString ); else commit 61e0433fdf1bfd391378ff9fcbf697aec4c5e61a Author: Stephan Bergmann <sberg...@redhat.com> Date: Mon Jun 6 09:47:01 2016 +0200 Use o3tl/any.hxx in connectivity Change-Id: I5c0d84b20b9146c4fc65bfdc0e9c65a05c93d71c diff --git a/connectivity/source/commontools/dbexception.cxx b/connectivity/source/commontools/dbexception.cxx index f718a3c..38251b7 100644 --- a/connectivity/source/commontools/dbexception.cxx +++ b/connectivity/source/commontools/dbexception.cxx @@ -20,6 +20,7 @@ #include <connectivity/dbexception.hxx> #include <comphelper/types.hxx> #include <cppuhelper/exc_hlp.hxx> +#include <o3tl/any.hxx> #include <osl/diagnose.h> #include <com/sun/star/sdb/SQLContext.hpp> #include <com/sun/star/sdbc/SQLWarning.hpp> @@ -174,14 +175,14 @@ bool SQLExceptionInfo::isKindOf(TYPE _eType) const SQLExceptionInfo::operator const css::sdbc::SQLException*() const { OSL_ENSURE(isKindOf(TYPE::SQLException), "SQLExceptionInfo::operator SQLException* : invalid call !"); - return static_cast<const css::sdbc::SQLException*>(m_aContent.getValue()); + return o3tl::doGet<css::sdbc::SQLException>(m_aContent); } SQLExceptionInfo::operator const css::sdb::SQLContext*() const { OSL_ENSURE(isKindOf(TYPE::SQLContext), "SQLExceptionInfo::operator SQLException* : invalid call !"); - return static_cast<const css::sdb::SQLContext*>(m_aContent.getValue()); + return o3tl::doGet<css::sdb::SQLContext>(m_aContent); } @@ -212,10 +213,10 @@ void SQLExceptionInfo::append( TYPE _eType, const OUString& _rErrorMessage, cons break; } - SQLException* pAppendException( static_cast< SQLException* >( const_cast< void* >( aAppend.getValue() ) ) ); - pAppendException->Message = _rErrorMessage; - pAppendException->SQLState = _rSQLState; - pAppendException->ErrorCode = _nErrorCode; + SQLException& pAppendException = const_cast<SQLException &>(*o3tl::forceGet<SQLException>(aAppend)); + pAppendException.Message = _rErrorMessage; + pAppendException.SQLState = _rSQLState; + pAppendException.ErrorCode = _nErrorCode; // find the end of the current chain Any* pChainIterator = &m_aContent; @@ -229,7 +230,7 @@ void SQLExceptionInfo::append( TYPE _eType, const OUString& _rErrorMessage, cons if ( !isAssignableFrom( aSQLExceptionType, pChainIterator->getValueType() ) ) break; - pLastException = static_cast< SQLException* >( const_cast< void* >( pChainIterator->getValue() ) ); + pLastException = const_cast< SQLException* >( o3tl::doGet<SQLException>( *pChainIterator ) ); pChainIterator = &pLastException->NextException; } @@ -313,7 +314,7 @@ const css::sdbc::SQLException* SQLExceptionIteratorHelper::next() return pReturn; } - m_pCurrent = static_cast< const SQLException* >( m_pCurrent->NextException.getValue() ); + m_pCurrent = o3tl::doGet< SQLException >( m_pCurrent->NextException ); // no finally determine the proper type of the exception const Type aTypeContext( ::cppu::UnoType< SQLContext >::get() ); diff --git a/connectivity/source/commontools/dbtools.cxx b/connectivity/source/commontools/dbtools.cxx index 45e0e36..b71ff9a 100644 --- a/connectivity/source/commontools/dbtools.cxx +++ b/connectivity/source/commontools/dbtools.cxx @@ -73,6 +73,7 @@ #include <connectivity/dbexception.hxx> #include <connectivity/dbtools.hxx> #include <connectivity/statementcomposer.hxx> +#include <o3tl/any.hxx> #include <osl/diagnose.h> #include <rtl/ustrbuf.hxx> #include <tools/diagnose_ex.h> @@ -1155,14 +1156,14 @@ try { Any aDate( xOldProps->getPropertyValue(sPropDefaultDate) ); if (aDate.hasValue()) - aNewDefault <<= DBTypeConversion::toDouble(*static_cast<Date const *>(aDate.getValue())); + aNewDefault <<= DBTypeConversion::toDouble(*o3tl::doGet<Date>(aDate)); } if (hasProperty(sPropDefaultTime, xOldProps)) { Any aTime( xOldProps->getPropertyValue(sPropDefaultTime) ); if (aTime.hasValue()) - aNewDefault <<= DBTypeConversion::toDouble(*static_cast<Time const *>(aTime.getValue())); + aNewDefault <<= DBTypeConversion::toDouble(*o3tl::doGet<Time>(aTime)); } // double or OUString will be copied directly @@ -1449,29 +1450,29 @@ bool implUpdateObject(const Reference< XRowUpdate >& _rxUpdatedObject, break; case TypeClass_STRING: - _rxUpdatedObject->updateString(_nColumnIndex, *static_cast<OUString const *>(_rValue.getValue())); + _rxUpdatedObject->updateString(_nColumnIndex, *o3tl::forceGet<OUString>(_rValue)); break; case TypeClass_BOOLEAN: - _rxUpdatedObject->updateBoolean(_nColumnIndex, *static_cast<sal_Bool const *>(_rValue.getValue())); + _rxUpdatedObject->updateBoolean(_nColumnIndex, *o3tl::forceGet<bool>(_rValue)); break; case TypeClass_BYTE: - _rxUpdatedObject->updateByte(_nColumnIndex, *static_cast<sal_Int8 const *>(_rValue.getValue())); + _rxUpdatedObject->updateByte(_nColumnIndex, *o3tl::forceGet<sal_Int8>(_rValue)); break; case TypeClass_UNSIGNED_SHORT: case TypeClass_SHORT: - _rxUpdatedObject->updateShort(_nColumnIndex, *static_cast<sal_Int16 const *>(_rValue.getValue())); + _rxUpdatedObject->updateShort(_nColumnIndex, *o3tl::forceGet<sal_Int16>(_rValue)); break; case TypeClass_CHAR: - _rxUpdatedObject->updateString(_nColumnIndex,OUString(static_cast<sal_Unicode const *>(_rValue.getValue()),1)); + _rxUpdatedObject->updateString(_nColumnIndex,OUString(*o3tl::forceGet<sal_Unicode>(_rValue))); break; case TypeClass_UNSIGNED_LONG: case TypeClass_LONG: - _rxUpdatedObject->updateInt(_nColumnIndex, *static_cast<sal_Int32 const *>(_rValue.getValue())); + _rxUpdatedObject->updateInt(_nColumnIndex, *o3tl::forceGet<sal_Int32>(_rValue)); break; case TypeClass_HYPER: @@ -1483,36 +1484,34 @@ bool implUpdateObject(const Reference< XRowUpdate >& _rxUpdatedObject, break; case TypeClass_FLOAT: - _rxUpdatedObject->updateFloat(_nColumnIndex, *static_cast<float const *>(_rValue.getValue())); + _rxUpdatedObject->updateFloat(_nColumnIndex, *o3tl::forceGet<float>(_rValue)); break; case TypeClass_DOUBLE: - _rxUpdatedObject->updateDouble(_nColumnIndex, *static_cast<double const *>(_rValue.getValue())); + _rxUpdatedObject->updateDouble(_nColumnIndex, *o3tl::forceGet<double>(_rValue)); break; case TypeClass_SEQUENCE: - if (_rValue.getValueType() == cppu::UnoType< Sequence< sal_Int8 > >::get()) - _rxUpdatedObject->updateBytes(_nColumnIndex, *static_cast<Sequence<sal_Int8> const *>(_rValue.getValue())); + if (auto s = o3tl::tryGet<Sequence< sal_Int8 >>(_rValue)) + _rxUpdatedObject->updateBytes(_nColumnIndex, *s); else bSuccessfullyReRouted = false; break; case TypeClass_STRUCT: - if (_rValue.getValueType() == cppu::UnoType<DateTime>::get()) - _rxUpdatedObject->updateTimestamp(_nColumnIndex, *static_cast<DateTime const *>(_rValue.getValue())); - else if (_rValue.getValueType() == cppu::UnoType<Date>::get()) - _rxUpdatedObject->updateDate(_nColumnIndex, *static_cast<Date const *>(_rValue.getValue())); - else if (_rValue.getValueType() == cppu::UnoType<Time>::get()) - _rxUpdatedObject->updateTime(_nColumnIndex, *static_cast<Time const *>(_rValue.getValue())); + if (auto s1 = o3tl::tryGet<DateTime>(_rValue)) + _rxUpdatedObject->updateTimestamp(_nColumnIndex, *s1); + else if (auto s2 = o3tl::tryGet<Date>(_rValue)) + _rxUpdatedObject->updateDate(_nColumnIndex, *s2); + else if (auto s3 = o3tl::tryGet<Time>(_rValue)) + _rxUpdatedObject->updateTime(_nColumnIndex, *s3); else bSuccessfullyReRouted = false; break; case TypeClass_INTERFACE: - if (_rValue.getValueType() == cppu::UnoType<XInputStream>::get()) + if (auto xStream = o3tl::tryGet<Reference<XInputStream>>(_rValue)) { - Reference< XInputStream > xStream; - _rValue >>= xStream; - _rxUpdatedObject->updateBinaryStream(_nColumnIndex, xStream, xStream->available()); + _rxUpdatedObject->updateBinaryStream(_nColumnIndex, *xStream, (*xStream)->available()); break; } SAL_FALLTHROUGH; @@ -1559,23 +1558,23 @@ bool implSetObject( const Reference< XParameters >& _rxParameters, break; case TypeClass_STRING: - _rxParameters->setString(_nColumnIndex, *static_cast<OUString const *>(_rValue.getValue())); + _rxParameters->setString(_nColumnIndex, *o3tl::forceGet<OUString>(_rValue)); break; case TypeClass_BOOLEAN: - _rxParameters->setBoolean(_nColumnIndex, *static_cast<sal_Bool const *>(_rValue.getValue())); + _rxParameters->setBoolean(_nColumnIndex, *o3tl::forceGet<bool>(_rValue)); break; case TypeClass_BYTE: - _rxParameters->setByte(_nColumnIndex, *static_cast<sal_Int8 const *>(_rValue.getValue())); + _rxParameters->setByte(_nColumnIndex, *o3tl::forceGet<sal_Int8>(_rValue)); break; case TypeClass_SHORT: - _rxParameters->setShort(_nColumnIndex, *static_cast<sal_Int16 const *>(_rValue.getValue())); + _rxParameters->setShort(_nColumnIndex, *o3tl::forceGet<sal_Int16>(_rValue)); break; case TypeClass_CHAR: - _rxParameters->setString(_nColumnIndex, OUString(static_cast<sal_Unicode const *>(_rValue.getValue()),1)); + _rxParameters->setString(_nColumnIndex, OUString(*o3tl::forceGet<sal_Unicode>(_rValue))); break; case TypeClass_UNSIGNED_SHORT: @@ -1588,28 +1587,28 @@ bool implSetObject( const Reference< XParameters >& _rxParameters, } case TypeClass_FLOAT: - _rxParameters->setFloat(_nColumnIndex, *static_cast<float const *>(_rValue.getValue())); + _rxParameters->setFloat(_nColumnIndex, *o3tl::forceGet<float>(_rValue)); break; case TypeClass_DOUBLE: - _rxParameters->setDouble(_nColumnIndex, *static_cast<double const *>(_rValue.getValue())); + _rxParameters->setDouble(_nColumnIndex, *o3tl::forceGet<double>(_rValue)); break; case TypeClass_SEQUENCE: - if (_rValue.getValueType() == cppu::UnoType< Sequence< sal_Int8 > >::get()) + if (auto s = o3tl::tryGet<Sequence< sal_Int8 >>(_rValue)) { - _rxParameters->setBytes(_nColumnIndex, *static_cast<Sequence<sal_Int8> const *>(_rValue.getValue())); + _rxParameters->setBytes(_nColumnIndex, *s); } else bSuccessfullyReRouted = false; break; case TypeClass_STRUCT: - if (_rValue.getValueType() == cppu::UnoType<DateTime>::get()) - _rxParameters->setTimestamp(_nColumnIndex, *static_cast<DateTime const *>(_rValue.getValue())); - else if (_rValue.getValueType() == cppu::UnoType<Date>::get()) - _rxParameters->setDate(_nColumnIndex, *static_cast<Date const *>(_rValue.getValue())); - else if (_rValue.getValueType() == cppu::UnoType<Time>::get()) - _rxParameters->setTime(_nColumnIndex, *static_cast<Time const *>(_rValue.getValue())); + if (auto s1 = o3tl::tryGet<DateTime>(_rValue)) + _rxParameters->setTimestamp(_nColumnIndex, *s1); + else if (auto s2 = o3tl::tryGet<Date>(_rValue)) + _rxParameters->setDate(_nColumnIndex, *s2); + else if (auto s3 = o3tl::tryGet<Time>(_rValue)) + _rxParameters->setTime(_nColumnIndex, *s3); else bSuccessfullyReRouted = false; break; diff --git a/connectivity/source/commontools/warningscontainer.cxx b/connectivity/source/commontools/warningscontainer.cxx index 5d35532..787b6cf 100644 --- a/connectivity/source/commontools/warningscontainer.cxx +++ b/connectivity/source/commontools/warningscontainer.cxx @@ -21,6 +21,7 @@ #include <connectivity/warningscontainer.hxx> #include <connectivity/dbexception.hxx> +#include <o3tl/any.hxx> #include <osl/diagnose.h> @@ -44,7 +45,7 @@ namespace dbtools OSL_ENSURE( SQLExceptionInfo( _rChainLeft ).isValid(), "lcl_concatWarnings: invalid warnings chain (this will crash)!" ); - const SQLException* pChainTravel = static_cast< const SQLException* >( _rChainLeft.getValue() ); + const SQLException* pChainTravel = o3tl::doGet<SQLException>( _rChainLeft ); SQLExceptionIteratorHelper aReferenceIterHelper( *pChainTravel ); while ( aReferenceIterHelper.hasMoreElements() ) pChainTravel = aReferenceIterHelper.next(); diff --git a/connectivity/source/drivers/postgresql/pq_tools.cxx b/connectivity/source/drivers/postgresql/pq_tools.cxx index d698287..06898e9 100644 --- a/connectivity/source/drivers/postgresql/pq_tools.cxx +++ b/connectivity/source/drivers/postgresql/pq_tools.cxx @@ -34,6 +34,9 @@ * ************************************************************************/ +#include <sal/config.h> + +#include <o3tl/any.hxx> #include <rtl/strbuf.hxx> #include <rtl/ustrbuf.hxx> @@ -1163,54 +1166,54 @@ bool implSetObject( const Reference< XParameters >& _rxParameters, break; case typelib_TypeClass_STRING: - _rxParameters->setString(_nColumnIndex, *static_cast<OUString const *>(_rValue.getValue())); + _rxParameters->setString(_nColumnIndex, *o3tl::forceGet<OUString>(_rValue)); break; case typelib_TypeClass_BOOLEAN: - _rxParameters->setBoolean(_nColumnIndex, *static_cast<sal_Bool const *>(_rValue.getValue())); + _rxParameters->setBoolean(_nColumnIndex, *o3tl::forceGet<bool>(_rValue)); break; case typelib_TypeClass_BYTE: - _rxParameters->setByte(_nColumnIndex, *static_cast<sal_Int8 const *>(_rValue.getValue())); + _rxParameters->setByte(_nColumnIndex, *o3tl::forceGet<sal_Int8>(_rValue)); break; case typelib_TypeClass_UNSIGNED_SHORT: case typelib_TypeClass_SHORT: - _rxParameters->setShort(_nColumnIndex, *static_cast<sal_Int16 const *>(_rValue.getValue())); + _rxParameters->setShort(_nColumnIndex, *o3tl::forceGet<sal_Int16>(_rValue)); break; case typelib_TypeClass_CHAR: - _rxParameters->setString(_nColumnIndex, OUString(static_cast<sal_Unicode const *>(_rValue.getValue()),1)); + _rxParameters->setString(_nColumnIndex, OUString(*o3tl::forceGet<sal_Unicode>(_rValue))); break; case typelib_TypeClass_UNSIGNED_LONG: case typelib_TypeClass_LONG: - _rxParameters->setInt(_nColumnIndex, *static_cast<sal_Int32 const *>(_rValue.getValue())); + _rxParameters->setInt(_nColumnIndex, *o3tl::forceGet<sal_Int32>(_rValue)); break; case typelib_TypeClass_FLOAT: - _rxParameters->setFloat(_nColumnIndex, *static_cast<float const *>(_rValue.getValue())); + _rxParameters->setFloat(_nColumnIndex, *o3tl::forceGet<float>(_rValue)); break; case typelib_TypeClass_DOUBLE: - _rxParameters->setDouble(_nColumnIndex, *static_cast<double const *>(_rValue.getValue())); + _rxParameters->setDouble(_nColumnIndex, *o3tl::forceGet<double>(_rValue)); break; case typelib_TypeClass_SEQUENCE: - if (_rValue.getValueType() == cppu::UnoType<Sequence< sal_Int8 >>::get()) + if (auto s = o3tl::tryGet<Sequence< sal_Int8 >>(_rValue)) { - _rxParameters->setBytes(_nColumnIndex, *static_cast<Sequence<sal_Int8> const *>(_rValue.getValue())); + _rxParameters->setBytes(_nColumnIndex, *s); } else bSuccessfullyReRouted = false; break; case typelib_TypeClass_STRUCT: - if (_rValue.getValueType() == cppu::UnoType<css::util::DateTime>::get()) - _rxParameters->setTimestamp(_nColumnIndex, *static_cast<css::util::DateTime const *>(_rValue.getValue())); - else if (_rValue.getValueType() == cppu::UnoType<css::util::Date>::get()) - _rxParameters->setDate(_nColumnIndex, *static_cast<css::util::Date const *>(_rValue.getValue())); - else if (_rValue.getValueType() == cppu::UnoType<css::util::Time>::get()) - _rxParameters->setTime(_nColumnIndex, *static_cast<css::util::Time const *>(_rValue.getValue())); + if (auto s1 = o3tl::tryGet<css::util::DateTime>(_rValue)) + _rxParameters->setTimestamp(_nColumnIndex, *s1); + else if (auto s2 = o3tl::tryGet<css::util::Date>(_rValue)) + _rxParameters->setDate(_nColumnIndex, *s2); + else if (auto s3 = o3tl::tryGet<css::util::Time>(_rValue)) + _rxParameters->setTime(_nColumnIndex, *s3); else bSuccessfullyReRouted = false; break; commit e5d45064fc2e858c27ab7d97a7a7fa024d210133 Author: Stephan Bergmann <sberg...@redhat.com> Date: Mon Jun 6 09:44:12 2016 +0200 Improve o3tl/any.hxx * Ensure tryGet<XFoo> (instead of tryGet<css::uno::Reference<XFoo>>) doesn't compile. * Add forceGet (as discussed at 0d7c5823124696f80583ac2a5f0e28f329f6f786 "New o3tl::try/doGet to obtain value from Any", to be used momentarily). Change-Id: I57eb6ef18a6ab0d52bb26df7eb4e51b485fc83ed diff --git a/include/o3tl/any.hxx b/include/o3tl/any.hxx index 268ae20..023f468 100644 --- a/include/o3tl/any.hxx +++ b/include/o3tl/any.hxx @@ -12,6 +12,7 @@ #include <sal/config.h> +#include <cassert> #include <type_traits> #include <utility> @@ -20,6 +21,7 @@ #include <com/sun/star/uno/Any.hxx> #include <com/sun/star/uno/RuntimeException.hpp> #include <com/sun/star/uno/Reference.hxx> +#include <com/sun/star/uno/XInterface.hpp> #include <cppu/unotype.hxx> #include <rtl/ustring.hxx> #include <sal/types.h> @@ -27,10 +29,6 @@ // Some functionality related to css::uno::Any that would ideally be part of // <com/sun/star/uno/Any.hxx>, but (for now) cannot be for some reason. -namespace com { namespace sun { namespace star { namespace uno { - class XInterface; -} } } } - namespace o3tl { namespace detail { @@ -116,7 +114,8 @@ template<typename T> inline boost::optional<T> tryGetConverted( @tparam T the C++ representation of a UNO type that can be contained in a UNO ANY (i.e., any UNO type other than ANY itself). The legacy C++ representations sal_Bool, cppu::UnoVoidType, cppu::UnoUnsignedShortType, - cppu::UnoCharType, and cppu::UnoSequenceType are not supported. + cppu::UnoCharType, and cppu::UnoSequenceType are not supported. Must be a + complete type or void. @param any an Any value. @@ -126,7 +125,8 @@ template<typename T> inline boost::optional<T> tryGetConverted( template<typename T> inline typename std::enable_if< !(detail::IsDerivedReference<T>::value - || detail::IsUnoSequenceType<T>::value), + || detail::IsUnoSequenceType<T>::value + || std::is_base_of<css::uno::XInterface, T>::value), typename detail::Optional<T>::type>::type tryGet(css::uno::Any const & any) { // CHAR, STRING, TYPE, sequence types, enum types, struct types, exception @@ -209,6 +209,11 @@ template<> detail::Optional<css::uno::Any>::type tryGet<css::uno::Any>( template<> detail::Optional<sal_Bool>::type tryGet<sal_Bool>( css::uno::Any const &) = delete; +/* + +// Already prevented by std::is_base_of<css::uno::XInterface, T> requiring T to +// be complete: + template<> detail::Optional<cppu::UnoVoidType>::type tryGet<cppu::UnoVoidType>( css::uno::Any const &) = delete; @@ -218,6 +223,8 @@ tryGet<cppu::UnoUnsignedShortType>(css::uno::Any const &) = delete; template<> detail::Optional<cppu::UnoCharType>::type tryGet<cppu::UnoCharType>( css::uno::Any const &) = delete; +*/ + template<typename T> inline typename std::enable_if< detail::IsDerivedReference<T>::value, @@ -257,6 +264,28 @@ template<typename T> inline typename detail::Optional<T>::type doGet( return opt; } +/** Get the value of a specific type from an Any, knowing the Any contains a + value of a matching type. + + @note Ideally this would be a public member function of css::uno::Any. See + tryGet for details. + + @tparam T the C++ representation of a UNO type that can be contained in a + UNO ANY. See tryGet for details. + + @param any an Any value. + + @return a positive proxy for the value of the specfied type obtained from + the given Any. See tryGet for details. +*/ +template<typename T> inline typename detail::Optional<T>::type forceGet( + css::uno::Any const & any) +{ + auto opt = tryGet<T>(any); + assert(opt); + return opt; +} + } #endif _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits