editeng/source/items/textitem.cxx |  221 ++++++--------------------------------
 include/svl/poolitem.hxx          |   39 ++++++
 2 files changed, 77 insertions(+), 183 deletions(-)

New commits:
commit 534b8f6d8a7cc0bb98c243c8086ed0c81f87901d
Author:     Noel Grandin <noel.gran...@collabora.co.uk>
AuthorDate: Wed Jun 26 12:31:38 2024 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Thu Jun 27 12:51:43 2024 +0200

    reduce boilerplate code for type-specific ItemInstanceManagers
    
    create a template class to reduce repetition
    
    Change-Id: I8c9c71fdfdac20a3b34432affac07aa1d46e8373
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/169613
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>
    Tested-by: Jenkins

diff --git a/editeng/source/items/textitem.cxx 
b/editeng/source/items/textitem.cxx
index f187637866e5..2bdfdd6890d9 100644
--- a/editeng/source/items/textitem.cxx
+++ b/editeng/source/items/textitem.cxx
@@ -159,61 +159,24 @@ bool SvxFontListItem::GetPresentation
 
 // class SvxFontItem -----------------------------------------------------
 
-typedef std::unordered_map<size_t, const SfxPoolItem*> SvxFontItemMap;
-
 namespace
 {
-    class SvxFontItemInstanceManager : public ItemInstanceManager
+    class SvxFontItemInstanceManager : public 
TypeSpecificItemInstanceManager<SvxFontItem>
     {
-        SvxFontItemMap  maRegistered;
-
-    public:
-        SvxFontItemInstanceManager()
-        : ItemInstanceManager(typeid(SvxFontItem).hash_code())
+    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;
         }
-
-    private:
-        static size_t hashCode(const SfxPoolItem&);
-
-        // standard interface, accessed exclusively
-        // by implCreateItemEntry/implCleanupItemEntry
-        virtual const SfxPoolItem* find(const SfxPoolItem&) const override;
-        virtual void add(const SfxPoolItem&) override;
-        virtual void remove(const SfxPoolItem&) override;
     };
-
-    size_t SvxFontItemInstanceManager::hashCode(const SfxPoolItem& rItem)
-    {
-        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;
-    }
-
-    const SfxPoolItem* SvxFontItemInstanceManager::find(const SfxPoolItem& 
rItem) const
-    {
-        SvxFontItemMap::const_iterator 
aHit(maRegistered.find(hashCode(rItem)));
-        if (aHit != maRegistered.end())
-            return aHit->second;
-        return nullptr;
-    }
-
-    void SvxFontItemInstanceManager::add(const SfxPoolItem& rItem)
-    {
-        maRegistered.insert({hashCode(rItem), &rItem});
-    }
-
-    void SvxFontItemInstanceManager::remove(const SfxPoolItem& rItem)
-    {
-        maRegistered.erase(hashCode(rItem));
-    }
-
 }
 
 ItemInstanceManager* SvxFontItem::getItemInstanceManager() const
@@ -446,56 +409,20 @@ void SvxFontItem::dumpAsXml(xmlTextWriterPtr pWriter) 
const
 
 // class SvxPostureItem --------------------------------------------------
 
-typedef std::unordered_map<size_t, const SfxPoolItem*> SvxPostureItemMap;
-
 namespace
 {
-    class SvxPostureItemInstanceManager : public ItemInstanceManager
+    class SvxPostureItemInstanceManager : public 
TypeSpecificItemInstanceManager<SvxPostureItem>
     {
-        SvxPostureItemMap  maRegistered;
-
-    public:
-        SvxPostureItemInstanceManager()
-        : ItemInstanceManager(typeid(SvxPostureItem).hash_code())
+    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, rPostureItem.Which());
+            o3tl::hash_combine(seed, rPostureItem. GetEnumValue());
+            return seed;
         }
