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 )

Reply via email to