summaryrefslogtreecommitdiff
path: root/cppuhelper
diff options
context:
space:
mode:
authorNoel Grandin <noelgrandin@gmail.com>2015-05-16 11:12:48 +0200
committerNoel Grandin <noelgrandin@gmail.com>2015-06-29 07:25:22 +0000
commite57314f61f67b093510c5a8a8f34a62126ba8734 (patch)
tree7991c3a6f20c93b752628528196022474c6b4a7f /cppuhelper
parent371200675c2fb2fef0ac8362ebd7bf4203835440 (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.cxx19
-rw-r--r--cppuhelper/source/gcc3.map6
-rw-r--r--cppuhelper/source/interfacecontainer.cxx108
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 )
{