-
-    private:
-        static size_t hashCode(const SfxPoolItem&);
-
-        // standard interface, accessed exclusively
-        // by implCreateItemEntry/implCleanupItemEntry
-        virtual const SfxPoolItem* find(const SfxPoolItem&) const override;
-        virtual void add(const SfxPoolItem&) override;
-        virtual void remove(const SfxPoolItem&) override;
     };
-
-    size_t SvxPostureItemInstanceManager::hashCode(const SfxPoolItem& rItem)
-    {
-        auto const & rPostureItem = static_cast<const SvxPostureItem&>(rItem);
-        std::size_t seed(0);
-        o3tl::hash_combine(seed, rPostureItem.Which());
-        o3tl::hash_combine(seed, rPostureItem. GetEnumValue());
-        return seed;
-    }
-
-    const SfxPoolItem* SvxPostureItemInstanceManager::find(const SfxPoolItem& 
rItem) const
-    {
-        auto aHit(maRegistered.find(hashCode(rItem)));
-        if (aHit != maRegistered.end())
-            return aHit->second;
-        return nullptr;
-    }
-
-    void SvxPostureItemInstanceManager::add(const SfxPoolItem& rItem)
-    {
-        maRegistered.insert({hashCode(rItem), &rItem});
-    }
-
-    void SvxPostureItemInstanceManager::remove(const SfxPoolItem& rItem)
-    {
-        maRegistered.erase(hashCode(rItem));
-    }
 }
 
 ItemInstanceManager* SvxPostureItem::getItemInstanceManager() const
@@ -750,58 +677,22 @@ void SvxWeightItem::dumpAsXml(xmlTextWriterPtr pWriter) 
const
 
 // class SvxFontHeightItem -----------------------------------------------
 
-typedef std::unordered_map<size_t, const SfxPoolItem*> SvxFontHeightItemMap;
-
 namespace
 {
-    class SvxFontHeightItemInstanceManager : public ItemInstanceManager
+    class SvxFontHeightItemInstanceManager : public 
TypeSpecificItemInstanceManager<SvxFontHeightItem>
     {
-        SvxFontHeightItemMap  maRegistered;
-
-    public:
-        SvxFontHeightItemInstanceManager()
-        : ItemInstanceManager(typeid(SvxFontHeightItem).hash_code())
+    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, rFontHeightItem.Which());
+            o3tl::hash_combine(seed, rFontHeightItem.GetHeight());
+            o3tl::hash_combine(seed, rFontHeightItem.GetProp());
+            o3tl::hash_combine(seed, rFontHeightItem.GetPropUnit());
+            return seed;
         }
-
-    private:
-        static size_t hashCode(const SfxPoolItem&);
-
-        // standard interface, accessed exclusively
-        // by implCreateItemEntry/implCleanupItemEntry
-        virtual const SfxPoolItem* find(const SfxPoolItem&) const override;
-        virtual void add(const SfxPoolItem&) override;
-        virtual void remove(const SfxPoolItem&) override;
     };
-
-    size_t SvxFontHeightItemInstanceManager::hashCode(const SfxPoolItem& rItem)
-    {
-        auto const & rFontHeightItem = static_cast<const 
SvxFontHeightItem&>(rItem);
-        std::size_t seed(0);
-        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;
-    }
-
-    const SfxPoolItem* SvxFontHeightItemInstanceManager::find(const 
SfxPoolItem& rItem) const
-    {
-        auto aHit(maRegistered.find(hashCode(rItem)));
-        if (aHit != maRegistered.end())
-            return aHit->second;
-        return nullptr;
-    }
-
-    void SvxFontHeightItemInstanceManager::add(const SfxPoolItem& rItem)
-    {
-        maRegistered.insert({hashCode(rItem), &rItem});
-    }
-
-    void SvxFontHeightItemInstanceManager::remove(const SfxPoolItem& rItem)
-    {
-        maRegistered.erase(hashCode(rItem));
-    }
 }
 
 ItemInstanceManager* SvxFontHeightItem::getItemInstanceManager() const
