toolkit/inc/controls/eventcontainer.hxx    |   15 ++++++-
 toolkit/source/controls/eventcontainer.cxx |   56 +++++++++++++++++++----------
 2 files changed, 51 insertions(+), 20 deletions(-)

New commits:
commit 74459c7d62ebe93bdfdf65b665b9253ac8f09d79
Author:     Samuel Mehrbrodt <samuel.mehrbr...@cib.de>
AuthorDate: Wed May 6 14:11:00 2020 +0200
Commit:     Samuel Mehrbrodt <samuel.mehrbr...@cib.de>
CommitDate: Thu May 7 08:41:43 2020 +0200

    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.mehrbr...@cib.de>

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 )
 {
 }
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to