diff options
-rw-r--r-- | include/svx/EnhancedCustomShapeTypeNames.hxx | 2 | ||||
-rw-r--r-- | svx/source/customshapes/EnhancedCustomShapeTypeNames.cxx | 97 |
2 files changed, 41 insertions, 58 deletions
diff --git a/include/svx/EnhancedCustomShapeTypeNames.hxx b/include/svx/EnhancedCustomShapeTypeNames.hxx index fb6efdd731df..b369c8c42c9d 100644 --- a/include/svx/EnhancedCustomShapeTypeNames.hxx +++ b/include/svx/EnhancedCustomShapeTypeNames.hxx @@ -27,7 +27,7 @@ namespace EnhancedCustomShapeTypeNames { SVXCORE_DLLPUBLIC MSO_SPT Get(const OUString&); SVXCORE_DLLPUBLIC OUString Get(const MSO_SPT); -SVXCORE_DLLPUBLIC OUString GetAccName(const OUString&); +SVXCORE_DLLPUBLIC const OUString& GetAccName(const OUString&); } #endif diff --git a/svx/source/customshapes/EnhancedCustomShapeTypeNames.cxx b/svx/source/customshapes/EnhancedCustomShapeTypeNames.cxx index a7423c580f5b..0a1ae13c61e9 100644 --- a/svx/source/customshapes/EnhancedCustomShapeTypeNames.cxx +++ b/svx/source/customshapes/EnhancedCustomShapeTypeNames.cxx @@ -22,15 +22,6 @@ #include <unordered_map> #include <memory> -typedef std::unordered_map< const char*, MSO_SPT, rtl::CStringHash, rtl::CStringEqual> TypeNameHashMap; - -static TypeNameHashMap* pHashMap = nullptr; -static ::osl::Mutex& getHashMapMutex() -{ - static osl::Mutex s_aHashMapProtection; - return s_aHashMapProtection; -} - namespace { struct NameTypeTable @@ -277,29 +268,28 @@ const NameTypeTable pNameTypeTableArray[] = // gallery: fontwork-arch-left-pour // gallery: fontwork-arch-right-pour + +typedef std::unordered_map< OUString, MSO_SPT> TypeNameHashMap; + +static const TypeNameHashMap& GetTypeNameHashMap() +{ + static TypeNameHashMap aMap = []() + { + TypeNameHashMap map; + for (auto const & i : pNameTypeTableArray) + map[OUString::createFromAscii(i.pS)] = i.pE; + return map; + }(); + return aMap; +} + + MSO_SPT EnhancedCustomShapeTypeNames::Get( const OUString& rShapeType ) { - if ( !pHashMap ) - { // init hash map - ::osl::MutexGuard aGuard( getHashMapMutex() ); - if ( !pHashMap ) - { - TypeNameHashMap* pH = new TypeNameHashMap; - const NameTypeTable* pPtr = pNameTypeTableArray; - const NameTypeTable* pEnd = pPtr + SAL_N_ELEMENTS( pNameTypeTableArray ); - for ( ; pPtr < pEnd; pPtr++ ) - (*pH)[ pPtr->pS ] = pPtr->pE; - pHashMap = pH; - } - } + const TypeNameHashMap & rTypeMap = GetTypeNameHashMap(); MSO_SPT eRetValue = mso_sptNil; - int i, nLen = rShapeType.getLength(); - std::unique_ptr<char[]> pBuf(new char[ nLen + 1 ]); - for ( i = 0; i < nLen; i++ ) - pBuf[ i ] = static_cast<char>(rShapeType[ i ]); - pBuf[ i ] = 0; - TypeNameHashMap::const_iterator aHashIter( pHashMap->find( pBuf.get() ) ); - if ( aHashIter != pHashMap->end() ) + auto aHashIter = rTypeMap.find( rShapeType ); + if ( aHashIter != rTypeMap.end() ) eRetValue = (*aHashIter).second; return eRetValue; } @@ -311,10 +301,6 @@ OUString EnhancedCustomShapeTypeNames::Get( const MSO_SPT eShapeType ) : OUString(); } -typedef std::unordered_map< const char*, const char*, rtl::CStringHash, rtl::CStringEqual> TypeACCNameHashMap; - -static TypeACCNameHashMap* pACCHashMap = nullptr; - namespace { struct ACCNameTypeTable @@ -537,31 +523,28 @@ const ACCNameTypeTable pACCNameTypeTableArray[] = { "col-502ad400", "Diamond Bevel" } }; -OUString EnhancedCustomShapeTypeNames::GetAccName( const OUString& rShapeType ) +typedef std::unordered_map<OUString, OUString> TypeACCNameHashMap; + +static const TypeACCNameHashMap& GetACCHashMap() +{ + static TypeACCNameHashMap aMap = []() + { + TypeACCNameHashMap map; + for (auto const & i : pACCNameTypeTableArray) + map[OUString::createFromAscii(i.pS)] = OUString::createFromAscii(i.pE); + return map; + }(); + return aMap; +} + +const OUString & EnhancedCustomShapeTypeNames::GetAccName( const OUString& rShapeType ) { - if ( !pACCHashMap ) - { // init hash map - ::osl::MutexGuard aGuard( getHashMapMutex() ); - if ( !pACCHashMap ) - { - TypeACCNameHashMap* pH = new TypeACCNameHashMap; - const ACCNameTypeTable* pPtr = pACCNameTypeTableArray; - const ACCNameTypeTable* pEnd = pPtr + SAL_N_ELEMENTS( pACCNameTypeTableArray ); - for ( ; pPtr < pEnd; pPtr++ ) - (*pH)[ pPtr->pS ] = pPtr->pE; - pACCHashMap = pH; - } - } - OUString sRetValue; - int i, nLen = rShapeType.getLength(); - std::unique_ptr<char[]> pBuf(new char[ nLen + 1 ]); - for ( i = 0; i < nLen; i++ ) - pBuf[ i ] = static_cast<char>(rShapeType[ i ]); - pBuf[ i ] = 0; - TypeACCNameHashMap::const_iterator aHashIter( pACCHashMap->find( pBuf.get() ) ); - if ( aHashIter != pACCHashMap->end() ) - sRetValue = OUString::createFromAscii( (*aHashIter).second ); - return sRetValue; + static const OUString EMPTY; + const TypeACCNameHashMap& rACCMap = GetACCHashMap(); + auto aHashIter = rACCMap.find( rShapeType ); + if ( aHashIter != rACCMap.end() ) + return aHashIter->second; + return EMPTY; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |