include/o3tl/lru_map.hxx |    9 ++++++++-
 o3tl/qa/test-lru_map.cxx |   14 ++++++++++++++
 2 files changed, 22 insertions(+), 1 deletion(-)

New commits:
commit cb10c29a3255620bf69480aa7b653962fb04786e
Author:     Luboš Luňák <l.lu...@collabora.com>
AuthorDate: Wed Jun 9 17:10:42 2021 +0200
Commit:     Michael Meeks <michael.me...@collabora.com>
CommitDate: Thu Jun 10 09:42:17 2021 +0200

    allow altering the max size of o3tl::lru_cache
    
    Change-Id: Id119b70275e1c88a8c57f89d915241427be9dbf5
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/116927
    Tested-by: Jenkins
    Reviewed-by: Luboš Luňák <l.lu...@collabora.com>
    (cherry picked from commit 62b58e88d897f51a7c4e12b41d14121ab8d3396f)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/116897
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    Reviewed-by: Michael Meeks <michael.me...@collabora.com>

diff --git a/include/o3tl/lru_map.hxx b/include/o3tl/lru_map.hxx
index 96fb3161782d..a38d35bdb1c8 100644
--- a/include/o3tl/lru_map.hxx
+++ b/include/o3tl/lru_map.hxx
@@ -49,7 +49,7 @@ private:
 
     list_t mLruList;
     map_t mLruMap;
-    const size_t mMaxSize;
+    size_t mMaxSize;
 
     void checkLRU()
     {
@@ -80,6 +80,13 @@ public:
         aLruListTemp.swap(mLruList);
     }
 
+    void setMaxSize(size_t nMaxSize)
+    {
+        mMaxSize = nMaxSize ? nMaxSize : std::min(mLruMap.max_size(), 
mLruList.max_size());
+        while (mLruMap.size() > mMaxSize)
+            checkLRU();
+    }
+
     void insert(key_value_pair_t& rPair)
     {
         map_iterator_t i = mLruMap.find(rPair.first);
diff --git a/o3tl/qa/test-lru_map.cxx b/o3tl/qa/test-lru_map.cxx
index ba9ee71835ce..d13ab8273a00 100644
--- a/o3tl/qa/test-lru_map.cxx
+++ b/o3tl/qa/test-lru_map.cxx
@@ -29,6 +29,7 @@ public:
     void testCustomHash();
     void testRemoveIf();
     void testNoAutoCleanup();
+    void testChangeMaxSize();
 
     CPPUNIT_TEST_SUITE(lru_map_test);
     CPPUNIT_TEST(testBaseUsage);
@@ -38,6 +39,7 @@ public:
     CPPUNIT_TEST(testCustomHash);
     CPPUNIT_TEST(testRemoveIf);
     CPPUNIT_TEST(testNoAutoCleanup);
+    CPPUNIT_TEST(testChangeMaxSize);
     CPPUNIT_TEST_SUITE_END();
 };
 
@@ -310,6 +312,18 @@ void lru_map_test::testNoAutoCleanup()
     }
 }
 
+void lru_map_test::testChangeMaxSize()
+{
+    o3tl::lru_map<int, int> lru(3);
+    CPPUNIT_ASSERT_EQUAL(size_t(0), lru.size());
+    lru.insert({ 0, 0 });
+    lru.insert({ 1, 1 });
+    lru.insert({ 2, 2 });
+    CPPUNIT_ASSERT_EQUAL(size_t(3), lru.size());
+    lru.setMaxSize(1);
+    CPPUNIT_ASSERT_EQUAL(size_t(1), lru.size());
+}
+
 CPPUNIT_TEST_SUITE_REGISTRATION(lru_map_test);
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to