editeng/source/items/paraitem.cxx |   14 ++++++++++++++
 include/editeng/tstpitem.hxx      |    4 +++-
 2 files changed, 17 insertions(+), 1 deletion(-)

New commits:
commit d78a07573eac1960c8c6c736e6c05bf304f96cb1
Author:     Noel Grandin <[email protected]>
AuthorDate: Wed Aug 21 11:23:37 2024 +0200
Commit:     Noel Grandin <[email protected]>
CommitDate: Wed Aug 21 12:56:21 2024 +0200

    tdf#158556 make SvxTabStopItem hashable
    
    speeds up searching for it in the item pool
    
    Change-Id: I37e8889e41d63a41e1a4bf2a35b4aa303745e15c
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/172171
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <[email protected]>

diff --git a/editeng/source/items/paraitem.cxx 
b/editeng/source/items/paraitem.cxx
index f70ff274e787..4019a6ce2c6b 100644
--- a/editeng/source/items/paraitem.cxx
+++ b/editeng/source/items/paraitem.cxx
@@ -50,6 +50,7 @@
 #include <editeng/memberids.h>
 #include <editeng/itemtype.hxx>
 #include <editeng/eerdll.hxx>
+#include <o3tl/hash_combine.hxx>
 
 using namespace ::com::sun::star;
 
@@ -877,6 +878,7 @@ sal_uInt16 SvxTabStopItem::GetPos( const sal_Int32 nPos ) 
const
 
 void SvxTabStopItem::SetDefaultDistance(sal_Int32 nDefaultDistance)
 {
+    ASSERT_CHANGE_REFCOUNTED_ITEM;
     mnDefaultDistance = nDefaultDistance;
 }
 
@@ -933,6 +935,7 @@ bool SvxTabStopItem::QueryValue( uno::Any& rVal, sal_uInt8 
nMemberId ) const
 
 bool SvxTabStopItem::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId )
 {
+    ASSERT_CHANGE_REFCOUNTED_ITEM;
     bool bConvert = 0!=(nMemberId&CONVERT_TWIPS);
     nMemberId &= ~CONVERT_TWIPS;
     switch ( nMemberId )
@@ -1059,6 +1062,15 @@ bool SvxTabStopItem::operator==( const SfxPoolItem& 
rAttr ) const
     return true;
 }
 
+size_t SvxTabStopItem::hashCode() const
+{
+    std::size_t seed(0);
+    o3tl::hash_combine(seed, Which());
+    o3tl::hash_combine(seed, mnDefaultDistance);
+    o3tl::hash_combine(seed, maTabStops.size());
+    return seed;
+}
+
 SvxTabStopItem* SvxTabStopItem::Clone( SfxItemPool * ) const
 {
     return new SvxTabStopItem( *this );
@@ -1098,6 +1110,7 @@ bool SvxTabStopItem::GetPresentation
 
 bool SvxTabStopItem::Insert( const SvxTabStop& rTab )
 {
+    ASSERT_CHANGE_REFCOUNTED_ITEM;
     sal_uInt16 nTabPos = GetPos(rTab);
     if(SVX_TAB_NOTFOUND != nTabPos )
         Remove(nTabPos);
@@ -1106,6 +1119,7 @@ bool SvxTabStopItem::Insert( const SvxTabStop& rTab )
 
 void SvxTabStopItem::Insert( const SvxTabStopItem* pTabs )
 {
+    ASSERT_CHANGE_REFCOUNTED_ITEM;
     for( sal_uInt16 i = 0; i < pTabs->Count(); i++ )
     {
         const SvxTabStop& rTab = (*pTabs)[i];
diff --git a/include/editeng/tstpitem.hxx b/include/editeng/tstpitem.hxx
index f0f99ce9cc86..840b294243f9 100644
--- a/include/editeng/tstpitem.hxx
+++ b/include/editeng/tstpitem.hxx
@@ -116,7 +116,7 @@ public:
     bool                Insert( const SvxTabStop& rTab );
     void                Insert( const SvxTabStopItem* pTabs );
     void                Remove( const sal_uInt16 nPos, const sal_uInt16 nLen = 
1 )
-                        { maTabStops.erase( maTabStops.begin() + nPos, 
maTabStops.begin() + nPos + nLen ); }
+                        { ASSERT_CHANGE_REFCOUNTED_ITEM; maTabStops.erase( 
maTabStops.begin() + nPos, maTabStops.begin() + nPos + nLen ); }
 
     // Assignment operator, equality operator (caution: expensive!)
 
@@ -134,6 +134,8 @@ public:
 
     // "pure virtual Methods" from SfxPoolItem
     virtual bool             operator==( const SfxPoolItem& ) const override;
+    virtual bool             supportsHashCode() const override { return true; }
+    virtual size_t           hashCode() const override final;
     virtual bool             QueryValue( css::uno::Any& rVal, sal_uInt8 
nMemberId = 0 ) const override;
     virtual bool             PutValue( const css::uno::Any& rVal, sal_uInt8 
nMemberId ) override;
 

Reply via email to