summaryrefslogtreecommitdiff
path: root/svl/source
diff options
context:
space:
mode:
authorKohei Yoshida <kohei.yoshida@collabora.com>2013-10-02 16:35:41 -0400
committerKohei Yoshida <kohei.yoshida@collabora.com>2013-10-04 19:15:23 -0400
commit5f5876e5c395808006daef3456a961d9e6756791 (patch)
tree4695bbda72a078015f616ed36f54d1e923e3f940 /svl/source
parent46ca6ab1fe69a29b75c3b9c3a04af27b5af63fd3 (diff)
Add purge() method to purge unreferenced strings from the pool.
But this code needs more work. Change-Id: I538eebf5eb1738a2cfeebc22052b3d5db6001b6b
Diffstat (limited to 'svl/source')
-rw-r--r--svl/source/misc/stringpool.cxx54
1 files changed, 54 insertions, 0 deletions
diff --git a/svl/source/misc/stringpool.cxx b/svl/source/misc/stringpool.cxx
index 11b62881b95b..f4d9996d2dee 100644
--- a/svl/source/misc/stringpool.cxx
+++ b/svl/source/misc/stringpool.cxx
@@ -67,6 +67,60 @@ StringPool::StrIdType StringPool::getIdentifierIgnoreCase( const OUString& rStr
return reinterpret_cast<StrIdType>(pUpper);
}
+namespace {
+
+inline sal_Int32 getRefCount( const rtl_uString* p )
+{
+ return (p->refCount & 0x3FFFFFFF);
+}
+
+}
+
+void StringPool::purge()
+{
+ StrHashType aNewStrPool;
+ StrHashType::iterator it = maStrPool.begin(), itEnd = maStrPool.end();
+ for (; it != itEnd; ++it)
+ {
+ const rtl_uString* p = it->pData;
+ if (getRefCount(p) == 1)
+ {
+ // Remove it from the upper string map. This should unref the
+ // upper string linked to this original string.
+ maToUpperMap.erase(p);
+ }
+ else
+ // Still referenced outside the pool. Keep it.
+ aNewStrPool.insert(*it);
+ }
+
+ maStrPool.swap(aNewStrPool);
+
+ aNewStrPool.clear(); // for re-use.
+
+ // Purge the upper string pool as well.
+ it = maStrPoolUpper.begin();
+ itEnd = maStrPoolUpper.end();
+ for (; it != itEnd; ++it)
+ {
+ const rtl_uString* p = it->pData;
+ if (getRefCount(p) > 1)
+ aNewStrPool.insert(*it);
+ }
+
+ maStrPoolUpper.swap(aNewStrPool);
+}
+
+size_t StringPool::getCount() const
+{
+ return maStrPool.size();
+}
+
+size_t StringPool::getCountIgnoreCase() const
+{
+ return maStrPoolUpper.size();
+}
+
StringPool::InsertResultType StringPool::findOrInsert( StrHashType& rPool, const OUString& rStr ) const
{
StrHashType::iterator it = rPool.find(rStr);