diff options
author | Noel Grandin <noelgrandin@gmail.com> | 2015-05-16 11:12:48 +0200 |
---|---|---|
committer | Noel Grandin <noelgrandin@gmail.com> | 2015-06-29 07:25:22 +0000 |
commit | e57314f61f67b093510c5a8a8f34a62126ba8734 (patch) | |
tree | 7991c3a6f20c93b752628528196022474c6b4a7f /cppuhelper | |
parent | 371200675c2fb2fef0ac8362ebd7bf4203835440 (diff) |
return and use std::vector from OInterfaceContainerHelper
since most of the time we don’t need a heavyweight uno::Sequence.
Adds a new method getElementsAsVector().
Change-Id: I9e72bef0c0c723ffd0dd7d4152db5baec6784a7a
Reviewed-on: https://gerrit.libreoffice.org/15747
Reviewed-by: Noel Grandin <noelgrandin@gmail.com>
Tested-by: Noel Grandin <noelgrandin@gmail.com>
Diffstat (limited to 'cppuhelper')
-rw-r--r-- | cppuhelper/qa/ifcontainer/cppu_ifcontainer.cxx | 19 | ||||
-rw-r--r-- | cppuhelper/source/gcc3.map | 6 | ||||
-rw-r--r-- | cppuhelper/source/interfacecontainer.cxx | 108 |
3 files changed, 60 insertions, 73 deletions
diff --git a/cppuhelper/qa/ifcontainer/cppu_ifcontainer.cxx b/cppuhelper/qa/ifcontainer/cppu_ifcontainer.cxx index ff7c7925276c..e98aab205adc 100644 --- a/cppuhelper/qa/ifcontainer/cppu_ifcontainer.cxx +++ b/cppuhelper/qa/ifcontainer/cppu_ifcontainer.cxx @@ -112,12 +112,11 @@ namespace cppu_ifcontainer pContainer->addInterface(xRef); aListeners.push_back(xRef); } - Sequence< Reference< XInterface > > aElements; - aElements = pContainer->getElements(); + std::vector< Reference< XInterface > > aElements = pContainer->getElementsAsVector(); CPPUNIT_ASSERT_MESSAGE("query contents", - (int)aElements.getLength() == nTests); - if ((int)aElements.getLength() == nTests) + (int)aElements.size() == nTests); + if ((int)aElements.size() == nTests) { for (i = 0; i < nTests; i++) { @@ -157,8 +156,8 @@ namespace cppu_ifcontainer pHelper = pContainer->getContainer(pTypes[i]); CPPUNIT_ASSERT_MESSAGE("no helper", pHelper != NULL); - Sequence<Reference< XInterface > > aSeq = pHelper->getElements(); - CPPUNIT_ASSERT_MESSAGE("wrong num elements", aSeq.getLength() == 2); + std::vector<Reference< XInterface > > aSeq = pHelper->getElementsAsVector(); + CPPUNIT_ASSERT_MESSAGE("wrong num elements", aSeq.size() == 2); CPPUNIT_ASSERT_MESSAGE("match", aSeq[0] == xRefs[i*2]); CPPUNIT_ASSERT_MESSAGE("match", aSeq[1] == xRefs[i*2+1]); } @@ -175,8 +174,8 @@ namespace cppu_ifcontainer pHelper = pContainer->getContainer(pTypes[i]); CPPUNIT_ASSERT_MESSAGE("no helper", pHelper != NULL); - Sequence<Reference< XInterface > > aSeq = pHelper->getElements(); - CPPUNIT_ASSERT_MESSAGE("wrong num elements", aSeq.getLength() == 1); + std::vector<Reference< XInterface > > aSeq = pHelper->getElementsAsVector(); + CPPUNIT_ASSERT_MESSAGE("wrong num elements", aSeq.size() == 1); CPPUNIT_ASSERT_MESSAGE("match", aSeq[0] == xRefs[i*2]); } @@ -191,8 +190,8 @@ namespace cppu_ifcontainer pHelper = pContainer->getContainer(pTypes[i]); CPPUNIT_ASSERT_MESSAGE("no helper", pHelper != NULL); - Sequence<Reference< XInterface > > aSeq = pHelper->getElements(); - CPPUNIT_ASSERT_MESSAGE("wrong num elements", aSeq.getLength() == 0); + std::vector<Reference< XInterface > > aSeq = pHelper->getElementsAsVector(); + CPPUNIT_ASSERT_MESSAGE("wrong num elements", aSeq.size() == 0); } delete pContainer; diff --git a/cppuhelper/source/gcc3.map b/cppuhelper/source/gcc3.map index 12c29834ab16..1a15f35be3ff 100644 --- a/cppuhelper/source/gcc3.map +++ b/cppuhelper/source/gcc3.map @@ -430,6 +430,12 @@ global: _ZN4cppu15supportsServiceEPN3com3sun4star4lang12XServiceInfoERKN3rtl8OUStringE; # cppu::supportsService(com::sun::star::lang::XServiceInfo*, rtl::OUString const&) } UDK_3.8; + +PRIVATE_cppuhelper.1 { # LibreOffice 5.1 + global: + _ZNK4cppu25OInterfaceContainerHelper19getElementsAsVectorEv; # std::vector< Reference<XInterface> > OInterfaceContainerHelper::getElementsAsVector() const +}; + # Unique libstdc++ symbols: GLIBCXX_3.4 { global: diff --git a/cppuhelper/source/interfacecontainer.cxx b/cppuhelper/source/interfacecontainer.cxx index 5bd20a442128..93a38363f8a6 100644 --- a/cppuhelper/source/interfacecontainer.cxx +++ b/cppuhelper/source/interfacecontainer.cxx @@ -28,6 +28,7 @@ #include <memory> #include <com/sun/star/lang/XEventListener.hpp> +#include <iterator> using namespace osl; @@ -36,32 +37,6 @@ using namespace com::sun::star::lang; namespace cppu { -/** - * Reallocate the sequence. - */ -static void realloc( Sequence< Reference< XInterface > > & rSeq, sal_Int32 nNewLen ) -{ - rSeq.realloc( nNewLen ); -} - -/** - * Remove an element from an interface sequence. - */ -static void sequenceRemoveElementAt( Sequence< Reference< XInterface > > & rSeq, sal_Int32 index ) -{ - sal_Int32 nNewLen = rSeq.getLength() - 1; - - Sequence< Reference< XInterface > > aDestSeq( rSeq.getLength() - 1 ); - // getArray on a const sequence is faster - const Reference< XInterface > * pSource = ((const Sequence< Reference< XInterface > > &)rSeq).getConstArray(); - Reference< XInterface > * pDest = aDestSeq.getArray(); - sal_Int32 i = 0; - for( ; i < index; i++ ) - pDest[i] = pSource[i]; - for( sal_Int32 j = i ; j < nNewLen; j++ ) - pDest[j] = pSource[j+1]; - rSeq = aDestSeq; -} #ifdef _MSC_VER #pragma warning( disable: 4786 ) @@ -79,7 +54,7 @@ OInterfaceIteratorHelper::OInterfaceIteratorHelper( OInterfaceContainerHelper & if( bIsList ) { rCont.bInUse = sal_True; - nRemain = aData.pAsSequence->getLength(); + nRemain = aData.pAsVector->size(); } else if( aData.pAsInterface ) { @@ -96,7 +71,7 @@ OInterfaceIteratorHelper::~OInterfaceIteratorHelper() { MutexGuard aGuard( rCont.rMutex ); // bResetInUse protect the iterator against recursion - bShared = aData.pAsSequence == rCont.aData.pAsSequence && rCont.bIsList; + bShared = aData.pAsVector == rCont.aData.pAsVector && rCont.bIsList; if( bShared ) { OSL_ENSURE( rCont.bInUse, "OInterfaceContainerHelper must be in use" ); @@ -108,7 +83,7 @@ OInterfaceIteratorHelper::~OInterfaceIteratorHelper() { if( bIsList ) // Sequence owned by the iterator - delete aData.pAsSequence; + delete aData.pAsVector; else if( aData.pAsInterface ) // Interface is acquired by the iterator aData.pAsInterface->release(); @@ -121,8 +96,7 @@ XInterface * OInterfaceIteratorHelper::next() { nRemain--; if( bIsList ) - // typecase to const,so the getArray method is faster - return aData.pAsSequence->getConstArray()[nRemain].get(); + return (*aData.pAsVector)[nRemain].get(); else if( aData.pAsInterface ) return aData.pAsInterface; } @@ -135,8 +109,8 @@ void OInterfaceIteratorHelper::remove() if( bIsList ) { OSL_ASSERT( nRemain >= 0 && - nRemain < aData.pAsSequence->getLength() ); - XInterface * p = aData.pAsSequence->getConstArray()[nRemain].get(); + nRemain < static_cast<sal_Int32>(aData.pAsVector->size()) ); + XInterface * p = (*aData.pAsVector)[nRemain].get(); rCont.removeInterface( * reinterpret_cast< const Reference< XInterface > * >( &p ) ); } else @@ -157,7 +131,7 @@ OInterfaceContainerHelper::~OInterfaceContainerHelper() { OSL_ENSURE( !bInUse, "~OInterfaceContainerHelper but is in use" ); if( bIsList ) - delete aData.pAsSequence; + delete aData.pAsVector; else if( aData.pAsInterface ) aData.pAsInterface->release(); } @@ -166,17 +140,30 @@ sal_Int32 OInterfaceContainerHelper::getLength() const { MutexGuard aGuard( rMutex ); if( bIsList ) - return aData.pAsSequence->getLength(); + return aData.pAsVector->size(); else if( aData.pAsInterface ) return 1; return 0; } -Sequence< Reference<XInterface> > OInterfaceContainerHelper::getElements() const +std::vector< Reference<XInterface> > OInterfaceContainerHelper::getElementsAsVector() const +{ + MutexGuard aGuard( rMutex ); + if( bIsList ) + return *aData.pAsVector; + else if( aData.pAsInterface ) + { + Reference<XInterface> x( aData.pAsInterface ); + return { x }; + } + return std::vector< Reference< XInterface > >(); +} + +css::uno::Sequence< Reference<XInterface> > OInterfaceContainerHelper::getElements() const { MutexGuard aGuard( rMutex ); if( bIsList ) - return *aData.pAsSequence; + return css::uno::Sequence< Reference<XInterface> >( aData.pAsVector->data(), static_cast<sal_Int32>(aData.pAsVector->size()) ); else if( aData.pAsInterface ) { Reference<XInterface> x( aData.pAsInterface ); @@ -193,7 +180,7 @@ void OInterfaceContainerHelper::copyAndResetInUse() // this should be the worst case. If a iterator is active // and a new Listener is added. if( bIsList ) - aData.pAsSequence = new Sequence< Reference< XInterface > >( *aData.pAsSequence ); + aData.pAsVector = new std::vector< Reference< XInterface > >( *aData.pAsVector ); else if( aData.pAsInterface ) aData.pAsInterface->acquire(); @@ -210,19 +197,16 @@ sal_Int32 OInterfaceContainerHelper::addInterface( const Reference<XInterface> & if( bIsList ) { - sal_Int32 nLen = aData.pAsSequence->getLength(); - realloc( *aData.pAsSequence, nLen +1 ); - aData.pAsSequence->getArray()[ nLen ] = rListener; - return nLen +1; + aData.pAsVector->push_back( rListener ); + return aData.pAsVector->size(); } else if( aData.pAsInterface ) { - Sequence< Reference< XInterface > > * pSeq = new Sequence< Reference< XInterface > >( 2 ); - Reference<XInterface> * pArray = pSeq->getArray(); - pArray[0] = aData.pAsInterface; - pArray[1] = rListener; + std::vector< Reference< XInterface > > * pSeq = new std::vector< Reference< XInterface > >( 2 ); + (*pSeq)[0] = aData.pAsInterface; + (*pSeq)[1] = rListener; aData.pAsInterface->release(); - aData.pAsSequence = pSeq; + aData.pAsVector = pSeq; bIsList = sal_True; return 2; } @@ -244,43 +228,41 @@ sal_Int32 OInterfaceContainerHelper::removeInterface( const Reference<XInterface if( bIsList ) { - const Reference<XInterface> * pL = aData.pAsSequence->getConstArray(); - sal_Int32 nLen = aData.pAsSequence->getLength(); - sal_Int32 i; - for( i = 0; i < nLen; i++ ) + // It is not valid to compare the pointer directly, but it's faster. + bool bFound = false; + for( auto it = std::begin(*aData.pAsVector); it != std::end(*aData.pAsVector); ++it ) { - // It is not valid to compare the pointer directly, but it's faster. - if( pL[i].get() == rListener.get() ) + if( (*it).get() == rListener.get() ) { - sequenceRemoveElementAt( *aData.pAsSequence, i ); + aData.pAsVector->erase(it); + bFound = true; break; } } - - if( i == nLen ) + if (!bFound) { // interface not found, use the correct compare method - for( i = 0; i < nLen; i++ ) + for( auto it = std::begin(*aData.pAsVector); it != std::end(*aData.pAsVector); ++it ) { - if( pL[i] == rListener ) + if( *it == rListener ) { - sequenceRemoveElementAt(*aData.pAsSequence, i ); + aData.pAsVector->erase(it); break; } } } - if( aData.pAsSequence->getLength() == 1 ) + if( aData.pAsVector->size() == 1 ) { - XInterface * p = aData.pAsSequence->getConstArray()[0].get(); + XInterface * p = (*aData.pAsVector)[0].get(); p->acquire(); - delete aData.pAsSequence; + delete aData.pAsVector; aData.pAsInterface = p; bIsList = sal_False; return 1; } else - return aData.pAsSequence->getLength(); + return aData.pAsVector->size(); } else if( aData.pAsInterface && Reference<XInterface>( aData.pAsInterface ) == rListener ) { |