summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Mehrbrodt <Samuel.Mehrbrodt@cib.de>2020-04-30 14:24:06 +0200
committerThorsten Behrens <Thorsten.Behrens@CIB.de>2020-05-07 10:35:39 +0200
commita85c89cfd5fd008a05081937b9b524f674ffed0f (patch)
treef0539bdd2701d41a520a364a0aa5cf34516996a6
parent2bb9d27978115991426e7581ac798077693ac7c7 (diff)
Revert "remove some "optimisation" insanity in ScriptEventContainer"
This broke the event order in basic dialog xml, which in turn broke macro signatures. This reverts commit 85f08e3e34bea01456eaf8989ac4f77d3900d5c5. Change-Id: I49ef2eb200571a0fd862770abc4331b6ea053e2b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/93209 Tested-by: Thorsten Behrens <Thorsten.Behrens@CIB.de> Reviewed-by: Thorsten Behrens <Thorsten.Behrens@CIB.de> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/93609
-rw-r--r--include/toolkit/controls/eventcontainer.hxx18
-rw-r--r--toolkit/source/controls/eventcontainer.cxx56
2 files changed, 53 insertions, 21 deletions
diff --git a/include/toolkit/controls/eventcontainer.hxx b/include/toolkit/controls/eventcontainer.hxx
index 29ce0beecf80..3cb7406f58cd 100644
--- a/include/toolkit/controls/eventcontainer.hxx
+++ b/include/toolkit/controls/eventcontainer.hxx
@@ -31,13 +31,25 @@
namespace toolkit
{
+// Hashtable to optimize
+typedef std::unordered_map
+<
+ OUString,
+ sal_Int32,
+ OUStringHash
+>
+NameContainerNameMap;
+
+
class ScriptEventContainer : public ::cppu::WeakImplHelper<
css::container::XNameContainer,
css::container::XContainer >
{
- std::unordered_map< OUString, css::uno::Any>
- mHashMap;
- css::uno::Type const mType;
+ NameContainerNameMap mHashMap;
+ css::uno::Sequence< OUString > mNames;
+ std::vector< css::uno::Any > mValues;
+ sal_Int32 mnElementCount;
+ css::uno::Type mType;
ContainerListenerMultiplexer maContainerListeners;
diff --git a/toolkit/source/controls/eventcontainer.cxx b/toolkit/source/controls/eventcontainer.cxx
index 8873c638ad0a..b64b9a80d404 100644
--- a/toolkit/source/controls/eventcontainer.cxx
+++ b/toolkit/source/controls/eventcontainer.cxx
@@ -46,33 +46,33 @@ Type ScriptEventContainer::getElementType()
sal_Bool ScriptEventContainer::hasElements()
{
- return !mHashMap.empty();
+ bool bRet = (mnElementCount > 0);
+ return bRet;
}
// Methods XNameAccess
Any ScriptEventContainer::getByName( const OUString& aName )
{
- auto aIt = mHashMap.find( aName );
+ NameContainerNameMap::iterator aIt = mHashMap.find( aName );
if( aIt == mHashMap.end() )
{
throw NoSuchElementException();
}
- return aIt->second;
+ sal_Int32 iHashResult = (*aIt).second;
+ Any aRetAny = mValues[ iHashResult ];
+ return aRetAny;
}
Sequence< OUString > ScriptEventContainer::getElementNames()
{
- Sequence<OUString> aRet(mHashMap.size());
- int i = 0;
- for (auto const & pair : mHashMap)
- aRet[i++] = pair.first;
- return aRet;
+ return mNames;
}
sal_Bool ScriptEventContainer::hasByName( const OUString& aName )
{
- auto aIt = mHashMap.find( aName );
- return aIt != mHashMap.end();
+ NameContainerNameMap::iterator aIt = mHashMap.find( aName );
+ bool bRet = ( aIt != mHashMap.end() );
+ return bRet;
}
@@ -83,13 +83,14 @@ void ScriptEventContainer::replaceByName( const OUString& aName, const Any& aEle
if( mType != aAnyType )
throw IllegalArgumentException();
- auto aIt = mHashMap.find( aName );
+ NameContainerNameMap::iterator aIt = mHashMap.find( aName );
if( aIt == mHashMap.end() )
{
throw NoSuchElementException();
}
- Any aOldElement = aIt->second;
- aIt->second = aElement;
+ sal_Int32 iHashResult = (*aIt).second;
+ Any aOldElement = mValues[ iHashResult ];
+ mValues[ iHashResult ] = aElement;
// Fire event
ContainerEvent aEvent;
@@ -108,13 +109,18 @@ void ScriptEventContainer::insertByName( const OUString& aName, const Any& aElem
if( mType != aAnyType )
throw IllegalArgumentException();
- auto aIt = mHashMap.find( aName );
+ NameContainerNameMap::iterator aIt = mHashMap.find( aName );
if( aIt != mHashMap.end() )
{
throw ElementExistException();
}
- mHashMap[ aName ] = aElement;
+ sal_Int32 nCount = mNames.getLength();
+ mNames.realloc( nCount + 1 );
+ mValues.resize( nCount + 1 );
+ mNames.getArray()[ nCount ] = aName;
+ mValues[ nCount ] = aElement;
+ mHashMap[ aName ] = nCount;
// Fire event
ContainerEvent aEvent;
@@ -126,20 +132,33 @@ void ScriptEventContainer::insertByName( const OUString& aName, const Any& aElem
void ScriptEventContainer::removeByName( const OUString& Name )
{
- auto aIt = mHashMap.find( Name );
+ NameContainerNameMap::iterator aIt = mHashMap.find( Name );
if( aIt == mHashMap.end() )
{
throw NoSuchElementException();
}
+ sal_Int32 iHashResult = (*aIt).second;
+ Any aOldElement = mValues[ iHashResult ];
+
// Fire event
ContainerEvent aEvent;
aEvent.Source = *this;
- aEvent.Element = aIt->second;
+ aEvent.Element = aOldElement;
aEvent.Accessor <<= Name;
maContainerListeners.elementRemoved( aEvent );
mHashMap.erase( aIt );
+ sal_Int32 iLast = mNames.getLength() - 1;
+ if( iLast != iHashResult )
+ {
+ OUString* pNames = mNames.getArray();
+ pNames[ iHashResult ] = pNames[ iLast ];
+ mValues[ iHashResult ] = mValues[ iLast ];
+ mHashMap[ pNames[ iHashResult ] ] = iHashResult;
+ }
+ mNames.realloc( iLast );
+ mValues.resize( iLast );
}
// Methods XContainer
@@ -155,7 +174,8 @@ void ScriptEventContainer::removeContainerListener( const css::uno::Reference< c
ScriptEventContainer::ScriptEventContainer()
- : mType( cppu::UnoType<ScriptEventDescriptor>::get() ),
+ : mnElementCount( 0 ),
+ mType( cppu::UnoType<ScriptEventDescriptor>::get() ),
maContainerListeners( *this )
{
}