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;