@@ -3078,56 +2969,20 @@ void GetDefaultFonts( SvxFontItem& rLatin, SvxFontItem& 
rAsian, SvxFontItem& rCo
 
 // class SvxRsidItem -----------------------------------------------------
 
-typedef std::unordered_map<size_t, const SfxPoolItem*> SvxRsidItemMap;
-
 namespace
 {
-    class SvxRsidItemInstanceManager : public ItemInstanceManager
+    class SvxRsidItemInstanceManager : public 
TypeSpecificItemInstanceManager<SvxRsidItem>
     {
-        SvxRsidItemMap  maRegistered;
-
-    public:
-        SvxRsidItemInstanceManager()
-        : ItemInstanceManager(typeid(SvxRsidItem).hash_code())
+    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, rRsidItem.Which());
+            o3tl::hash_combine(seed, rRsidItem.GetValue());
+            return seed;
         }
-
-    private:
-        static size_t hashCode(const SfxPoolItem&);
-
-        // standard interface, accessed exclusively
-        // by implCreateItemEntry/implCleanupItemEntry
-        virtual const SfxPoolItem* find(const SfxPoolItem&) const override;
-        virtual void add(const SfxPoolItem&) override;
-        virtual void remove(const SfxPoolItem&) override;
     };
-
-    size_t SvxRsidItemInstanceManager::hashCode(const SfxPoolItem& rItem)
-    {
-        auto const & rRsidItem = static_cast<const SvxRsidItem&>(rItem);
-        std::size_t seed(0);
-        o3tl::hash_combine(seed, rRsidItem.Which());
-        o3tl::hash_combine(seed, rRsidItem.GetValue());
-        return seed;
-    }
-
-    const SfxPoolItem* SvxRsidItemInstanceManager::find(const SfxPoolItem& 
rItem) const
-    {
-        auto aHit(maRegistered.find(hashCode(rItem)));
-        if (aHit != maRegistered.end())
-            return aHit->second;
-        return nullptr;
-    }
-
-    void SvxRsidItemInstanceManager::add(const SfxPoolItem& rItem)
-    {
-        maRegistered.insert({hashCode(rItem), &rItem});
-    }
-
-    void SvxRsidItemInstanceManager::remove(const SfxPoolItem& rItem)
-    {
-        maRegistered.erase(hashCode(rItem));
-    }
 }
 
 ItemInstanceManager* SvxRsidItem::getItemInstanceManager() const
diff --git a/include/svl/poolitem.hxx b/include/svl/poolitem.hxx
index bdfb814e3c0a..1cb667b5c90c 100644
--- a/include/svl/poolitem.hxx
+++ b/include/svl/poolitem.hxx
@@ -653,6 +653,45 @@ private:
     virtual void remove(const SfxPoolItem&) override;
 };
 
+/**
+  Utility template to reduce boilerplate code when creating item instance 
managers
+  for specific PoolItem subclasses.
+*/
+template<class T>
+class TypeSpecificItemInstanceManager : public ItemInstanceManager
+{
+public:
+    TypeSpecificItemInstanceManager()
+    : ItemInstanceManager(typeid(T).hash_code())
+    {
+    }
+
+    // standard interface, accessed exclusively
+    // by implCreateItemEntry/implCleanupItemEntry
+    virtual const SfxPoolItem* find(const SfxPoolItem& rItem) const override 
final
+    {
+        auto aHit(maRegistered.find(hashCode(rItem)));
+        if (aHit != maRegistered.end())
+            return aHit->second;
+        return nullptr;
+    }
+    virtual void add(const SfxPoolItem& rItem) override final
+    {
+        maRegistered.insert({hashCode(rItem), &rItem});
+    }
+    virtual void remove(const SfxPoolItem& rItem) override final
+    {
+        maRegistered.erase(hashCode(rItem));
+    }
+
+protected:
+    virtual size_t hashCode(const SfxPoolItem&) const = 0;
+
+private:
+    std::unordered_map<size_t, const SfxPoolItem*> maRegistered;
+};
+
+
 inline bool IsStaticDefaultItem(const SfxPoolItem *pItem )
 {
     return pItem && pItem->isStaticDefault();

Reply via email to