summaryrefslogtreecommitdiff
path: root/svl/source
diff options
context:
space:
mode:
authorKohei Yoshida <kohei.yoshida@collabora.com>2013-10-07 12:15:28 -0400
committerKohei Yoshida <kohei.yoshida@collabora.com>2013-10-08 15:44:33 -0400
commitf4bda54cdaf13cf96ff7c9327036568825c8c323 (patch)
tree8fa25fe11fdc329e3a8a9b6a2750b75a7dd63577 /svl/source
parent6ddcbf4b2fddbb1bad2da05fc6ced1046493d058 (diff)
Re-implement interning in order to return both string arrays.
One is for the cased string and the other one for the non-cased one. Change-Id: I798687f2efecaaea73a09e0b3348f85a9d9e8c07
Diffstat (limited to 'svl/source')
-rw-r--r--svl/source/misc/sharedstring.cxx81
-rw-r--r--svl/source/misc/sharedstringpool.cxx31
2 files changed, 100 insertions, 12 deletions
diff --git a/svl/source/misc/sharedstring.cxx b/svl/source/misc/sharedstring.cxx
new file mode 100644
index 000000000000..d5b27bdf0d10
--- /dev/null
+++ b/svl/source/misc/sharedstring.cxx
@@ -0,0 +1,81 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include "svl/sharedstring.hxx"
+
+namespace svl {
+
+SharedString::SharedString() : mpData(NULL), mpDataIgnoreCase(NULL) {}
+
+SharedString::SharedString( rtl_uString* pData, rtl_uString* pDataIgnoreCase ) :
+ mpData(pData), mpDataIgnoreCase(pDataIgnoreCase)
+{
+ if (mpData)
+ rtl_uString_acquire(mpData);
+ if (mpDataIgnoreCase)
+ rtl_uString_acquire(mpDataIgnoreCase);
+}
+
+SharedString::SharedString( const SharedString& r ) : mpData(r.mpData), mpDataIgnoreCase(r.mpDataIgnoreCase)
+{
+ if (mpData)
+ rtl_uString_acquire(mpData);
+ if (mpDataIgnoreCase)
+ rtl_uString_acquire(mpDataIgnoreCase);
+}
+
+SharedString::~SharedString()
+{
+ if (mpData)
+ rtl_uString_release(mpData);
+ if (mpDataIgnoreCase)
+ rtl_uString_release(mpDataIgnoreCase);
+}
+
+SharedString& SharedString::operator= ( const SharedString& r )
+{
+ if (mpData)
+ rtl_uString_release(mpData);
+ if (mpDataIgnoreCase)
+ rtl_uString_release(mpDataIgnoreCase);
+
+ mpData = r.mpData;
+ mpDataIgnoreCase = r.mpDataIgnoreCase;
+
+ if (mpData)
+ rtl_uString_acquire(mpData);
+ if (mpDataIgnoreCase)
+ rtl_uString_acquire(mpDataIgnoreCase);
+
+ return *this;
+}
+
+rtl_uString* SharedString::getData()
+{
+ return mpData;
+}
+
+const rtl_uString* SharedString::getData() const
+{
+ return mpData;
+}
+
+rtl_uString* SharedString::getDataIgnoreCase()
+{
+ return mpDataIgnoreCase;
+}
+
+const rtl_uString* SharedString::getDataIgnoreCase() const
+{
+ return mpDataIgnoreCase;
+}
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/svl/source/misc/sharedstringpool.cxx b/svl/source/misc/sharedstringpool.cxx
index 805a6fc75576..6b8f15287aca 100644
--- a/svl/source/misc/sharedstringpool.cxx
+++ b/svl/source/misc/sharedstringpool.cxx
@@ -15,21 +15,29 @@ namespace svl {
SharedStringPool::SharedStringPool() : mpCharClass(NULL) {}
SharedStringPool::SharedStringPool( const CharClass* pCharClass ) : mpCharClass(pCharClass) {}
-rtl_uString* SharedStringPool::intern( const OUString& rStr )
+SharedString SharedStringPool::intern( const OUString& rStr )
{
InsertResultType aRes = findOrInsert(maStrPool, rStr);
if (aRes.first == maStrPool.end())
// Insertion failed.
- return NULL;
+ return SharedString();
rtl_uString* pOrig = aRes.first->pData;
+ if (!mpCharClass)
+ // We don't track case insensitive strings.
+ return SharedString(pOrig, NULL);
+
if (!aRes.second)
+ {
// No new string has been inserted. Return the existing string in the pool.
- return pOrig;
+ StrStoreType::iterator it = maStrStore.find(pOrig);
+ if (it == maStrStore.end())
+ return SharedString();
- if (!mpCharClass)
- return pOrig;
+ rtl_uString* pUpper = it->second.pData;
+ return SharedString(pOrig, pUpper);
+ }
// This is a new string insertion. Establish mapping to upper-case variant.
@@ -37,12 +45,11 @@ rtl_uString* SharedStringPool::intern( const OUString& rStr )
aRes = findOrInsert(maStrPoolUpper, aUpper);
if (aRes.first == maStrPoolUpper.end())
// Failed to insert or fetch upper-case variant. Should never happen.
- return pOrig;
+ return SharedString();
- // Set mapping.
- maToUpperMap.insert(StrIdMapType::value_type(pOrig, *aRes.first));
+ maStrStore.insert(StrStoreType::value_type(pOrig, *aRes.first));
- return pOrig;
+ return SharedString(pOrig, aRes.first->pData);
}
sal_uIntPtr SharedStringPool::getIdentifier( const OUString& rStr ) const
@@ -58,8 +65,8 @@ sal_uIntPtr SharedStringPool::getIdentifierIgnoreCase( const OUString& rStr ) co
// Not in the pool.
return 0;
- StrIdMapType::const_iterator itUpper = maToUpperMap.find(itOrig->pData);
- if (itUpper == maToUpperMap.end())
+ StrStoreType::const_iterator itUpper = maStrStore.find(itOrig->pData);
+ if (itUpper == maStrStore.end())
// Passed string is not in the pool.
return 0;
@@ -87,7 +94,7 @@ void SharedStringPool::purge()
{
// Remove it from the upper string map. This should unref the
// upper string linked to this original string.
- maToUpperMap.erase(p);
+ maStrStore.erase(p);
}
else
// Still referenced outside the pool. Keep it.