include/svx/shapepropertynotifier.hxx | 19 +++++++-- svx/source/unodraw/shapepropertynotifier.cxx | 52 +++++++-------------------- 2 files changed, 28 insertions(+), 43 deletions(-)
New commits: commit 0e18d4495be0b7945295a29037e60341e347f9aa Author: Noel Grandin <n...@peralex.com> AuthorDate: Tue Apr 13 14:56:11 2021 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Tue Apr 13 20:55:01 2021 +0200 flatten PropertyChangeNotifier which removes an allocation hotspot when loading lots of shapes Change-Id: I0121f5bc86c6dfeddcad13e81203a514151d61bf Reviewed-on: https://gerrit.libreoffice.org/c/core/+/114051 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/include/svx/shapepropertynotifier.hxx b/include/svx/shapepropertynotifier.hxx index bdef4e11e7b8..c0716b6db3da 100644 --- a/include/svx/shapepropertynotifier.hxx +++ b/include/svx/shapepropertynotifier.hxx @@ -22,9 +22,11 @@ #include <svx/svxdllapi.h> #include <svx/shapeproperty.hxx> +#include <cppuhelper/interfacecontainer.hxx> #include <rtl/ustring.hxx> #include <memory> +#include <unordered_map> namespace com::sun::star::beans { class XPropertyChangeListener; } namespace com::sun::star::uno { class Any; } @@ -89,10 +91,6 @@ namespace svx }; - //= PropertyChangeNotifier - - struct PropertyChangeNotifier_Data; - /** helper class for notifying XPropertyChangeListeners The class is intended to be held as member of the class which does the property change broadcasting. @@ -132,7 +130,18 @@ namespace svx PropertyChangeNotifier(const PropertyChangeNotifier&) = delete; PropertyChangeNotifier& operator=(const PropertyChangeNotifier&) = delete; - std::unique_ptr< PropertyChangeNotifier_Data > m_xData; + struct ShapePropertyHash + { + size_t operator()( svx::ShapeProperty x ) const + { + return size_t( x ); + } + }; + typedef std::unordered_map< ShapeProperty, std::shared_ptr<IPropertyValueProvider>, ShapePropertyHash > + PropertyProviders; + ::cppu::OWeakObject& m_rContext; + PropertyProviders m_aProviders; + cppu::OMultiTypeInterfaceContainerHelperVar<OUString> m_aPropertyChangeListeners; }; diff --git a/svx/source/unodraw/shapepropertynotifier.cxx b/svx/source/unodraw/shapepropertynotifier.cxx index 3cb762eaf937..2d054a6006e4 100644 --- a/svx/source/unodraw/shapepropertynotifier.cxx +++ b/svx/source/unodraw/shapepropertynotifier.cxx @@ -31,13 +31,6 @@ namespace { - struct ShapePropertyHash - { - size_t operator()( svx::ShapeProperty x ) const - { - return size_t( x ); - } - }; } @@ -54,28 +47,10 @@ namespace svx using ::com::sun::star::lang::EventObject; using ::com::sun::star::beans::XPropertySet; - typedef std::unordered_map< ShapeProperty, std::shared_ptr<IPropertyValueProvider>, ShapePropertyHash > PropertyProviders; - - typedef cppu::OMultiTypeInterfaceContainerHelperVar<OUString> - PropertyChangeListenerContainer; - IPropertyValueProvider::~IPropertyValueProvider() { } - struct PropertyChangeNotifier_Data - { - ::cppu::OWeakObject& m_rContext; - PropertyProviders m_aProviders; - PropertyChangeListenerContainer m_aPropertyChangeListeners; - - PropertyChangeNotifier_Data( ::cppu::OWeakObject& _rContext, ::osl::Mutex& _rMutex ) - :m_rContext( _rContext ) - ,m_aPropertyChangeListeners( _rMutex ) - { - } - }; - //= PropertyValueProvider @@ -92,7 +67,8 @@ namespace svx } PropertyChangeNotifier::PropertyChangeNotifier( ::cppu::OWeakObject& _rOwner, ::osl::Mutex& _rMutex ) - :m_xData( new PropertyChangeNotifier_Data( _rOwner, _rMutex ) ) + :m_rContext( _rOwner ) + ,m_aPropertyChangeListeners( _rMutex ) { } @@ -104,30 +80,30 @@ namespace svx { ENSURE_OR_THROW( !!_rProvider, "NULL factory not allowed." ); - OSL_ENSURE( m_xData->m_aProviders.find( _eProperty ) == m_xData->m_aProviders.end(), + OSL_ENSURE( m_aProviders.find( _eProperty ) == m_aProviders.end(), "PropertyChangeNotifier::registerProvider: factory for this ID already present!" ); - m_xData->m_aProviders[ _eProperty ] = _rProvider; + m_aProviders[ _eProperty ] = _rProvider; } void PropertyChangeNotifier::notifyPropertyChange( const ShapeProperty _eProperty ) const { - PropertyProviders::const_iterator provPos = m_xData->m_aProviders.find( _eProperty ); - OSL_ENSURE( provPos != m_xData->m_aProviders.end(), "PropertyChangeNotifier::notifyPropertyChange: no factory!" ); - if ( provPos == m_xData->m_aProviders.end() ) + PropertyProviders::const_iterator provPos = m_aProviders.find( _eProperty ); + OSL_ENSURE( provPos != m_aProviders.end(), "PropertyChangeNotifier::notifyPropertyChange: no factory!" ); + if ( provPos == m_aProviders.end() ) return; OUString sPropertyName( provPos->second->getPropertyName() ); - ::cppu::OInterfaceContainerHelper* pPropListeners = m_xData->m_aPropertyChangeListeners.getContainer( sPropertyName ); - ::cppu::OInterfaceContainerHelper* pAllListeners = m_xData->m_aPropertyChangeListeners.getContainer( OUString() ); + ::cppu::OInterfaceContainerHelper* pPropListeners = m_aPropertyChangeListeners.getContainer( sPropertyName ); + ::cppu::OInterfaceContainerHelper* pAllListeners = m_aPropertyChangeListeners.getContainer( OUString() ); if ( !pPropListeners && !pAllListeners ) return; try { PropertyChangeEvent aEvent; - aEvent.Source = m_xData->m_rContext; + aEvent.Source = m_rContext; // Handle/OldValue not supported aEvent.PropertyName = provPos->second->getPropertyName(); provPos->second->getCurrentValue( aEvent.NewValue ); @@ -146,21 +122,21 @@ namespace svx void PropertyChangeNotifier::addPropertyChangeListener( const OUString& _rPropertyName, const Reference< XPropertyChangeListener >& _rxListener ) { - m_xData->m_aPropertyChangeListeners.addInterface( _rPropertyName, _rxListener ); + m_aPropertyChangeListeners.addInterface( _rPropertyName, _rxListener ); } void PropertyChangeNotifier::removePropertyChangeListener( const OUString& _rPropertyName, const Reference< XPropertyChangeListener >& _rxListener ) { - m_xData->m_aPropertyChangeListeners.removeInterface( _rPropertyName, _rxListener ); + m_aPropertyChangeListeners.removeInterface( _rPropertyName, _rxListener ); } void PropertyChangeNotifier::disposing() { EventObject aEvent; - aEvent.Source = m_xData->m_rContext; - m_xData->m_aPropertyChangeListeners.disposeAndClear( aEvent ); + aEvent.Source = m_rContext; + m_aPropertyChangeListeners.disposeAndClear( aEvent ); } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits