editeng/source/misc/forbiddencharacterstable.cxx | 4 ++-- include/svl/ondemand.hxx | 18 +++++++++--------- include/unotools/intlwrapper.hxx | 4 ++-- include/unotools/localedatawrapper.hxx | 9 ++++++++- include/vcl/i18nhelp.hxx | 4 ++-- include/xmloff/xmlnumfe.hxx | 2 +- sc/source/core/tool/numformat.cxx | 5 ++--- sc/source/filter/xml/xmlimprt.cxx | 6 +++--- svl/qa/unit/svl.cxx | 4 ++-- svl/source/numbers/zforlist.cxx | 8 ++------ sw/source/core/bastyp/breakit.cxx | 4 ++-- sw/source/filter/ww8/ww8atr.cxx | 5 ++--- toolkit/source/controls/unocontrolmodel.cxx | 8 ++++---- unotools/source/i18n/intlwrapper.cxx | 2 +- unotools/source/i18n/localedatawrapper.cxx | 22 ++++++++++++++++++++++ vcl/source/app/i18nhelp.cxx | 6 +++--- vcl/source/app/settings.cxx | 20 +++++++------------- xmloff/source/style/xmlnumfe.cxx | 13 +++++-------- xmloff/source/style/xmlnumfi.cxx | 6 ++---- 19 files changed, 81 insertions(+), 69 deletions(-)
New commits: commit f5c81f928b3c30d0955e563d591b76276d27c038 Author: Noel Grandin <noelgran...@gmail.com> AuthorDate: Sat Mar 22 13:43:12 2025 +0200 Commit: Caolán McNamara <caolan.mcnam...@collabora.com> CommitDate: Sun Mar 23 10:31:35 2025 +0100 tdf#141415 reduce time spent loading language data cache LocaleDataWrapper because otherwise we spend quite a bit of time doing function-pointer-symbol lookups. Change-Id: Ic1bd07dabac95a2e1bdad70cffbc2b4cabdc62ed Reviewed-on: https://gerrit.libreoffice.org/c/core/+/183221 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> (cherry picked from commit 8c0d8f50717503d8fe45aed95055b2c9e2227c0d) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/183225 Reviewed-by: Caolán McNamara <caolan.mcnam...@collabora.com> Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> diff --git a/editeng/source/misc/forbiddencharacterstable.cxx b/editeng/source/misc/forbiddencharacterstable.cxx index 7276da584bd9..e1cbc87eb66b 100644 --- a/editeng/source/misc/forbiddencharacterstable.cxx +++ b/editeng/source/misc/forbiddencharacterstable.cxx @@ -44,8 +44,8 @@ SvxForbiddenCharactersTable::GetForbiddenCharacters(LanguageType nLanguage, bool pForbiddenCharacters = &(it->second); else if (bGetDefault && m_xContext.is()) { - LocaleDataWrapper aWrapper(m_xContext, LanguageTag(nLanguage)); - maMap[nLanguage] = aWrapper.getForbiddenCharacters(); + const LocaleDataWrapper* pWrapper = LocaleDataWrapper::get(LanguageTag(nLanguage)); + maMap[nLanguage] = pWrapper->getForbiddenCharacters(); pForbiddenCharacters = &maMap[nLanguage]; } return pForbiddenCharacters; diff --git a/include/svl/ondemand.hxx b/include/svl/ondemand.hxx index 691fd6fc8099..200958b2d99c 100644 --- a/include/svl/ondemand.hxx +++ b/include/svl/ondemand.hxx @@ -55,8 +55,8 @@ class OnDemandLocaleDataWrapper SvtSysLocale aSysLocale; LanguageType eCurrentLanguage; LanguageType eLastAnyLanguage; - std::optional<LocaleDataWrapper> moEnglish; - std::optional<LocaleDataWrapper> moAny; + const LocaleDataWrapper* mpEnglish{ nullptr }; + const LocaleDataWrapper* mpAny{ nullptr }; int nCurrent; // 0 == system, 1 == english, 2 == any bool bInitialized; @@ -86,20 +86,20 @@ public: nCurrent = 0; else if (eLang == LANGUAGE_ENGLISH_US) { - if (!moEnglish) - moEnglish.emplace(m_xContext, rLanguageTag); + if (!mpEnglish) + mpEnglish = LocaleDataWrapper::get(rLanguageTag); nCurrent = 1; } else { - if (!moAny) + if (!mpAny) { - moAny.emplace(m_xContext, rLanguageTag); + mpAny = LocaleDataWrapper::get(rLanguageTag); eLastAnyLanguage = eLang; } else if (eLastAnyLanguage != eLang) { - moAny.emplace(m_xContext, rLanguageTag); + mpAny = LocaleDataWrapper::get(rLanguageTag); eLastAnyLanguage = eLang; } nCurrent = 2; @@ -116,9 +116,9 @@ public: case 0: return &aSysLocale.GetLocaleData(); case 1: - return &*moEnglish; + return mpEnglish; case 2: - return &*moAny; + return mpAny; default: assert(false); return nullptr; diff --git a/include/unotools/intlwrapper.hxx b/include/unotools/intlwrapper.hxx index 0c473cc4293f..6df48a9e8f12 100644 --- a/include/unotools/intlwrapper.hxx +++ b/include/unotools/intlwrapper.hxx @@ -54,7 +54,7 @@ private: LanguageTag maLanguageTag; css::uno::Reference< css::uno::XComponentContext > m_xContext; - std::unique_ptr<LocaleDataWrapper> pLocaleData; + const LocaleDataWrapper* pLocaleData { nullptr }; std::optional<CollatorWrapper> moCollator; std::optional<CollatorWrapper> moCaseCollator; @@ -69,7 +69,7 @@ public: { if ( !pLocaleData ) ImplNewLocaleData(); - return pLocaleData.get(); + return pLocaleData; } /// case insensitive collator, simple IGNORE_CASE const CollatorWrapper* getCollator() const diff --git a/include/unotools/localedatawrapper.hxx b/include/unotools/localedatawrapper.hxx index d22e5fc7a482..5ce9cce232c2 100644 --- a/include/unotools/localedatawrapper.hxx +++ b/include/unotools/localedatawrapper.hxx @@ -119,11 +119,18 @@ class UNOTOOLS_DLLPUBLIC LocaleDataWrapper SAL_DLLPRIVATE void loadDigitGrouping(); -public: LocaleDataWrapper( const css::uno::Reference< css::uno::XComponentContext > & rxContext, LanguageTag aLanguageTag ); + +public: + + /** + * retrieve a cached LocaleDataWrapper + */ + static const LocaleDataWrapper* get(const LanguageTag& aLanguageTag); + /** @param rOverrideDateAcceptancePatterns Override locale's date acceptance patterns. An empty sequence resets the patterns to the locale's pattern sequence. diff --git a/include/vcl/i18nhelp.hxx b/include/vcl/i18nhelp.hxx index 9f6e43bb6a54..8179f7c3bc00 100644 --- a/include/vcl/i18nhelp.hxx +++ b/include/vcl/i18nhelp.hxx @@ -45,7 +45,7 @@ class VCL_DLLPUBLIC I18nHelper LanguageTag maLanguageTag; css::uno::Reference< css::uno::XComponentContext > m_xContext; - std::unique_ptr<LocaleDataWrapper> mpLocaleDataWrapper; + const LocaleDataWrapper* mpLocaleDataWrapper { nullptr }; std::unique_ptr<utl::TransliterationWrapper> mpTransliterationWrapper; bool mbTransliterateIgnoreCase; @@ -53,7 +53,7 @@ class VCL_DLLPUBLIC I18nHelper SAL_DLLPRIVATE void ImplDestroyWrappers(); SAL_DLLPRIVATE utl::TransliterationWrapper& ImplGetTransliterationWrapper() const; - SAL_DLLPRIVATE LocaleDataWrapper& ImplGetLocaleDataWrapper() const; + SAL_DLLPRIVATE const LocaleDataWrapper& ImplGetLocaleDataWrapper() const; public: diff --git a/include/xmloff/xmlnumfe.hxx b/include/xmloff/xmlnumfe.hxx index e367fef2b89e..c719aaca6839 100644 --- a/include/xmloff/xmlnumfe.hxx +++ b/include/xmloff/xmlnumfe.hxx @@ -55,7 +55,7 @@ private: OUStringBuffer m_sBlankWidthString; bool m_bHasText; std::unique_ptr<SvXMLNumUsedList_Impl> m_pUsedList; - std::unique_ptr<LocaleDataWrapper> m_pLocaleData; + const LocaleDataWrapper* m_pLocaleData { nullptr }; SAL_DLLPRIVATE void AddCalendarAttr_Impl( const OUString& rCalendar ); SAL_DLLPRIVATE void AddStyleAttr_Impl( bool bLong ); diff --git a/sc/source/core/tool/numformat.cxx b/sc/source/core/tool/numformat.cxx index c69da6de4e3b..45f473c7e945 100644 --- a/sc/source/core/tool/numformat.cxx +++ b/sc/source/core/tool/numformat.cxx @@ -36,10 +36,9 @@ namespace return ScGlobal::getLocaleData().getNumDecimalSep(); // LocaleDataWrapper can be expensive to construct, so cache the result for // repeated calls - static std::optional<LocaleDataWrapper> localeCache; + static const LocaleDataWrapper* localeCache { nullptr }; if (!localeCache || localeCache->getLanguageTag().getLanguageType() != nFormatLang) - localeCache.emplace( - comphelper::getProcessComponentContext(), LanguageTag(nFormatLang)); + localeCache = LocaleDataWrapper::get(LanguageTag(nFormatLang)); return localeCache->getNumDecimalSep(); } } diff --git a/sc/source/filter/xml/xmlimprt.cxx b/sc/source/filter/xml/xmlimprt.cxx index d992fd2c5f84..8ab3f241d630 100644 --- a/sc/source/filter/xml/xmlimprt.cxx +++ b/sc/source/filter/xml/xmlimprt.cxx @@ -809,11 +809,11 @@ sal_Int32 ScXMLImport::SetCurrencySymbol(const sal_Int32 nKey, std::u16string_vi { { ScXMLImport::MutexGuard aGuard(*this); - LocaleDataWrapper aLocaleData( comphelper::getProcessComponentContext(), LanguageTag( aLocale) ); + const LocaleDataWrapper* pLocaleData = LocaleDataWrapper::get( LanguageTag( aLocale) ); sFormatString = "#" + - aLocaleData.getNumThousandSep() + + pLocaleData->getNumThousandSep() + "##0" + - aLocaleData.getNumDecimalSep() + + pLocaleData->getNumDecimalSep() + "00 [$" + rCurrency + "]"; diff --git a/svl/qa/unit/svl.cxx b/svl/qa/unit/svl.cxx index 80ec80e0d87e..e2969c996d75 100644 --- a/svl/qa/unit/svl.cxx +++ b/svl/qa/unit/svl.cxx @@ -2009,8 +2009,8 @@ CPPUNIT_TEST_FIXTURE(Test, testLanguageNone) sal_uInt32 nKey = aFormatter.GetEntryKey(code, LANGUAGE_GERMAN); CPPUNIT_ASSERT(nKey != NUMBERFORMAT_ENTRY_NOT_FOUND); SvNumberformat const*const pFormat = aFormatter.GetEntry(nKey); - LocaleDataWrapper ldw(m_xContext, LanguageTag(pFormat->GetLanguage())); - CPPUNIT_ASSERT_EQUAL(u"dd.mm.yyyy"_ustr, pFormat->GetMappedFormatstring(keywords, ldw)); + const LocaleDataWrapper* ldw = LocaleDataWrapper::get(LanguageTag(pFormat->GetLanguage())); + CPPUNIT_ASSERT_EQUAL(u"dd.mm.yyyy"_ustr, pFormat->GetMappedFormatstring(keywords, *ldw)); } CPPUNIT_TEST_FIXTURE(Test, testTdf160306) diff --git a/svl/source/numbers/zforlist.cxx b/svl/source/numbers/zforlist.cxx index 5907193a63b3..36e5ef9a6903 100644 --- a/svl/source/numbers/zforlist.cxx +++ b/svl/source/numbers/zforlist.cxx @@ -4649,8 +4649,7 @@ void SvNumberFormatter::ImpInitCurrencyTable() bInitializing = true; LanguageType eSysLang = SvtSysLocale().GetLanguageTag().getLanguageType(); - std::optional<LocaleDataWrapper> pLocaleData(std::in_place, - ::comphelper::getProcessComponentContext(), + const LocaleDataWrapper* pLocaleData = LocaleDataWrapper::get( SvtSysLocale().GetLanguageTag() ); // get user configured currency OUString aConfiguredCurrencyAbbrev; @@ -4676,9 +4675,7 @@ void SvNumberFormatter::ImpInitCurrencyTable() { LanguageType eLang = LanguageTag::convertToLanguageType( rLocale, false); theInstalledLocales.insert( eLang); - pLocaleData.emplace( - ::comphelper::getProcessComponentContext(), - LanguageTag(rLocale) ); + pLocaleData = LocaleDataWrapper::get( LanguageTag(rLocale) ); Sequence< Currency2 > aCurrSeq = pLocaleData->getAllCurrencies(); sal_Int32 nCurrencyCount = aCurrSeq.getLength(); Currency2 const * const pCurrencies = aCurrSeq.getConstArray(); @@ -4790,7 +4787,6 @@ void SvNumberFormatter::ImpInitCurrencyTable() LocaleDataWrapper::outputCheckMessage( "SvNumberFormatter::ImpInitCurrencyTable: system currency not in I18N locale data."); } - pLocaleData.reset(); SvtSysLocaleOptions::SetCurrencyChangeLink( LINK( nullptr, SvNumberFormatter, CurrencyChangeLink ) ); bInitializing = false; g_CurrencyTableInitialized = true; diff --git a/sw/source/core/bastyp/breakit.cxx b/sw/source/core/bastyp/breakit.cxx index 33f55a1d548d..e911e5d7cdf9 100644 --- a/sw/source/core/bastyp/breakit.cxx +++ b/sw/source/core/bastyp/breakit.cxx @@ -75,10 +75,10 @@ void SwBreakIt::GetLocale_( const LanguageTag& rLanguageTag ) void SwBreakIt::GetForbidden_( const LanguageType aLang ) { - LocaleDataWrapper aWrap(m_xContext, GetLanguageTag(aLang)); + const LocaleDataWrapper* pWrap = LocaleDataWrapper::get(GetLanguageTag(aLang)); m_aForbiddenLang = aLang; - m_oForbidden.emplace(aWrap.getForbiddenCharacters()); + m_oForbidden.emplace(pWrap->getForbiddenCharacters()); } sal_uInt16 SwBreakIt::GetRealScriptOfText( const OUString& rText, sal_Int32 nPos ) const diff --git a/sw/source/filter/ww8/ww8atr.cxx b/sw/source/filter/ww8/ww8atr.cxx index 895c4636ffe7..9e883b0461ac 100644 --- a/sw/source/filter/ww8/ww8atr.cxx +++ b/sw/source/filter/ww8/ww8atr.cxx @@ -2744,11 +2744,10 @@ bool MSWordExportBase::GetNumberFormat(const SwField& rField, OUString& rStr) { nLng = pNumFormat->GetLanguage(); } - LocaleDataWrapper aLocDat(pNFormatr->GetComponentContext(), - LanguageTag(nLng)); + const LocaleDataWrapper* pLocDat = LocaleDataWrapper::get(LanguageTag(nLng)); OUString sFormat(pNumFormat->GetMappedFormatstring(GetNfKeywordTable(), - aLocDat)); + *pLocDat)); if (!sFormat.isEmpty()) { diff --git a/toolkit/source/controls/unocontrolmodel.cxx b/toolkit/source/controls/unocontrolmodel.cxx index 49f7a0a363df..b1ab348e7b33 100644 --- a/toolkit/source/controls/unocontrolmodel.cxx +++ b/toolkit/source/controls/unocontrolmodel.cxx @@ -330,14 +330,14 @@ css::uno::Any UnoControlModel::ImplGetDefaultValue( sal_uInt16 nPropId ) const } // the remaining is the locale - LocaleDataWrapper aLocaleInfo( m_xContext, LanguageTag(sDefaultCurrency) ); + const LocaleDataWrapper* pLocaleInfo = LocaleDataWrapper::get( LanguageTag(sDefaultCurrency) ); if ( sBankSymbol.isEmpty() ) - sBankSymbol = aLocaleInfo.getCurrBankSymbol(); + sBankSymbol = pLocaleInfo->getCurrBankSymbol(); // look for the currency entry (for this language) which has the given bank symbol - const Sequence< Currency2 > aAllCurrencies = aLocaleInfo.getAllCurrencies(); + const Sequence< Currency2 > aAllCurrencies = pLocaleInfo->getAllCurrencies(); - OUString sCurrencySymbol = aLocaleInfo.getCurrSymbol(); + OUString sCurrencySymbol = pLocaleInfo->getCurrSymbol(); if ( sBankSymbol.isEmpty() ) { DBG_ASSERT( aAllCurrencies.hasElements(), "UnoControlModel::ImplGetDefaultValue: no currencies at all!" ); diff --git a/unotools/source/i18n/intlwrapper.cxx b/unotools/source/i18n/intlwrapper.cxx index 19157dab4a67..cbe72e8bc430 100644 --- a/unotools/source/i18n/intlwrapper.cxx +++ b/unotools/source/i18n/intlwrapper.cxx @@ -37,7 +37,7 @@ IntlWrapper::~IntlWrapper() void IntlWrapper::ImplNewLocaleData() const { - const_cast<IntlWrapper*>(this)->pLocaleData.reset( new LocaleDataWrapper( m_xContext, maLanguageTag ) ); + const_cast<IntlWrapper*>(this)->pLocaleData = LocaleDataWrapper::get( maLanguageTag ); } void IntlWrapper::ImplNewCollator( bool bCaseSensitive ) const diff --git a/unotools/source/i18n/localedatawrapper.cxx b/unotools/source/i18n/localedatawrapper.cxx index a49f11f15ed1..51714d9d6062 100644 --- a/unotools/source/i18n/localedatawrapper.cxx +++ b/unotools/source/i18n/localedatawrapper.cxx @@ -43,6 +43,8 @@ #include <tools/time.hxx> #include <tools/duration.hxx> #include <o3tl/string_view.hxx> +#include <map> +#include <mutex> #include <utility> const sal_uInt16 nCurrFormatDefault = 0; @@ -59,6 +61,26 @@ namespace sal_uInt8 LocaleDataWrapper::nLocaleDataChecking = 0; +/** + * Loading LocaleDataWrapper can become expensive because of all the function-symbol lookups required, so + * we cache these. + */ +// static +const LocaleDataWrapper* LocaleDataWrapper::get(const LanguageTag& aLanguageTag) +{ + static std::map<LanguageTag, std::unique_ptr<LocaleDataWrapper>> gCache; + static std::mutex gMutex; + + std::unique_lock l(gMutex); + auto it = gCache.find(aLanguageTag); + if (it != gCache.end()) + return it->second.get(); + auto pNew = new LocaleDataWrapper(comphelper::getProcessComponentContext(), aLanguageTag); + gCache.insert({aLanguageTag, std::unique_ptr<LocaleDataWrapper>(pNew)}); + return pNew; +}; + + LocaleDataWrapper::LocaleDataWrapper( const Reference< uno::XComponentContext > & rxContext, LanguageTag aLanguageTag diff --git a/vcl/source/app/i18nhelp.cxx b/vcl/source/app/i18nhelp.cxx index d497cdba4fba..0f1ab0bff29b 100644 --- a/vcl/source/app/i18nhelp.cxx +++ b/vcl/source/app/i18nhelp.cxx @@ -47,7 +47,7 @@ vcl::I18nHelper::~I18nHelper() void vcl::I18nHelper::ImplDestroyWrappers() { - mpLocaleDataWrapper.reset(); + mpLocaleDataWrapper = nullptr; mpTransliterationWrapper.reset(); } @@ -65,11 +65,11 @@ utl::TransliterationWrapper& vcl::I18nHelper::ImplGetTransliterationWrapper() co return *mpTransliterationWrapper; } -LocaleDataWrapper& vcl::I18nHelper::ImplGetLocaleDataWrapper() const +const LocaleDataWrapper& vcl::I18nHelper::ImplGetLocaleDataWrapper() const { if ( !mpLocaleDataWrapper ) { - const_cast<vcl::I18nHelper*>(this)->mpLocaleDataWrapper.reset(new LocaleDataWrapper( m_xContext, maLanguageTag )); + const_cast<vcl::I18nHelper*>(this)->mpLocaleDataWrapper = LocaleDataWrapper::get( maLanguageTag ); } return *mpLocaleDataWrapper; } diff --git a/vcl/source/app/settings.cxx b/vcl/source/app/settings.cxx index d1d48c0f3efc..aaa577b2de89 100644 --- a/vcl/source/app/settings.cxx +++ b/vcl/source/app/settings.cxx @@ -282,9 +282,9 @@ struct ImplAllSettingsData SvtSysLocale maSysLocale; LanguageTag maLocale; LanguageTag maUILocale; - mutable std::unique_ptr<LocaleDataWrapper> mpLocaleDataWrapper; - mutable std::unique_ptr<LocaleDataWrapper> mpUILocaleDataWrapper; - mutable std::unique_ptr<LocaleDataWrapper> mpNeutralLocaleDataWrapper; + mutable const LocaleDataWrapper* mpLocaleDataWrapper { nullptr }; + mutable const LocaleDataWrapper* mpUILocaleDataWrapper { nullptr }; + mutable const LocaleDataWrapper* mpNeutralLocaleDataWrapper { nullptr }; mutable std::unique_ptr<vcl::I18nHelper> mpI18nHelper; mutable std::unique_ptr<vcl::I18nHelper> mpUII18nHelper; @@ -2549,9 +2549,6 @@ ImplAllSettingsData::ImplAllSettingsData( const ImplAllSettingsData& rData ) : ImplAllSettingsData::~ImplAllSettingsData() { - mpLocaleDataWrapper.reset(); - mpUILocaleDataWrapper.reset(); - mpNeutralLocaleDataWrapper.reset(); mpI18nHelper.reset(); mpUII18nHelper.reset(); } @@ -2654,7 +2651,7 @@ void AllSettings::SetLanguageTag( const LanguageTag& rLanguageTag ) if ( myData->mpLocaleDataWrapper ) { - myData->mpLocaleDataWrapper.reset(); + myData->mpLocaleDataWrapper = nullptr; } if ( myData->mpI18nHelper ) { @@ -2757,24 +2754,21 @@ const LanguageTag& AllSettings::GetUILanguageTag() const const LocaleDataWrapper& AllSettings::GetLocaleDataWrapper() const { if ( !mxData->mpLocaleDataWrapper ) - mxData->mpLocaleDataWrapper.reset( new LocaleDataWrapper( - comphelper::getProcessComponentContext(), GetLanguageTag() ) ); + mxData->mpLocaleDataWrapper = LocaleDataWrapper::get( GetLanguageTag() ); return *mxData->mpLocaleDataWrapper; } const LocaleDataWrapper& AllSettings::GetUILocaleDataWrapper() const { if ( !mxData->mpUILocaleDataWrapper ) - mxData->mpUILocaleDataWrapper.reset( new LocaleDataWrapper( - comphelper::getProcessComponentContext(), GetUILanguageTag() ) ); + mxData->mpUILocaleDataWrapper = LocaleDataWrapper::get( GetUILanguageTag() ); return *mxData->mpUILocaleDataWrapper; } const LocaleDataWrapper& AllSettings::GetNeutralLocaleDataWrapper() const { if ( !mxData->mpNeutralLocaleDataWrapper ) - mxData->mpNeutralLocaleDataWrapper.reset( new LocaleDataWrapper( - comphelper::getProcessComponentContext(), LanguageTag(u"en-US"_ustr) ) ); + mxData->mpNeutralLocaleDataWrapper = LocaleDataWrapper::get( LanguageTag(u"en-US"_ustr) ); return *mxData->mpNeutralLocaleDataWrapper; } diff --git a/xmloff/source/style/xmlnumfe.cxx b/xmloff/source/style/xmlnumfe.cxx index f09d1e94942b..ade9e56238a7 100644 --- a/xmloff/source/style/xmlnumfe.cxx +++ b/xmloff/source/style/xmlnumfe.cxx @@ -224,14 +224,13 @@ SvXMLNumFmtExport::SvXMLNumFmtExport( if ( m_pFormatter ) { - m_pLocaleData.reset( new LocaleDataWrapper( m_pFormatter->GetComponentContext(), - m_pFormatter->GetLanguageTag() ) ); + m_pLocaleData = LocaleDataWrapper::get( m_pFormatter->GetLanguageTag() ); } else { LanguageTag aLanguageTag( MsLangId::getConfiguredSystemLanguage() ); - m_pLocaleData.reset( new LocaleDataWrapper( m_rExport.getComponentContext(), std::move(aLanguageTag) ) ); + m_pLocaleData = LocaleDataWrapper::get( std::move(aLanguageTag) ); } m_pUsedList.reset(new SvXMLNumUsedList_Impl); @@ -254,14 +253,13 @@ SvXMLNumFmtExport::SvXMLNumFmtExport( if ( m_pFormatter ) { - m_pLocaleData.reset( new LocaleDataWrapper( m_pFormatter->GetComponentContext(), - m_pFormatter->GetLanguageTag() ) ); + m_pLocaleData = LocaleDataWrapper::get( m_pFormatter->GetLanguageTag() ); } else { LanguageTag aLanguageTag( MsLangId::getConfiguredSystemLanguage() ); - m_pLocaleData.reset( new LocaleDataWrapper( m_rExport.getComponentContext(), std::move(aLanguageTag) ) ); + m_pLocaleData = LocaleDataWrapper::get( std::move(aLanguageTag) ); } m_pUsedList.reset(new SvXMLNumUsedList_Impl); @@ -1780,8 +1778,7 @@ void SvXMLNumFmtExport::ExportPart_Impl( const SvNumberformat& rFormat, sal_uInt if ( nElemType == NF_KEY_NNNN ) { // write additional text element for separator - m_pLocaleData.reset( new LocaleDataWrapper( m_pFormatter->GetComponentContext(), - LanguageTag( nLang ) ) ); + m_pLocaleData = LocaleDataWrapper::get( LanguageTag( nLang ) ); AddToTextElement_Impl( m_pLocaleData->getLongDateDayOfWeekSep() ); } } diff --git a/xmloff/source/style/xmlnumfi.cxx b/xmloff/source/style/xmlnumfi.cxx index 110300ac1828..386e48381017 100644 --- a/xmloff/source/style/xmlnumfi.cxx +++ b/xmloff/source/style/xmlnumfi.cxx @@ -65,7 +65,7 @@ struct SvXMLNumFmtEntry class SvXMLNumImpData { SvNumberFormatter* pFormatter; - std::unique_ptr<LocaleDataWrapper> pLocaleData; + const LocaleDataWrapper* pLocaleData { nullptr }; std::vector<SvXMLNumFmtEntry> m_NameEntries; uno::Reference< uno::XComponentContext > m_xContext; @@ -370,9 +370,7 @@ void SvXMLNumImpData::RemoveVolatileFormats() const LocaleDataWrapper& SvXMLNumImpData::GetLocaleData( LanguageType nLang ) { if ( !pLocaleData || pLocaleData->getLanguageTag() != LanguageTag(nLang) ) - pLocaleData = std::make_unique<LocaleDataWrapper>( - pFormatter ? pFormatter->GetComponentContext() : m_xContext, - LanguageTag( nLang ) ); + pLocaleData = LocaleDataWrapper::get( LanguageTag( nLang ) ); return *pLocaleData; }