summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Mehrbrodt <Samuel.Mehrbrodt@cib.de>2020-05-06 14:11:00 +0200
committerSamuel Mehrbrodt <Samuel.Mehrbrodt@cib.de>2020-05-07 08:41:43 +0200
commit74459c7d62ebe93bdfdf65b665b9253ac8f09d79 (patch)
tree1c24a412a7294ab13ae127ac41b44e0e653b8ad3
parent0ed93efdb8f571d873a2f5b9f96938ea796199fd (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/+/93564 Tested-by: Jenkins Reviewed-by: Samuel Mehrbrodt <Samuel.Mehrbrodt@cib.de>
-rw-r--r--toolkit/inc/controls/eventcontainer.hxx15
-rw-r--r--toolkit/source/controls/eventcontainer.cxx56
2 files changed, 51 insertions, 20 deletions
diff --git a/toolkit/inc/controls/eventcontainer.hxx b/toolkit/inc/controls/eventcontainer.hxx
index 4961c16344ee..396578432fd1 100644
--- a/toolkit/inc/controls/eventcontainer.hxx
+++ b/toolkit/inc/controls/eventcontainer.hxx
@@ -30,12 +30,23 @@
namespace toolkit
{
+// Hashtable to optimize
+typedef std::unordered_map
+<
+ OUString,
+ sal_Int32,
+ OUStringHash
+>
+NameContainerNameMap;
+
class ScriptEventContainer final : public ::cppu::WeakImplHelper<
css::container::XNameContainer,
css::container::XContainer >
{
- std::unordered_map< OUString, css::uno::Any>
- mHashMap;
+ 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 73701446384c..165c91296cb9 100644
--- a/toolkit/source/controls/eventcontainer.cxx
+++ b/toolkit/source/controls/eventcontainer.cxx
@@ -43,33 +43,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;
}
@@ -80,13 +80,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;
@@ -105,13 +106,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;
@@ -123,20 +129,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
@@ -152,7 +171,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 )
{
}