package/inc/ZipPackageFolder.hxx | 23 +++++++++++++- package/source/zippackage/ZipPackage.cxx | 40 +++++++++++++------------ package/source/zippackage/ZipPackageFolder.cxx | 17 +++++++++- 3 files changed, 57 insertions(+), 23 deletions(-)
New commits: commit 83579ee9f1312d71fb223fff2dee19c616fd87f2 Author: Arnaud VERSINI <arnaud.vers...@pm.me> AuthorDate: Sat Sep 28 18:26:45 2024 +0200 Commit: Mike Kaganski <mike.kagan...@collabora.com> CommitDate: Sun Mar 2 19:28:34 2025 +0100 package : reduce OUString allocation by using u16string_view Change-Id: I6c52fe7dbf3072132853ad820b5eba58beb6d76c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/174149 Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> Tested-by: Jenkins diff --git a/package/inc/ZipPackageFolder.hxx b/package/inc/ZipPackageFolder.hxx index 7598c25c304d..4b6cf71d81fc 100644 --- a/package/inc/ZipPackageFolder.hxx +++ b/package/inc/ZipPackageFolder.hxx @@ -55,8 +55,22 @@ struct ZipContentInfo ~ZipContentInfo(); }; +struct OUStringHashImpl { + using hash_type = std::hash<std::string_view>; + using is_transparent = void; + + size_t operator()(const OUString& rString) const + { return std::hash<std::u16string_view>{}(rString); } + + size_t operator()(const std::u16string_view aString) const + { return std::hash<std::u16string_view>{}(aString); } + +}; + typedef std::unordered_map < OUString, - ZipContentInfo > ContentHash; + ZipContentInfo, + OUStringHashImpl, + std::equal_to<>> ContentHash; class ZipPackageFolder final : public cppu::ImplInheritanceHelper < @@ -83,13 +97,18 @@ public: void setChildStreamsTypeByExtension( const css::beans::StringPair& aPair ); + void removeByName( std::u16string_view aName ); + css::uno::Any getByName( std::u16string_view aName ); + bool hasByName( std::u16string_view aName ); + + /// @throws css::lang::IllegalArgumentException /// @throws css::container::ElementExistException /// @throws css::lang::WrappedTargetException /// @throws css::uno::RuntimeException void doInsertByName ( ZipPackageEntry *pEntry, bool bSetParent ); - ZipContentInfo& doGetByName( const OUString& aName ); + ZipContentInfo& doGetByName( std::u16string_view aName ); void setPackageFormat_Impl( sal_Int32 nFormat ) { m_nFormat = nFormat; } void setRemoveOnInsertMode_Impl( bool bRemove ) { mbAllowRemoveOnInsert = bRemove; } diff --git a/package/source/zippackage/ZipPackage.cxx b/package/source/zippackage/ZipPackage.cxx index 9d6aa47e319b..36a48ac7c04e 100644 --- a/package/source/zippackage/ZipPackage.cxx +++ b/package/source/zippackage/ZipPackage.cxx @@ -80,6 +80,8 @@ #include <comphelper/servicehelper.hxx> #include <utility> +using namespace std::literals; + using namespace osl; using namespace cppu; using namespace ucbhelper; @@ -515,7 +517,7 @@ void ZipPackage::parseManifest() // if there is an encrypted inner package, there is no root // document, because instead there is a package, and it is not // an error - if (!m_xRootFolder->hasByName(u"encrypted-package"_ustr)) + if (!m_xRootFolder->hasByName(u"encrypted-package"sv)) { m_bMediaTypeFallbackUsed = true; } @@ -524,8 +526,8 @@ void ZipPackage::parseManifest() else if ( !m_bForceRecovery ) { // the mimetype stream should contain the same information as manifest.xml - OUString const mediaTypeXML(m_xRootFolder->hasByName(u"encrypted-package"_ustr) - ? m_xRootFolder->doGetByName(u"encrypted-package"_ustr).xPackageEntry->GetMediaType() + OUString const mediaTypeXML(m_xRootFolder->hasByName(u"encrypted-package"sv) + ? m_xRootFolder->doGetByName(u"encrypted-package").xPackageEntry->GetMediaType() : m_xRootFolder->GetMediaType()); if (mediaTypeXML != aPackageMediatype) { @@ -541,7 +543,7 @@ void ZipPackage::parseManifest() } m_bInconsistent = m_xRootFolder->LookForUnexpectedODF12Streams( - std::u16string_view(), m_xRootFolder->hasByName(u"encrypted-package"_ustr)); + std::u16string_view(), m_xRootFolder->hasByName(u"encrypted-package"sv)); bool bODF12AndNewer = ( m_xRootFolder->GetVersion().compareTo( ODFVER_012_TEXT ) >= 0 ); if ( !m_bForceRecovery && bODF12AndNewer ) @@ -571,7 +573,7 @@ void ZipPackage::parseContentType() return; try { - static constexpr OUString aContentTypes(u"[Content_Types].xml"_ustr); + static constexpr std::u16string_view aContentTypes(u"[Content_Types].xml"); // the content type must exist in OFOPXML format! if ( !m_xRootFolder->hasByName( aContentTypes ) ) throw io::IOException(THROW_WHERE "Wrong format!" ); @@ -661,14 +663,14 @@ void ZipPackage::getZipFileContents() sal_Int32 nOldIndex = 0; while ( ( nIndex = rName.indexOf( '/', nOldIndex ) ) != -1 ) { - OUString sTemp = rName.copy ( nOldIndex, nIndex - nOldIndex ); + std::u16string_view sTemp = rName.subView( nOldIndex, nIndex - nOldIndex ); if ( nIndex == nOldIndex ) break; if ( !pCurrent->hasByName( sTemp ) ) { rtl::Reference<ZipPackageFolder> pPkgFolder = new ZipPackageFolder(m_xContext, m_nFormat, m_bAllowRemoveOnInsert); try { - pPkgFolder->setName( sTemp ); + pPkgFolder->setName( OUString(sTemp) ); } catch (uno::RuntimeException const& e) { throw css::packages::zip::ZipIOException(e.Message); } @@ -690,14 +692,14 @@ void ZipPackage::getZipFileContents() if ( rName.getLength() -1 != nStreamIndex ) { nStreamIndex++; - OUString sTemp = rName.copy( nStreamIndex ); + std::u16string_view sTemp = rName.subView( nStreamIndex ); if (!pCurrent->hasByName(sTemp)) { rtl::Reference<ZipPackageStream> pPkgStream = new ZipPackageStream(*this, m_xContext, m_nFormat, m_bAllowRemoveOnInsert); pPkgStream->SetPackageMember(true); pPkgStream->setZipEntryOnLoading(rEntry); - pPkgStream->setName(sTemp); + pPkgStream->setName(OUString(sTemp)); pPkgStream->doSetParent(pCurrent); } } @@ -961,7 +963,7 @@ Any SAL_CALL ZipPackage::getByHierarchicalName( const OUString& aName ) else { // Determine the file name. - OUString sTemp = aName.copy ( nStreamIndex + 1 ); + std::u16string_view sTemp = aName.subView( nStreamIndex + 1 ); if (pFolder && pFolder->hasByName(sTemp)) return pFolder->getByName(sTemp); @@ -984,7 +986,7 @@ Any SAL_CALL ZipPackage::getByHierarchicalName( const OUString& aName ) while ( ( nIndex = aName.indexOf( '/', nOldIndex )) != -1 ) { - OUString sTemp = aName.copy ( nOldIndex, nIndex - nOldIndex ); + std::u16string_view sTemp = aName.subView ( nOldIndex, nIndex - nOldIndex ); if ( nIndex == nOldIndex ) break; if ( !pCurrent->hasByName( sTemp ) ) @@ -1005,7 +1007,7 @@ Any SAL_CALL ZipPackage::getByHierarchicalName( const OUString& aName ) return Any ( uno::Reference( cppu::getXWeak(pCurrent) ) ); } - OUString sTemp = aName.copy( nOldIndex ); + std::u16string_view sTemp = aName.subView( nOldIndex ); if ( pCurrent->hasByName ( sTemp ) ) { @@ -1046,7 +1048,7 @@ sal_Bool SAL_CALL ZipPackage::hasByHierarchicalName( const OUString& aName ) } else { - OUString sTemp = aName.copy ( nStreamIndex + 1 ); + std::u16string_view sTemp = aName.subView( nStreamIndex + 1 ); if ( ( *aIter ).second->hasByName( sTemp ) ) return true; else @@ -1068,7 +1070,7 @@ sal_Bool SAL_CALL ZipPackage::hasByHierarchicalName( const OUString& aName ) if ( nIndex == nOldIndex ) break; - OUString sTemp = aName.copy ( nOldIndex, nIndex - nOldIndex ); + std::u16string_view sTemp = aName.subView ( nOldIndex, nIndex - nOldIndex ); if ( pCurrent->hasByName( sTemp ) ) { @@ -1089,7 +1091,7 @@ sal_Bool SAL_CALL ZipPackage::hasByHierarchicalName( const OUString& aName ) } else { - OUString sTemp = aName.copy( nOldIndex ); + std::u16string_view sTemp = aName.subView( nOldIndex ); if ( pCurrent->hasByName( sTemp ) ) { @@ -1132,7 +1134,7 @@ uno::Reference< XInterface > SAL_CALL ZipPackage::createInstanceWithArguments( c void ZipPackage::WriteMimetypeMagicFile( ZipOutputStream& aZipOut ) { - static constexpr OUString sMime (u"mimetype"_ustr); + static constexpr std::u16string_view sMime (u"mimetype" ); if ( m_xRootFolder->hasByName( sMime ) ) m_xRootFolder->removeByName( sMime ); @@ -1328,7 +1330,7 @@ uno::Reference< io::XInputStream > ZipPackage::writeTempFile() // Remove the old manifest.xml file as the // manifest will be re-generated and the // META-INF directory implicitly created if does not exist - static constexpr OUString sMeta (u"META-INF"_ustr); + static constexpr std::u16string_view sMeta (u"META-INF"); if ( m_xRootFolder->hasByName( sMeta ) ) { @@ -1349,7 +1351,7 @@ uno::Reference< io::XInputStream > ZipPackage::writeTempFile() // Remove the old [Content_Types].xml file as the // file will be re-generated - static constexpr OUString aContentTypes(u"[Content_Types].xml"_ustr); + static constexpr std::u16string_view aContentTypes(u"[Content_Types].xml"); if ( m_xRootFolder->hasByName( aContentTypes ) ) m_xRootFolder->removeByName( aContentTypes ); @@ -1393,7 +1395,7 @@ uno::Reference< io::XInputStream > ZipPackage::writeTempFile() { if (m_nKeyDerivationFunctionID == xml::crypto::KDFID::PBKDF2) { // if there is only one KDF invocation, increase the safety margin - oPBKDF2IterationCount.emplace(m_xRootFolder->hasByName(u"encrypted-package"_ustr) ? 600000 : 100000); + oPBKDF2IterationCount.emplace(m_xRootFolder->hasByName(u"encrypted-package"sv) ? 600000 : 100000); } else { diff --git a/package/source/zippackage/ZipPackageFolder.cxx b/package/source/zippackage/ZipPackageFolder.cxx index c52836379692..8715d1ef2b90 100644 --- a/package/source/zippackage/ZipPackageFolder.cxx +++ b/package/source/zippackage/ZipPackageFolder.cxx @@ -175,7 +175,12 @@ void SAL_CALL ZipPackageFolder::insertByName( const OUString& aName, const uno:: void SAL_CALL ZipPackageFolder::removeByName( const OUString& Name ) { - ContentHash::iterator aIter = maContents.find ( Name ); + return removeByName(std::u16string_view(Name)); +} + +void ZipPackageFolder::removeByName( std::u16string_view aName ) +{ + ContentHash::iterator aIter = maContents.find ( aName ); if ( aIter == maContents.end() ) throw NoSuchElementException(THROW_WHERE ); maContents.erase( aIter ); @@ -195,7 +200,7 @@ sal_Bool SAL_CALL ZipPackageFolder::hasElements( ) return !maContents.empty(); } // XNameAccess -ZipContentInfo& ZipPackageFolder::doGetByName( const OUString& aName ) +ZipContentInfo& ZipPackageFolder::doGetByName( std::u16string_view aName ) { ContentHash::iterator aIter = maContents.find ( aName ); if ( aIter == maContents.end()) @@ -204,6 +209,10 @@ ZipContentInfo& ZipPackageFolder::doGetByName( const OUString& aName ) } uno::Any SAL_CALL ZipPackageFolder::getByName( const OUString& aName ) +{ + return getByName(std::u16string_view(aName)); +} +uno::Any ZipPackageFolder::getByName( std::u16string_view aName ) { return uno::Any ( uno::Reference(cppu::getXWeak(doGetByName ( aName ).xPackageEntry.get())) ); } @@ -212,6 +221,10 @@ uno::Sequence< OUString > SAL_CALL ZipPackageFolder::getElementNames( ) return comphelper::mapKeysToSequence(maContents); } sal_Bool SAL_CALL ZipPackageFolder::hasByName( const OUString& aName ) +{ + return hasByName( std::u16string_view( aName )); +} +bool ZipPackageFolder::hasByName( std::u16string_view aName ) { return maContents.find ( aName ) != maContents.end (); }