From 5d3ea0cde3f4c61832c48281e75dabd22621a893 Mon Sep 17 00:00:00 2001 From: Kohei Yoshida Date: Wed, 2 Oct 2013 10:47:28 -0400 Subject: Establish mapping between original strings and upper strings. This will be used to retrieve case insensitive string identifiers later. Change-Id: Ia34f57d0e8d0cb6bd4630f8d110853ed049770b5 --- svl/source/misc/stringpool.cxx | 51 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 46 insertions(+), 5 deletions(-) (limited to 'svl') diff --git a/svl/source/misc/stringpool.cxx b/svl/source/misc/stringpool.cxx index f8ddda9b0acd..46462d1e7a59 100644 --- a/svl/source/misc/stringpool.cxx +++ b/svl/source/misc/stringpool.cxx @@ -8,26 +8,67 @@ */ #include "svl/stringpool.hxx" +#include "unotools/charclass.hxx" namespace svl { -StringPool::StringPool() {} +StringPool::StringPool() : mpCharClass(NULL) {} +StringPool::StringPool( CharClass* pCharClass ) : mpCharClass(pCharClass) {} rtl_uString* StringPool::intern( const OUString& rStr ) +{ + InsertResultType aRes = findOrInsert(maStrPool, rStr); + if (aRes.first == maStrPool.end()) + // Insertion failed. + return NULL; + + rtl_uString* pOrig = aRes.first->pData; + + if (!aRes.second) + // No new string has been inserted. Return the existing string in the pool. + return pOrig; + + if (!mpCharClass) + return pOrig; + + // This is a new string insertion. Establish mapping to upper-case variant. + + OUString aUpper = mpCharClass->uppercase(rStr); + aRes = findOrInsert(maStrPoolUpper, aUpper); + if (aRes.first == maStrPoolUpper.end()) + // Failed to insert or fetch upper-case variant. Should never happen. + return pOrig; + + // Set mapping. + rtl_uString* pUpper = aRes.first->pData; + maToUpperMap.insert(StrIdMapType::value_type(pOrig, pUpper)); + + return pOrig; +} + +const rtl_uString* StringPool::getIdentifier( const OUString& rStr ) const { StrHashType::iterator it = maStrPool.find(rStr); - if (it == maStrPool.end()) + return (it == maStrPool.end()) ? NULL : it->pData; +} + +StringPool::InsertResultType StringPool::findOrInsert( StrHashType& rPool, const OUString& rStr ) const +{ + StrHashType::iterator it = rPool.find(rStr); + bool bInserted = false; + if (it == rPool.end()) { // Not yet in the pool. - std::pair r = maStrPool.insert(rStr.intern()); + std::pair r = rPool.insert(rStr.intern()); if (!r.second) // Insertion failed. - return NULL; + return InsertResultType(rPool.end(), false); it = r.first; + bInserted = true; } - return it->pData; + return InsertResultType(it, bInserted); } } -- cgit