diff options
author | Kohei Yoshida <kohei.yoshida@collabora.com> | 2013-10-07 12:15:28 -0400 |
---|---|---|
committer | Kohei Yoshida <kohei.yoshida@collabora.com> | 2013-10-08 15:44:33 -0400 |
commit | f4bda54cdaf13cf96ff7c9327036568825c8c323 (patch) | |
tree | 8fa25fe11fdc329e3a8a9b6a2750b75a7dd63577 /svl/source | |
parent | 6ddcbf4b2fddbb1bad2da05fc6ced1046493d058 (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.cxx | 81 | ||||
-rw-r--r-- | svl/source/misc/sharedstringpool.cxx | 31 |
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. |