filter/source/config/cache/basecontainer.cxx |    6 +-----
 filter/source/config/cache/cacheitem.cxx     |   12 ++++++------
 filter/source/config/cache/cacheitem.hxx     |    6 +++---
 filter/source/config/cache/filtercache.cxx   |    4 ++--
 filter/source/config/cache/filtercache.hxx   |    6 +++---
 filter/source/config/cache/filterfactory.cxx |   10 ++++------
 filter/source/config/cache/typedetection.cxx |   14 +++++++-------
 7 files changed, 26 insertions(+), 32 deletions(-)

New commits:
commit 41bbc62f38b9eac97c03dc5a7e706fa6aaff055c
Author:     Noel Grandin <noel.gran...@collabora.co.uk>
AuthorDate: Mon May 23 11:26:07 2022 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Mon May 23 18:48:42 2022 +0200

    elide allocation of CacheItem when enumerating filters
    
    Change-Id: I44f83485b984548118364dc58cbc3939001506d4
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/134805
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/filter/source/config/cache/basecontainer.cxx 
b/filter/source/config/cache/basecontainer.cxx
index 6f9491eeaac1..c5c9ff939443 100644
--- a/filter/source/config/cache/basecontainer.cxx
+++ b/filter/source/config/cache/basecontainer.cxx
@@ -362,14 +362,10 @@ css::uno::Reference< css::container::XEnumeration > 
SAL_CALL BaseContainer::crea
 
     try
     {
-        // convert the given properties first to our internal representation
-        CacheItem lProps;
-        lProps << lProperties;
-
         // search the key names of all items, where its properties match
         // the given ones in its minimum
         FilterCache* pCache = impl_getWorkingCache();
-        lKeys = pCache->getMatchingItemsByProps(m_eType, lProps);
+        lKeys = pCache->getMatchingItemsByProps(m_eType, o3tl::span<const 
css::beans::NamedValue>( lProperties.getConstArray(), lProperties.getLength() 
));
     }
     catch(const css::uno::Exception&)
     {
diff --git a/filter/source/config/cache/cacheitem.cxx 
b/filter/source/config/cache/cacheitem.cxx
index dc28b5471d55..595d3891aa7d 100644
--- a/filter/source/config/cache/cacheitem.cxx
+++ b/filter/source/config/cache/cacheitem.cxx
@@ -263,19 +263,19 @@ static bool isSubSet(const css::uno::Any& aSubSet,
 }
 
 
-bool CacheItem::haveProps(const CacheItem& lProps) const
+bool CacheItem::haveProps(o3tl::span< const css::beans::NamedValue > lProps) 
const
 {
     for (auto const& prop : lProps)
     {
         // i) one required property does not exist at this item => return false
-        const_iterator pItThis = find(prop.first);
+        const_iterator pItThis = find(prop.Name);
         if (pItThis == end())
         {
             return false;
         }
 
         // ii) one item does not have the right value => return false
-        if (!isSubSet(prop.second, pItThis->second))
+        if (!isSubSet(prop.Value, pItThis->second))
         {
             return false;
         }
@@ -288,7 +288,7 @@ bool CacheItem::haveProps(const CacheItem& lProps) const
 }
 
 
-bool CacheItem::dontHaveProps(const CacheItem& lProps) const
+bool CacheItem::dontHaveProps(o3tl::span< const css::beans::NamedValue > 
lProps) const
 {
     for (auto const& prop : lProps)
     {
@@ -296,7 +296,7 @@ bool CacheItem::dontHaveProps(const CacheItem& lProps) const
         //    => continue with next one, because
         //    "excluding" means... "don't have it".
         //    And "not exists" matches to "don't have it".
-        const_iterator pItThis = find(prop.first);
+        const_iterator pItThis = find(prop.Name);
         if (pItThis == end())
         {
             continue;
@@ -305,7 +305,7 @@ bool CacheItem::dontHaveProps(const CacheItem& lProps) const
         // ii) one item have the right value => return false
         //     because this item has the requested property...
         //     But we checked for "don't have it" here.
-        if (isSubSet(prop.second, pItThis->second))
+        if (isSubSet(prop.Value, pItThis->second))
         {
             return false;
         }
diff --git a/filter/source/config/cache/cacheitem.hxx 
b/filter/source/config/cache/cacheitem.hxx
index 965bf7a40126..b20bf72c805c 100644
--- a/filter/source/config/cache/cacheitem.hxx
+++ b/filter/source/config/cache/cacheitem.hxx
@@ -24,7 +24,7 @@
 #include <com/sun/star/beans/PropertyValue.hpp>
 #include <vector>
 #include <comphelper/sequenceashashmap.hxx>
-
+#include <o3tl/span.hxx>
 
 namespace filter::config {
 
@@ -74,7 +74,7 @@ class CacheItem : public ::comphelper::SequenceAsHashMap
             @return sal_True if all given properties exists
                     at this item; sal_False otherwise.
          */
-        bool haveProps(const CacheItem& lProps) const;
+        bool haveProps(o3tl::span< const css::beans::NamedValue > lProps) 
const;
 
 
         /** @short  check, if the given properties don't exist
@@ -90,7 +90,7 @@ class CacheItem : public ::comphelper::SequenceAsHashMap
             @return sal_False if at least on property exists at this item(!);
                     sal_True otherwise.
          */
-        bool dontHaveProps(const CacheItem& lProps) const;
+        bool dontHaveProps(o3tl::span< const css::beans::NamedValue > lProps) 
const;
 
 
         /** @short  because we know two UIName properties
diff --git a/filter/source/config/cache/filtercache.cxx 
b/filter/source/config/cache/filtercache.cxx
index ec995700a366..b32586162146 100644
--- a/filter/source/config/cache/filtercache.cxx
+++ b/filter/source/config/cache/filtercache.cxx
@@ -245,8 +245,8 @@ bool FilterCache::isFillState(FilterCache::EFillState 
eState) const
 
 
 std::vector<OUString> FilterCache::getMatchingItemsByProps(      EItemType  
eType  ,
-                                                  const CacheItem& lIProps,
-                                                  const CacheItem& lEProps) 
const
+                                                  o3tl::span< const 
css::beans::NamedValue > lIProps,
+                                                  o3tl::span< const 
css::beans::NamedValue > lEProps) const
 {
     // SAFE ->
     osl::MutexGuard aLock(m_aMutex);
diff --git a/filter/source/config/cache/filtercache.hxx 
b/filter/source/config/cache/filtercache.hxx
index 8cb34701cc2a..2f647c33e708 100644
--- a/filter/source/config/cache/filtercache.hxx
+++ b/filter/source/config/cache/filtercache.hxx
@@ -361,9 +361,9 @@ class FilterCache : public cppu::BaseMutex
                         if some input parameter are wrong or the cache itself 
is not valid
                         any longer, because any operation before damage it.
          */
-        std::vector<OUString> getMatchingItemsByProps(      EItemType  eType   
             ,
-                                                     const CacheItem& lIProps  
            ,
-                                                     const CacheItem& lEProps 
= CacheItem()) const;
+        std::vector<OUString> getMatchingItemsByProps( EItemType  eType,
+                                                     o3tl::span< const 
css::beans::NamedValue > lIProps,
+                                                     o3tl::span< const 
css::beans::NamedValue > lEProps = {}) const;
 
 
         /** @short      indicates if the requested sub container
diff --git a/filter/source/config/cache/filterfactory.cxx 
b/filter/source/config/cache/filterfactory.cxx
index d98b2f3174e7..586229cb78c5 100644
--- a/filter/source/config/cache/filterfactory.cxx
+++ b/filter/source/config/cache/filterfactory.cxx
@@ -121,14 +121,13 @@ css::uno::Sequence< OUString > SAL_CALL 
FilterFactory::getAvailableServiceNames(
                   Of course we can't check for corrupted service names here. 
We can check
                   for empty strings only...
     */
-    CacheItem lIProps;
-    CacheItem lEProps;
-    lEProps[PROPNAME_FILTERSERVICE] <<= OUString();
+    css::beans::NamedValue lEProps[] {
+        { PROPNAME_FILTERSERVICE, css::uno::Any(OUString()) } };
 
     std::vector<OUString> lUNOFilters;
     try
     {
-        lUNOFilters = 
GetTheFilterCache().getMatchingItemsByProps(FilterCache::E_FILTER, lIProps, 
lEProps);
+        lUNOFilters = 
GetTheFilterCache().getMatchingItemsByProps(FilterCache::E_FILTER, {}, lEProps);
     }
     catch(const css::uno::RuntimeException&)
         { throw; }
@@ -420,8 +419,7 @@ std::vector<OUString> 
FilterFactory::impl_getSortedFilterListForModule(const OUS
     std::vector<OUString> lSortedFilters = 
impl_readSortedFilterListFromConfig(sModule);
 
     // get all filters for the requested module
-    CacheItem lIProps;
-    lIProps[PROPNAME_DOCUMENTSERVICE] <<= sModule;
+    css::beans::NamedValue lIProps[] { { PROPNAME_DOCUMENTSERVICE, 
css::uno::Any(sModule) } };
 
     // SAFE -> ----------------------
     osl::ClearableMutexGuard aLock(m_aMutex);
diff --git a/filter/source/config/cache/typedetection.cxx 
b/filter/source/config/cache/typedetection.cxx
index 8ea578f7161a..88402fbfc672 100644
--- a/filter/source/config/cache/typedetection.cxx
+++ b/filter/source/config/cache/typedetection.cxx
@@ -496,9 +496,9 @@ void 
TypeDetection::impl_checkResultsAndAddBestFilter(utl::MediaDescriptor& rDes
             // That can disturb our "load on demand feature". But we have no 
other chance!
             cache.load(FilterCache::E_CONTAINS_FILTERS);
 
-            CacheItem lIProps;
-            lIProps[PROPNAME_DOCUMENTSERVICE] <<= sDocumentService;
-            lIProps[PROPNAME_TYPE           ] <<= sRealType;
+            css::beans::NamedValue lIProps[] {
+                { PROPNAME_DOCUMENTSERVICE, uno::Any(sDocumentService) },
+                { PROPNAME_TYPE, uno::Any(sRealType) } };
             std::vector<OUString> lFilters = 
cache.getMatchingItemsByProps(FilterCache::E_FILTER, lIProps);
 
             aLock.clear();
@@ -577,8 +577,8 @@ void 
TypeDetection::impl_checkResultsAndAddBestFilter(utl::MediaDescriptor& rDes
         // That can disturb our "load on demand feature". But we have no other 
chance!
         cache.load(FilterCache::E_CONTAINS_FILTERS);
 
-        CacheItem lIProps;
-        lIProps[PROPNAME_TYPE] <<= sType;
+        css::beans::NamedValue lIProps[] {
+            { PROPNAME_TYPE, uno::Any(sType) } };
         std::vector<OUString> lFilters = 
cache.getMatchingItemsByProps(FilterCache::E_FILTER, lIProps);
 
         aLock.clear();
@@ -736,8 +736,8 @@ void TypeDetection::impl_getPreselectionForDocumentService(
         auto & cache = GetTheFilterCache();
         cache.load(FilterCache::E_CONTAINS_FILTERS);
 
-        CacheItem lIProps;
-        lIProps[PROPNAME_DOCUMENTSERVICE] <<= sPreSelDocumentService;
+        css::beans::NamedValue lIProps[] {
+            { PROPNAME_DOCUMENTSERVICE, css::uno::Any(sPreSelDocumentService) 
} };
         lFilters = cache.getMatchingItemsByProps(FilterCache::E_FILTER, 
lIProps);
         // <- SAFE --------------------------
     }

Reply via email to