editeng/source/items/textitem.cxx | 119 +++++++------------------------------- include/editeng/fhgtitem.hxx | 1 include/editeng/fontitem.hxx | 1 include/svl/cintitem.hxx | 12 +++ include/svl/eitem.hxx | 10 +++ include/svl/poolitem.hxx | 14 +--- svl/source/items/cintitem.cxx | 61 +++++++++++++++++++ svl/source/items/globalpool.cxx | 14 +++- svl/source/items/poolitem.cxx | 10 +++ sw/inc/fmtfsize.hxx | 1 sw/inc/fmtornt.hxx | 2 sw/source/core/layout/atrfrm.cxx | 113 +++++++++++------------------------- 12 files changed, 175 insertions(+), 183 deletions(-)
New commits: commit c3e8dbc139c3b1644ea07101a8c1111572ffa017 Author: Noel Grandin <noelgran...@gmail.com> AuthorDate: Sun Jul 21 14:35:21 2024 +0200 Commit: Noel Grandin <noel.gran...@collabora.co.uk> CommitDate: Mon Jul 22 11:29:32 2024 +0200 Improve the perf for pool item scanning.. for large complex documents with lots of shapes. When that happens, we spend a lot of time scanning the std::unordered_set inside DefaultItemInstanceManager. Since most of our items are already capable of being hashed, and thus avoiding the scanning cost, make it so we can use the HashableItemInstanceManager most of the time. Change-Id: I43f4c04e956d316c976bea67d1941529d2d91182 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/170813 Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> Tested-by: Jenkins Tested-by: Armin Le Grand <armin.le.gr...@me.com> Tested-by: Noel Grandin <noel.gran...@collabora.co.uk> diff --git a/editeng/source/items/textitem.cxx b/editeng/source/items/textitem.cxx index a44ca0bfe612..cf4d9e27a8d8 100644 --- a/editeng/source/items/textitem.cxx +++ b/editeng/source/items/textitem.cxx @@ -159,35 +159,22 @@ bool SvxFontListItem::GetPresentation // class SvxFontItem ----------------------------------------------------- -namespace +ItemInstanceManager* SvxFontItem::getItemInstanceManager() const { - class SvxFontItemInstanceManager : public HashedItemInstanceManager - { - protected: - virtual size_t hashCode(const SfxPoolItem& rItem) const override - { - const SvxFontItem& rFontItem(static_cast<const SvxFontItem&>(rItem)); - std::size_t seed(0); - o3tl::hash_combine(seed, rItem.Which()); - o3tl::hash_combine(seed, rFontItem.GetFamilyName().hashCode()); - o3tl::hash_combine(seed, rFontItem.GetStyleName().hashCode()); - o3tl::hash_combine(seed, rFontItem.GetFamily()); - o3tl::hash_combine(seed, rFontItem.GetPitch()); - o3tl::hash_combine(seed, rFontItem.GetCharSet()); - return seed; - } - public: - SvxFontItemInstanceManager(SfxItemType aSfxItemType) - : HashedItemInstanceManager(aSfxItemType) - { - } - }; + static HashedItemInstanceManager aInstanceManager(ItemType()); + return &aInstanceManager; } -ItemInstanceManager* SvxFontItem::getItemInstanceManager() const +size_t SvxFontItem::hashCode() const { - static SvxFontItemInstanceManager aInstanceManager(ItemType()); - return &aInstanceManager; + std::size_t seed(0); + o3tl::hash_combine(seed, Which()); + o3tl::hash_combine(seed, GetFamilyName().hashCode()); + o3tl::hash_combine(seed, GetStyleName().hashCode()); + o3tl::hash_combine(seed, GetFamily()); + o3tl::hash_combine(seed, GetPitch()); + o3tl::hash_combine(seed, GetCharSet()); + return seed; } SvxFontItem::SvxFontItem( @@ -414,31 +401,9 @@ void SvxFontItem::dumpAsXml(xmlTextWriterPtr pWriter) const // class SvxPostureItem -------------------------------------------------- -namespace -{ - class SvxPostureItemInstanceManager : public HashedItemInstanceManager - { - protected: - virtual size_t hashCode(const SfxPoolItem& rItem) const override - { - auto const & rPostureItem = static_cast<const SvxPostureItem&>(rItem); - std::size_t seed(0); - o3tl::hash_combine(seed, rItem.Which()); - o3tl::hash_combine(seed, rPostureItem.Which()); - o3tl::hash_combine(seed, rPostureItem. GetEnumValue()); - return seed; - } - public: - SvxPostureItemInstanceManager(SfxItemType aSfxItemType) - : HashedItemInstanceManager(aSfxItemType) - { - } - }; -} - ItemInstanceManager* SvxPostureItem::getItemInstanceManager() const { - static SvxPostureItemInstanceManager aInstanceManager(ItemType()); + static HashedItemInstanceManager aInstanceManager(ItemType()); return &aInstanceManager; } @@ -688,34 +653,20 @@ void SvxWeightItem::dumpAsXml(xmlTextWriterPtr pWriter) const // class SvxFontHeightItem ----------------------------------------------- -namespace +ItemInstanceManager* SvxFontHeightItem::getItemInstanceManager() const { - class SvxFontHeightItemInstanceManager : public HashedItemInstanceManager - { - protected: - virtual size_t hashCode(const SfxPoolItem& rItem) const override - { - auto const & rFontHeightItem = static_cast<const SvxFontHeightItem&>(rItem); - std::size_t seed(0); - o3tl::hash_combine(seed, rItem.Which()); - o3tl::hash_combine(seed, rFontHeightItem.Which()); - o3tl::hash_combine(seed, rFontHeightItem.GetHeight()); - o3tl::hash_combine(seed, rFontHeightItem.GetProp()); - o3tl::hash_combine(seed, rFontHeightItem.GetPropUnit()); - return seed; - } - public: - SvxFontHeightItemInstanceManager(SfxItemType aSfxItemType) - : HashedItemInstanceManager(aSfxItemType) - { - } - }; + static HashedItemInstanceManager aInstanceManager(ItemType()); + return &aInstanceManager; } -ItemInstanceManager* SvxFontHeightItem::getItemInstanceManager() const +size_t SvxFontHeightItem::hashCode() const { - static SvxFontHeightItemInstanceManager aInstanceManager(ItemType()); - return &aInstanceManager; + std::size_t seed(0); + o3tl::hash_combine(seed, Which()); + o3tl::hash_combine(seed, GetHeight()); + o3tl::hash_combine(seed, GetProp()); + o3tl::hash_combine(seed, GetPropUnit()); + return seed; } SvxFontHeightItem::SvxFontHeightItem( const sal_uInt32 nSz, @@ -2986,31 +2937,9 @@ void GetDefaultFonts( SvxFontItem& rLatin, SvxFontItem& rAsian, SvxFontItem& rCo // class SvxRsidItem ----------------------------------------------------- -namespace -{ - class SvxRsidItemInstanceManager : public HashedItemInstanceManager - { - protected: - virtual size_t hashCode(const SfxPoolItem& rItem) const override - { - auto const & rRsidItem = static_cast<const SvxRsidItem&>(rItem); - std::size_t seed(0); - o3tl::hash_combine(seed, rItem.Which()); - o3tl::hash_combine(seed, rRsidItem.Which()); - o3tl::hash_combine(seed, rRsidItem.GetValue()); - return seed; - } - public: - SvxRsidItemInstanceManager(SfxItemType aSfxItemType) - : HashedItemInstanceManager(aSfxItemType) - { - } - }; -} - ItemInstanceManager* SvxRsidItem::getItemInstanceManager() const { - static SvxRsidItemInstanceManager aInstanceManager(ItemType()); + static HashedItemInstanceManager aInstanceManager(ItemType()); return &aInstanceManager; } diff --git a/include/editeng/fhgtitem.hxx b/include/editeng/fhgtitem.hxx index bdde8c6f0afd..c8643a8095d7 100644 --- a/include/editeng/fhgtitem.hxx +++ b/include/editeng/fhgtitem.hxx @@ -55,6 +55,7 @@ public: // "pure virtual Methods" from SfxPoolItem virtual bool operator==( const SfxPoolItem& ) const override; + virtual size_t hashCode() const override; 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; diff --git a/include/editeng/fontitem.hxx b/include/editeng/fontitem.hxx index f892178c521e..c00208fee9bf 100644 --- a/include/editeng/fontitem.hxx +++ b/include/editeng/fontitem.hxx @@ -49,6 +49,7 @@ public: // "pure virtual Methods" from SfxPoolItem virtual bool operator==(const SfxPoolItem& rItem) const override; + virtual size_t hashCode() const override; virtual SvxFontItem* Clone(SfxItemPool *pPool = nullptr) const override; 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; diff --git a/include/svl/cintitem.hxx b/include/svl/cintitem.hxx index d9c0f273f260..17becbaba92c 100644 --- a/include/svl/cintitem.hxx +++ b/include/svl/cintitem.hxx @@ -35,6 +35,9 @@ public: virtual bool operator ==(const SfxPoolItem & rItem) const override; + virtual bool supportsHashCode() const override; + virtual size_t hashCode() const override final; + virtual bool GetPresentation(SfxItemPresentation, MapUnit, MapUnit, OUString & rText, @@ -66,6 +69,9 @@ public: virtual bool operator ==(const SfxPoolItem & rItem) const override; + virtual bool supportsHashCode() const override final; + virtual size_t hashCode() const override final; + virtual bool GetPresentation(SfxItemPresentation, MapUnit, MapUnit, OUString & rText, @@ -98,6 +104,9 @@ public: virtual bool operator ==(const SfxPoolItem & rItem) const override; + virtual bool supportsHashCode() const override final; + virtual size_t hashCode() const override final; + virtual bool GetPresentation(SfxItemPresentation, MapUnit, MapUnit, OUString & rText, @@ -130,6 +139,9 @@ public: virtual bool operator ==(const SfxPoolItem & rItem) const override; + virtual bool supportsHashCode() const override final; + virtual size_t hashCode() const override final; + virtual bool GetPresentation(SfxItemPresentation, MapUnit, MapUnit, OUString & rText, diff --git a/include/svl/eitem.hxx b/include/svl/eitem.hxx index f6fb22bfeb7d..fd398e8f0cbb 100644 --- a/include/svl/eitem.hxx +++ b/include/svl/eitem.hxx @@ -62,6 +62,16 @@ public: return SfxEnumItemInterface::operator==(other) && m_nValue == static_cast<const SfxEnumItem<EnumT> &>(other).m_nValue; } + + virtual bool supportsHashCode() const override final + { + return true; + } + + virtual size_t hashCode() const override final + { + return Which() ^ GetEnumValue(); + } }; class SVL_DLLPUBLIC SfxBoolItem diff --git a/include/svl/poolitem.hxx b/include/svl/poolitem.hxx index 722c30df2bee..60b6ae98068b 100644 --- a/include/svl/poolitem.hxx +++ b/include/svl/poolitem.hxx @@ -675,6 +675,9 @@ public: virtual bool operator==( const SfxPoolItem& ) const = 0; bool operator!=( const SfxPoolItem& rItem ) const { return !(*this == rItem); } + // Used by HashedItemInstanceManager + virtual bool supportsHashCode() const; + virtual size_t hashCode() const; /** @return true if it has a valid string representation */ virtual bool GetPresentation( SfxItemPresentation ePresentation, @@ -762,14 +765,12 @@ private: for specific PoolItem subclasses that can be hashed which is faster than using the linear search with operator== that DefaultItemInstanceManager has to do */ -class HashedItemInstanceManager : public ItemInstanceManager +class HashedItemInstanceManager final : public ItemInstanceManager { struct ItemHash { - HashedItemInstanceManager& mrManager; - ItemHash(HashedItemInstanceManager& rManager) : mrManager(rManager) {} size_t operator()(const SfxPoolItem* p) const { - return mrManager.hashCode(*p); + return p->hashCode(); } }; struct ItemEqual { @@ -781,13 +782,10 @@ class HashedItemInstanceManager : public ItemInstanceManager std::unordered_set<const SfxPoolItem*, ItemHash, ItemEqual> maRegistered; -protected: - virtual size_t hashCode(const SfxPoolItem&) const = 0; - public: HashedItemInstanceManager(SfxItemType aSfxItemType) : ItemInstanceManager(aSfxItemType) - , maRegistered(0, ItemHash(*this), ItemEqual()) + , maRegistered(0, ItemHash(), ItemEqual()) { } diff --git a/svl/source/items/cintitem.cxx b/svl/source/items/cintitem.cxx index d9a77adc2a23..3063af33e66d 100644 --- a/svl/source/items/cintitem.cxx +++ b/svl/source/items/cintitem.cxx @@ -18,6 +18,7 @@ */ #include <com/sun/star/uno/Any.hxx> +#include <o3tl/hash_combine.hxx> #include <svl/cintitem.hxx> #include <sal/log.hxx> @@ -29,6 +30,21 @@ bool CntByteItem::operator ==(const SfxPoolItem & rItem) const return m_nValue == static_cast< const CntByteItem * >(&rItem)->m_nValue; } +// virtual +bool CntByteItem::supportsHashCode() const +{ + return true; +} + +// virtual +size_t CntByteItem::hashCode() const +{ + std::size_t seed(0); + o3tl::hash_combine(seed, Which()); + o3tl::hash_combine(seed, m_nValue); + return seed; +} + // virtual bool CntByteItem::GetPresentation(SfxItemPresentation, MapUnit, MapUnit, OUString & rText, @@ -73,6 +89,21 @@ bool CntUInt16Item::operator ==(const SfxPoolItem & rItem) const return m_nValue == static_cast<const CntUInt16Item *>(&rItem)->m_nValue; } +// virtual +bool CntUInt16Item::supportsHashCode() const +{ + return true; +} + +// virtual +size_t CntUInt16Item::hashCode() const +{ + std::size_t seed(0); + o3tl::hash_combine(seed, Which()); + o3tl::hash_combine(seed, m_nValue); + return seed; +} + // virtual bool CntUInt16Item::GetPresentation(SfxItemPresentation, MapUnit, MapUnit, @@ -120,6 +151,21 @@ bool CntInt32Item::operator ==(const SfxPoolItem & rItem) const return m_nValue == static_cast<const CntInt32Item *>(&rItem)->m_nValue; } +// virtual +bool CntInt32Item::supportsHashCode() const +{ + return true; +} + +// virtual +size_t CntInt32Item::hashCode() const +{ + std::size_t seed(0); + o3tl::hash_combine(seed, Which()); + o3tl::hash_combine(seed, m_nValue); + return seed; +} + // virtual bool CntInt32Item::GetPresentation(SfxItemPresentation, MapUnit, MapUnit, @@ -165,6 +211,21 @@ bool CntUInt32Item::operator ==(const SfxPoolItem & rItem) const return m_nValue == static_cast<const CntUInt32Item *>(&rItem)->m_nValue; } +// virtual +bool CntUInt32Item::supportsHashCode() const +{ + return true; +} + +// virtual +size_t CntUInt32Item::hashCode() const +{ + std::size_t seed(0); + o3tl::hash_combine(seed, Which()); + o3tl::hash_combine(seed, m_nValue); + return seed; +} + // virtual bool CntUInt32Item::GetPresentation(SfxItemPresentation, MapUnit, MapUnit, diff --git a/svl/source/items/globalpool.cxx b/svl/source/items/globalpool.cxx index c5ecfba62c2a..9f0e26ef8547 100644 --- a/svl/source/items/globalpool.cxx +++ b/svl/source/items/globalpool.cxx @@ -125,7 +125,7 @@ void DefaultItemInstanceManager::remove(const SfxPoolItem& rItem) // ignored and start sharing ALL Item derivations instantly. class InstanceManagerHelper { - typedef std::unordered_map<SfxItemType, std::pair<sal_uInt16, DefaultItemInstanceManager*>> + typedef std::unordered_map<SfxItemType, std::pair<sal_uInt16, ItemInstanceManager*>> managerTypeMap; managerTypeMap maManagerPerType; @@ -169,7 +169,11 @@ public: if (g_bShareImmediately) { // create, insert locally and immediately start sharing - DefaultItemInstanceManager* pNew(new DefaultItemInstanceManager(rItem.ItemType())); + ItemInstanceManager* pNew; + if (rItem.supportsHashCode()) + pNew = new HashedItemInstanceManager(rItem.ItemType()); + else + pNew = new DefaultItemInstanceManager(rItem.ItemType()); maManagerPerType.insert({ rItem.ItemType(), std::make_pair(0, pNew) }); return pNew; } @@ -194,7 +198,11 @@ public: // here the countdown is zero and there is not yet a ItemInstanceManager // incarnated. Do so, register and return it assert(nullptr == aHit->second.second); - DefaultItemInstanceManager* pNew(new DefaultItemInstanceManager(rItem.ItemType())); + ItemInstanceManager* pNew; + if (rItem.supportsHashCode()) + pNew = new HashedItemInstanceManager(rItem.ItemType()); + else + pNew = new DefaultItemInstanceManager(rItem.ItemType()); aHit->second.second = pNew; return pNew; diff --git a/svl/source/items/poolitem.cxx b/svl/source/items/poolitem.cxx index 709d7aa64a83..85aa8b998878 100644 --- a/svl/source/items/poolitem.cxx +++ b/svl/source/items/poolitem.cxx @@ -557,6 +557,16 @@ bool SfxPoolItem::operator==(const SfxPoolItem& rCmp) const return true; } +bool SfxPoolItem::supportsHashCode() const { return false; } + +size_t SfxPoolItem::hashCode() const +{ + assert(false + && "this should never be called, classes should implement both supportsHashCode() and " + "hashCode(), or neither"); + return 0; +} + /** * This virtual method allows to get a textual representation of the value * for the SfxPoolItem subclasses. It should be overridden by all UI-relevant diff --git a/sw/inc/fmtfsize.hxx b/sw/inc/fmtfsize.hxx index 4607d2c83579..5828b1e79ff0 100644 --- a/sw/inc/fmtfsize.hxx +++ b/sw/inc/fmtfsize.hxx @@ -77,6 +77,7 @@ public: SwTwips nWidth = 0, SwTwips nHeight = 0 ); virtual bool operator==( const SfxPoolItem& ) const override; + virtual size_t hashCode() const override; virtual SwFormatFrameSize* Clone( SfxItemPool *pPool = nullptr ) const override; virtual bool GetPresentation( SfxItemPresentation ePres, MapUnit eCoreMetric, diff --git a/sw/inc/fmtornt.hxx b/sw/inc/fmtornt.hxx index 9e4ef933c97e..bbad533a8d0e 100644 --- a/sw/inc/fmtornt.hxx +++ b/sw/inc/fmtornt.hxx @@ -45,6 +45,7 @@ public: /// "Pure virtual methods" of SfxPoolItem. virtual bool operator==( const SfxPoolItem& ) const override; + virtual size_t hashCode() const override; virtual SwFormatVertOrient* Clone( SfxItemPool* pPool = nullptr ) const override; virtual bool GetPresentation( SfxItemPresentation ePres, MapUnit eCoreMetric, @@ -88,6 +89,7 @@ public: /// "Pure virtual methods" of SfxPoolItem. virtual bool operator==( const SfxPoolItem& ) const override; + virtual size_t hashCode() const override; virtual SwFormatHoriOrient* Clone( SfxItemPool* pPool = nullptr ) const override; virtual bool GetPresentation( SfxItemPresentation ePres, MapUnit eCoreMetric, diff --git a/sw/source/core/layout/atrfrm.cxx b/sw/source/core/layout/atrfrm.cxx index 586c12ed4510..47411a6b230f 100644 --- a/sw/source/core/layout/atrfrm.cxx +++ b/sw/source/core/layout/atrfrm.cxx @@ -216,38 +216,25 @@ static void lcl_DelHFFormat( SwClient *pToRemove, SwFrameFormat *pFormat ) delete pFormat; } -namespace +ItemInstanceManager* SwFormatFrameSize::getItemInstanceManager() const { - class SwFormatFrameSizeInstanceManager : public HashedItemInstanceManager - { - protected: - virtual size_t hashCode(const SfxPoolItem& rItem) const override - { - auto const & rFormatItem = static_cast<const SwFormatFrameSize&>(rItem); - std::size_t seed(0); - o3tl::hash_combine(seed, rItem.Which()); - o3tl::hash_combine(seed, rFormatItem.GetHeightSizeType()); - o3tl::hash_combine(seed, rFormatItem.GetWidthSizeType()); - o3tl::hash_combine(seed, rFormatItem.GetWidthPercent()); - o3tl::hash_combine(seed, rFormatItem.GetWidthPercentRelation()); - o3tl::hash_combine(seed, rFormatItem.GetHeightPercent()); - o3tl::hash_combine(seed, rFormatItem.GetHeightPercentRelation()); - o3tl::hash_combine(seed, rFormatItem.GetSize().Width()); - o3tl::hash_combine(seed, rFormatItem.GetSize().Height()); - return seed; - } - public: - SwFormatFrameSizeInstanceManager(SfxItemType aSfxItemType) - : HashedItemInstanceManager(aSfxItemType) - { - } - }; + static HashedItemInstanceManager aInstanceManager(ItemType()); + return &aInstanceManager; } -ItemInstanceManager* SwFormatFrameSize::getItemInstanceManager() const +size_t SwFormatFrameSize::hashCode() const { - static SwFormatFrameSizeInstanceManager aInstanceManager(ItemType()); - return &aInstanceManager; + std::size_t seed(0); + o3tl::hash_combine(seed, Which()); + o3tl::hash_combine(seed, GetHeightSizeType()); + o3tl::hash_combine(seed, GetWidthSizeType()); + o3tl::hash_combine(seed, GetWidthPercent()); + o3tl::hash_combine(seed, GetWidthPercentRelation()); + o3tl::hash_combine(seed, GetHeightPercent()); + o3tl::hash_combine(seed, GetHeightPercentRelation()); + o3tl::hash_combine(seed, GetSize().Width()); + o3tl::hash_combine(seed, GetSize().Height()); + return seed; } void SwFormatFrameSize::ScaleMetrics(tools::Long lMult, tools::Long lDiv) { @@ -1409,35 +1396,21 @@ void SwFormatSurround::dumpAsXml(xmlTextWriterPtr pWriter) const (void)xmlTextWriterEndElement(pWriter); } -namespace -{ - class SwFormatVertOrientInstanceManager : public HashedItemInstanceManager - { - protected: - virtual size_t hashCode(const SfxPoolItem& rItem) const override - { - auto const & rFormatItem = static_cast<const SwFormatVertOrient&>(rItem); - std::size_t seed(0); - o3tl::hash_combine(seed, rItem.Which()); - o3tl::hash_combine(seed, rFormatItem.GetPos()); - o3tl::hash_combine(seed, rFormatItem.GetVertOrient()); - o3tl::hash_combine(seed, rFormatItem.GetRelationOrient()); - return seed; - } - public: - SwFormatVertOrientInstanceManager(SfxItemType aSfxItemType) - : HashedItemInstanceManager(aSfxItemType) - { - } - }; -} - ItemInstanceManager* SwFormatVertOrient::getItemInstanceManager() const { - static SwFormatVertOrientInstanceManager aInstanceManager(ItemType()); + static HashedItemInstanceManager aInstanceManager(ItemType()); return &aInstanceManager; } +size_t SwFormatVertOrient::hashCode() const +{ + std::size_t seed(0); + o3tl::hash_combine(seed, Which()); + o3tl::hash_combine(seed, GetPos()); + o3tl::hash_combine(seed, GetVertOrient()); + o3tl::hash_combine(seed, GetRelationOrient()); + return seed; +} // Partially implemented inline in hxx SwFormatVertOrient::SwFormatVertOrient( SwTwips nY, sal_Int16 eVert, sal_Int16 eRel ) @@ -1530,36 +1503,22 @@ void SwFormatVertOrient::dumpAsXml(xmlTextWriterPtr pWriter) const (void)xmlTextWriterEndElement(pWriter); } -namespace -{ - class SwFormatHoriOrientInstanceManager : public HashedItemInstanceManager - { - protected: - virtual size_t hashCode(const SfxPoolItem& rItem) const override - { - auto const & rFormatItem = static_cast<const SwFormatHoriOrient&>(rItem); - std::size_t seed(0); - o3tl::hash_combine(seed, rItem.Which()); - o3tl::hash_combine(seed, rFormatItem.GetPos()); - o3tl::hash_combine(seed, rFormatItem.GetHoriOrient()); - o3tl::hash_combine(seed, rFormatItem.GetRelationOrient()); - o3tl::hash_combine(seed, rFormatItem.IsPosToggle()); - return seed; - } - public: - SwFormatHoriOrientInstanceManager(SfxItemType aSfxItemType) - : HashedItemInstanceManager(aSfxItemType) - { - } - }; -} - ItemInstanceManager* SwFormatHoriOrient::getItemInstanceManager() const { - static SwFormatHoriOrientInstanceManager aInstanceManager(ItemType()); + static HashedItemInstanceManager aInstanceManager(ItemType()); return &aInstanceManager; } +size_t SwFormatHoriOrient::hashCode() const +{ + std::size_t seed(0); + o3tl::hash_combine(seed, Which()); + o3tl::hash_combine(seed, GetPos()); + o3tl::hash_combine(seed, GetHoriOrient()); + o3tl::hash_combine(seed, GetRelationOrient()); + o3tl::hash_combine(seed, IsPosToggle()); + return seed; +} // Partially implemented inline in hxx SwFormatHoriOrient::SwFormatHoriOrient( SwTwips nX, sal_Int16 eHori, sal_Int16 eRel, bool bPos )