[Libreoffice-commits] core.git: Branch 'libreoffice-5-4' - include/svl svl/source
Eike Rathke
erack at redhat.com
Tue Jun 6 22:55:23 UTC 2017
include/svl/poolitem.hxx | 10 ++++++++++
svl/source/items/itemset.cxx | 2 +-
svl/source/items/poolitem.cxx | 9 +++++++++
3 files changed, 20 insertions(+), 1 deletion(-)
New commits:
commit 3f94381f72782e0c5b16df12de6d52de96e8a0d5
Author: Eike Rathke <erack at redhat.com>
Date: Tue Jun 6 20:53:00 2017 +0200
Perf-sc: tdf#100709 SfxPoolItem::IsVoidItem() instead of dynamic_cast
SfxItemSet::GetItemState()
before, Ir: 4 048 231 416
after, Ir: 2 577 117 709
Change-Id: I26d8b91ad5d851011a670b38b7b98e5582c319cf
(cherry picked from commit f300a627b9a88eb8814cc35844ed7c6aa7f19379)
Reviewed-on: https://gerrit.libreoffice.org/38462
Reviewed-by: Eike Rathke <erack at redhat.com>
Tested-by: Jenkins <ci at libreoffice.org>
diff --git a/include/svl/poolitem.hxx b/include/svl/poolitem.hxx
index 78ed4120841f..321b10c6dd43 100644
--- a/include/svl/poolitem.hxx
+++ b/include/svl/poolitem.hxx
@@ -176,6 +176,13 @@ public:
SfxItemKind GetKind() const { return m_nKind; }
virtual void dumpAsXml(struct _xmlTextWriter* pWriter) const;
+ /** Only SfxVoidItem shall and must return true for this.
+
+ This avoids costly calls to dynamic_cast<const SfxVoidItem*>()
+ specifically in SfxItemSet::GetItemState()
+ */
+ virtual bool IsVoidItem() const;
+
private:
SfxPoolItem& operator=( const SfxPoolItem& ) = delete;
};
@@ -252,6 +259,9 @@ public:
// create a copy of itself
virtual SfxPoolItem* Clone( SfxItemPool *pPool = nullptr ) const override;
+
+ /** Always returns true as this is an SfxVoidItem. */
+ virtual bool IsVoidItem() const override;
};
class SVL_DLLPUBLIC SfxSetItem: public SfxPoolItem
diff --git a/svl/source/items/itemset.cxx b/svl/source/items/itemset.cxx
index e69418456833..ddd821d85218 100644
--- a/svl/source/items/itemset.cxx
+++ b/svl/source/items/itemset.cxx
@@ -440,7 +440,7 @@ SfxItemState SfxItemSet::GetItemState( sal_uInt16 nWhich,
// Different ones are present
return SfxItemState::DONTCARE;
- if ( dynamic_cast<const SfxVoidItem *>(*ppFnd) != nullptr )
+ if ( (*ppFnd)->IsVoidItem() )
return SfxItemState::DISABLED;
if (ppItem)
diff --git a/svl/source/items/poolitem.cxx b/svl/source/items/poolitem.cxx
index ba27df64fcf1..5c2c77cae919 100644
--- a/svl/source/items/poolitem.cxx
+++ b/svl/source/items/poolitem.cxx
@@ -136,6 +136,10 @@ SfxPoolItem* SfxPoolItem::CloneSetWhich( sal_uInt16 nNewWhich ) const
return pItem;
}
+bool SfxPoolItem::IsVoidItem() const
+{
+ return false;
+}
SfxPoolItem* SfxVoidItem::CreateDefault()
{
@@ -186,6 +190,11 @@ SfxPoolItem* SfxVoidItem::Clone(SfxItemPool *) const
return new SfxVoidItem(*this);
}
+bool SfxVoidItem::IsVoidItem() const
+{
+ return true;
+}
+
void SfxPoolItem::ScaleMetrics( long /*lMult*/, long /*lDiv*/ )
{
}
More information about the Libreoffice-commits
mailing list