[Libreoffice-commits] core.git: compilerplugins/clang i18npool/inc i18npool/source

Noel Grandin noel.grandin at collabora.co.uk
Fri Feb 2 10:12:43 UTC 2018


 compilerplugins/clang/useuniqueptr.cxx                                  |    3 
 i18npool/inc/breakiteratorImpl.hxx                                      |    2 
 i18npool/inc/calendarImpl.hxx                                           |    2 
 i18npool/inc/cclass_unicode.hxx                                         |    3 
 i18npool/inc/characterclassificationImpl.hxx                            |    3 
 i18npool/inc/collatorImpl.hxx                                           |    3 
 i18npool/inc/collator_unicode.hxx                                       |    2 
 i18npool/inc/inputsequencechecker.hxx                                   |    3 
 i18npool/source/breakiterator/breakiteratorImpl.cxx                     |   20 +-
 i18npool/source/calendar/calendarImpl.cxx                               |   12 -
 i18npool/source/characterclassification/cclass_unicode.cxx              |    6 
 i18npool/source/characterclassification/characterclassificationImpl.cxx |   19 +-
 i18npool/source/collator/collatorImpl.cxx                               |   16 +-
 i18npool/source/collator/collator_unicode.cxx                           |   16 +-
 i18npool/source/inputchecker/inputsequencechecker.cxx                   |   12 -
 i18npool/source/search/textsearch.cxx                                   |   68 ++++------
 i18npool/source/search/textsearch.hxx                                   |    9 -
 17 files changed, 90 insertions(+), 109 deletions(-)

New commits:
commit 23e9b1294471459d386152b1197cfe58514af5da
Author: Noel Grandin <noel.grandin at collabora.co.uk>
Date:   Mon Jan 22 14:04:06 2018 +0200

    loplugin:useuniqueptr in i18npool
    
    Change-Id: Iff39b9298bfad474c5c011b6355b8ebf5be06318
    Reviewed-on: https://gerrit.libreoffice.org/49091
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>

diff --git a/compilerplugins/clang/useuniqueptr.cxx b/compilerplugins/clang/useuniqueptr.cxx
index d2e28860592a..655a25fe4325 100644
--- a/compilerplugins/clang/useuniqueptr.cxx
+++ b/compilerplugins/clang/useuniqueptr.cxx
@@ -210,6 +210,9 @@ void UseUniquePtr::CheckDeleteExpr(const CXXDestructorDecl* destructorDecl, cons
     // painful linked list
     if (loplugin::hasPathnamePrefix(aFileName, SRCDIR "/basic/source/inc/runtime.hxx"))
         return;
+    // not sure how the node management is working here
+    if (loplugin::hasPathnamePrefix(aFileName, SRCDIR "/i18npool/source/localedata/saxparser.cxx"))
+        return;
 
     report(
         DiagnosticsEngine::Warning,
diff --git a/i18npool/inc/breakiteratorImpl.hxx b/i18npool/inc/breakiteratorImpl.hxx
index 6ecaef630d3e..6d12a9cf24bd 100644
--- a/i18npool/inc/breakiteratorImpl.hxx
+++ b/i18npool/inc/breakiteratorImpl.hxx
@@ -116,7 +116,7 @@ private:
         css::lang::Locale aLocale;
         css::uno::Reference < XBreakIterator > xBI;
     };
-    std::vector<lookupTableItem*>                       lookupTable;
+    std::vector<lookupTableItem>                        lookupTable;
     css::lang::Locale                                   aLocale;
     css::uno::Reference < XBreakIterator >              xBI;
     css::uno::Reference < css::uno::XComponentContext > m_xContext;
diff --git a/i18npool/inc/calendarImpl.hxx b/i18npool/inc/calendarImpl.hxx
index aec643dcd59e..8d8f0d3afd23 100644
--- a/i18npool/inc/calendarImpl.hxx
+++ b/i18npool/inc/calendarImpl.hxx
@@ -100,7 +100,7 @@ private:
         OUString                                      uniqueID;
         css::uno::Reference < css::i18n::XCalendar4 > xCalendar;
     };
-    std::vector<lookupTableItem*>                       lookupTable;
+    std::vector<lookupTableItem>                        lookupTable;
     css::uno::Reference < css::uno::XComponentContext > m_xContext;
     css::uno::Reference < css::i18n::XCalendar4 >       xCalendar;
 };
diff --git a/i18npool/inc/cclass_unicode.hxx b/i18npool/inc/cclass_unicode.hxx
index bea025a231e9..2b6e3d9e890f 100644
--- a/i18npool/inc/cclass_unicode.hxx
+++ b/i18npool/inc/cclass_unicode.hxx
@@ -27,6 +27,7 @@
 
 #include "transliteration_body.hxx"
 #include <o3tl/typed_flags_set.hxx>
+#include <memory>
 
 namespace com { namespace sun { namespace star { namespace uno {
     class XComponentContext;
@@ -95,7 +96,7 @@ public:
     virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override;
 
 private:
-    Transliteration_casemapping *trans;
+    std::unique_ptr<Transliteration_casemapping> trans;
 
 // --- parser specific (implemented in cclass_unicode_parser.cxx) ---
 
diff --git a/i18npool/inc/characterclassificationImpl.hxx b/i18npool/inc/characterclassificationImpl.hxx
index 36d37c69e4fc..078a31b116ba 100644
--- a/i18npool/inc/characterclassificationImpl.hxx
+++ b/i18npool/inc/characterclassificationImpl.hxx
@@ -22,6 +22,7 @@
 #include <com/sun/star/i18n/XCharacterClassification.hpp>
 #include <cppuhelper/implbase.hxx>
 #include <vector>
+#include <memory>
 #include <com/sun/star/i18n/KCharacterType.hpp>
 #include <com/sun/star/lang/XServiceInfo.hpp>
 #include <com/sun/star/uno/XComponentContext.hpp>
@@ -80,7 +81,7 @@ private:
             aLocale.Variant == rLocale.Variant;
         };
     };
-    std::vector<lookupTableItem*> lookupTable;
+    std::vector<std::unique_ptr<lookupTableItem>> lookupTable;
     lookupTableItem *cachedItem;
 
     css::uno::Reference < css::uno::XComponentContext > m_xContext;
diff --git a/i18npool/inc/collatorImpl.hxx b/i18npool/inc/collatorImpl.hxx
index 534690897731..940031a1480f 100644
--- a/i18npool/inc/collatorImpl.hxx
+++ b/i18npool/inc/collatorImpl.hxx
@@ -29,6 +29,7 @@
 #include <com/sun/star/lang/XServiceInfo.hpp>
 
 #include <vector>
+#include <memory>
 
 namespace i18npool {
 
@@ -88,7 +89,7 @@ private:
             algorithm == _algorithm;
         }
     };
-    std::vector<lookupTableItem*>                       lookupTable;
+    std::vector<std::unique_ptr<lookupTableItem>>       lookupTable;
     lookupTableItem *                                   cachedItem;
 
     // Service Factory
diff --git a/i18npool/inc/collator_unicode.hxx b/i18npool/inc/collator_unicode.hxx
index d943bc9bc2c1..275b8f8faf79 100644
--- a/i18npool/inc/collator_unicode.hxx
+++ b/i18npool/inc/collator_unicode.hxx
@@ -63,7 +63,7 @@ public:
 
 private:
     const sal_Char *implementationName;
-    icu::RuleBasedCollator *uca_base, *collator;
+    std::unique_ptr<icu::RuleBasedCollator> uca_base, collator;
 #ifndef DISABLE_DYNLOADING
     oslModule hModule;
 #endif
diff --git a/i18npool/inc/inputsequencechecker.hxx b/i18npool/inc/inputsequencechecker.hxx
index 0c27637b9535..a8dbdb80d21f 100644
--- a/i18npool/inc/inputsequencechecker.hxx
+++ b/i18npool/inc/inputsequencechecker.hxx
@@ -26,6 +26,7 @@
 #include <com/sun/star/i18n/XExtendedInputSequenceChecker.hpp>
 
 #include <vector>
+#include <memory>
 
 namespace i18npool {
 
@@ -63,7 +64,7 @@ private:
         const sal_Char* aLanguage;
         css::uno::Reference < css::i18n::XExtendedInputSequenceChecker > xISC;
     };
-    std::vector<lookupTableItem*> lookupTable;
+    std::vector<std::unique_ptr<lookupTableItem>> lookupTable;
     lookupTableItem *cachedItem;
 
     css::uno::Reference < css::uno::XComponentContext > m_xContext;
diff --git a/i18npool/source/breakiterator/breakiteratorImpl.cxx b/i18npool/source/breakiterator/breakiteratorImpl.cxx
index de45516ec31d..e923fbd99eaa 100644
--- a/i18npool/source/breakiterator/breakiteratorImpl.cxx
+++ b/i18npool/source/breakiterator/breakiteratorImpl.cxx
@@ -41,10 +41,6 @@ BreakIteratorImpl::BreakIteratorImpl()
 
 BreakIteratorImpl::~BreakIteratorImpl()
 {
-    // Clear lookuptable
-    for (lookupTableItem* p : lookupTable)
-        delete p;
-    lookupTable.clear();
 }
 
 #define LBI getLocaleSpecificBreakIterator(rLocale)
@@ -530,9 +526,9 @@ sal_Int16  BreakIteratorImpl::getScriptClass(sal_uInt32 currentChar)
 bool BreakIteratorImpl::createLocaleSpecificBreakIterator(const OUString& aLocaleName)
 {
     // to share service between same Language but different Country code, like zh_CN and zh_TW
-    for (lookupTableItem* listItem : lookupTable) {
-        if (aLocaleName == listItem->aLocale.Language) {
-            xBI = listItem->xBI;
+    for (lookupTableItem& listItem : lookupTable) {
+        if (aLocaleName == listItem.aLocale.Language) {
+            xBI = listItem.xBI;
             return true;
         }
     }
@@ -560,7 +556,7 @@ bool BreakIteratorImpl::createLocaleSpecificBreakIterator(const OUString& aLocal
     if ( xI.is() ) {
         xBI.set(xI, UNO_QUERY);
         if (xBI.is()) {
-            lookupTable.push_back(new lookupTableItem(Locale(aLocaleName, aLocaleName, aLocaleName), xBI));
+            lookupTable.emplace_back(Locale(aLocaleName, aLocaleName, aLocaleName), xBI);
             return true;
         }
     }
@@ -575,9 +571,9 @@ BreakIteratorImpl::getLocaleSpecificBreakIterator(const Locale& rLocale)
     else if (m_xContext.is()) {
         aLocale = rLocale;
 
-        for (lookupTableItem* listItem : lookupTable) {
-            if (rLocale == listItem->aLocale)
-                return xBI = listItem->xBI;
+        for (lookupTableItem& listItem : lookupTable) {
+            if (rLocale == listItem.aLocale)
+                return xBI = listItem.xBI;
         }
 
         sal_Unicode under = '_';
@@ -606,7 +602,7 @@ BreakIteratorImpl::getLocaleSpecificBreakIterator(const Locale& rLocale)
                  createLocaleSpecificBreakIterator(rLocale.Language)) ||
                 // load default service with name <base>_Unicode
                 createLocaleSpecificBreakIterator("Unicode")) {
-            lookupTable.push_back( new lookupTableItem(aLocale, xBI) );
+            lookupTable.emplace_back( aLocale, xBI );
             return xBI;
         }
     }
diff --git a/i18npool/source/calendar/calendarImpl.cxx b/i18npool/source/calendar/calendarImpl.cxx
index c40735b83761..2f3ffc5c1043 100644
--- a/i18npool/source/calendar/calendarImpl.cxx
+++ b/i18npool/source/calendar/calendarImpl.cxx
@@ -36,10 +36,6 @@ CalendarImpl::CalendarImpl(const Reference< XComponentContext > &rxContext) : m_
 
 CalendarImpl::~CalendarImpl()
 {
-    // Clear lookuptable
-    for (lookupTableItem* p : lookupTable)
-        delete p;
-    lookupTable.clear();
 }
 
 void SAL_CALL
@@ -62,9 +58,9 @@ CalendarImpl::loadCalendar(const OUString& uniqueID, const Locale& rLocale )
     sal_Int32 i;
 
     for (i = 0; i < sal::static_int_cast<sal_Int32>(lookupTable.size()); i++) {
-        lookupTableItem *listItem = lookupTable[i];
-        if (uniqueID == listItem->uniqueID) {
-            xCalendar = listItem->xCalendar;
+        lookupTableItem &listItem = lookupTable[i];
+        if (uniqueID == listItem.uniqueID) {
+            xCalendar = listItem.xCalendar;
             break;
         }
     }
@@ -88,7 +84,7 @@ CalendarImpl::loadCalendar(const OUString& uniqueID, const Locale& rLocale )
             throw ERROR;
         xCalendar.set(xI, UNO_QUERY);
 
-        lookupTable.push_back( new lookupTableItem(uniqueID, xCalendar) );
+        lookupTable.emplace_back( uniqueID, xCalendar );
     }
 
     if ( !xCalendar.is() )
diff --git a/i18npool/source/characterclassification/cclass_unicode.cxx b/i18npool/source/characterclassification/cclass_unicode.cxx
index 5b000060c49b..70727dea8cb1 100644
--- a/i18npool/source/characterclassification/cclass_unicode.cxx
+++ b/i18npool/source/characterclassification/cclass_unicode.cxx
@@ -39,7 +39,9 @@ namespace i18npool {
 //  class cclass_Unicode
 //  ----------------------------------------------------;
 
-cclass_Unicode::cclass_Unicode( const uno::Reference < XComponentContext >& rxContext ) : m_xContext( rxContext ),
+cclass_Unicode::cclass_Unicode( const uno::Reference < XComponentContext >& rxContext ) :
+        trans( new Transliteration_casemapping() ),
+        m_xContext( rxContext ),
         pTable( nullptr ),
         pStart( nullptr ),
         pCont( nullptr ),
@@ -50,12 +52,10 @@ cclass_Unicode::cclass_Unicode( const uno::Reference < XComponentContext >& rxCo
         cDecimalSep( '.' ),
         cDecimalSepAlt( 0 )
 {
-    trans = new Transliteration_casemapping();
 }
 
 cclass_Unicode::~cclass_Unicode() {
     destroyParserTable();
-    delete trans;
 }
 
 
diff --git a/i18npool/source/characterclassification/characterclassificationImpl.cxx b/i18npool/source/characterclassification/characterclassificationImpl.cxx
index ccccbe432bf9..b9f008d26930 100644
--- a/i18npool/source/characterclassification/characterclassificationImpl.cxx
+++ b/i18npool/source/characterclassification/characterclassificationImpl.cxx
@@ -36,10 +36,6 @@ CharacterClassificationImpl::CharacterClassificationImpl(
 }
 
 CharacterClassificationImpl::~CharacterClassificationImpl() {
-        // Clear lookuptable
-        for (lookupTableItem* p : lookupTable)
-            delete p;
-        lookupTable.clear();
 }
 
 
@@ -128,9 +124,10 @@ bool CharacterClassificationImpl::createLocaleSpecificCharacterClassification(co
 {
     // to share service between same Language but different Country code, like zh_CN and zh_SG
     for (size_t l = 0; l < lookupTable.size(); l++) {
-        cachedItem = lookupTable[l];
+        cachedItem = lookupTable[l].get();
         if (serviceName == cachedItem->aName) {
-            lookupTable.push_back( cachedItem = new lookupTableItem(rLocale, serviceName, cachedItem->xCI) );
+            lookupTable.emplace_back( new lookupTableItem(rLocale, serviceName, cachedItem->xCI) );
+            cachedItem = lookupTable.back().get();
             return true;
         }
     }
@@ -142,7 +139,8 @@ bool CharacterClassificationImpl::createLocaleSpecificCharacterClassification(co
     if ( xI.is() ) {
         xCI.set( xI, UNO_QUERY );
         if (xCI.is()) {
-            lookupTable.push_back( cachedItem =  new lookupTableItem(rLocale, serviceName, xCI) );
+            lookupTable.emplace_back( new lookupTableItem(rLocale, serviceName, xCI) );
+            cachedItem = lookupTable.back().get();
             return true;
         }
     }
@@ -156,8 +154,8 @@ CharacterClassificationImpl::getLocaleSpecificCharacterClassification(const Loca
     if (cachedItem && cachedItem->equals(rLocale))
         return cachedItem->xCI;
     else {
-        for (lookupTableItem* i : lookupTable) {
-            cachedItem = i;
+        for (auto & i : lookupTable) {
+            cachedItem = i.get();
             if (cachedItem->equals(rLocale))
                 return cachedItem->xCI;
         }
@@ -180,7 +178,8 @@ CharacterClassificationImpl::getLocaleSpecificCharacterClassification(const Loca
             return cachedItem->xCI;
         else if (xUCI.is())
         {
-            lookupTable.push_back( cachedItem = new lookupTableItem( rLocale, "Unicode", xUCI));
+            lookupTable.emplace_back( new lookupTableItem(rLocale, "Unicode", xUCI) );
+            cachedItem = lookupTable.back().get();
             return cachedItem->xCI;
         }
     }
diff --git a/i18npool/source/collator/collatorImpl.cxx b/i18npool/source/collator/collatorImpl.cxx
index b9eed0230c40..27737270a7f0 100644
--- a/i18npool/source/collator/collatorImpl.cxx
+++ b/i18npool/source/collator/collatorImpl.cxx
@@ -40,10 +40,6 @@ CollatorImpl::CollatorImpl( const Reference < XComponentContext >& rxContext ) :
 
 CollatorImpl::~CollatorImpl()
 {
-    // Clear lookuptable
-    for (lookupTableItem* p : lookupTable)
-        delete p;
-    lookupTable.clear();
 }
 
 sal_Int32 SAL_CALL
@@ -144,9 +140,10 @@ bool
 CollatorImpl::createCollator(const lang::Locale& rLocale, const OUString& serviceName, const OUString& rSortAlgorithm)
 {
     for (size_t l = 0; l < lookupTable.size(); l++) {
-        cachedItem = lookupTable[l];
+        cachedItem = lookupTable[l].get();
         if (cachedItem->service == serviceName) {// cross locale sharing
-            lookupTable.push_back(cachedItem = new lookupTableItem(rLocale, rSortAlgorithm, serviceName, cachedItem->xC));
+            lookupTable.emplace_back(new lookupTableItem(rLocale, rSortAlgorithm, serviceName, cachedItem->xC));
+            cachedItem = lookupTable.back().get();
             return true;
         }
     }
@@ -157,7 +154,8 @@ CollatorImpl::createCollator(const lang::Locale& rLocale, const OUString& servic
         Reference < XCollator > xC;
         xC.set( xI, UNO_QUERY );
         if (xC.is()) {
-            lookupTable.push_back(cachedItem = new lookupTableItem(rLocale, rSortAlgorithm, serviceName, xC));
+            lookupTable.emplace_back(new lookupTableItem(rLocale, rSortAlgorithm, serviceName, xC));
+            cachedItem = lookupTable.back().get();
             return true;
         }
     }
@@ -167,8 +165,8 @@ CollatorImpl::createCollator(const lang::Locale& rLocale, const OUString& servic
 void
 CollatorImpl::loadCachedCollator(const lang::Locale& rLocale, const OUString& rSortAlgorithm)
 {
-    for (lookupTableItem* i : lookupTable) {
-        cachedItem = i;
+    for (auto& i : lookupTable) {
+        cachedItem = i.get();
         if (cachedItem->equals(rLocale, rSortAlgorithm)) {
             return;
         }
diff --git a/i18npool/source/collator/collator_unicode.cxx b/i18npool/source/collator/collator_unicode.cxx
index 37dc7eec6ea6..5bbe015e4d5e 100644
--- a/i18npool/source/collator/collator_unicode.cxx
+++ b/i18npool/source/collator/collator_unicode.cxx
@@ -48,8 +48,8 @@ Collator_Unicode::Collator_Unicode()
 
 Collator_Unicode::~Collator_Unicode()
 {
-    delete collator;
-    delete uca_base;
+    collator.reset();
+    uca_base.reset();
 #ifndef DISABLE_DYNLOADING
     if (hModule) osl_unloadModule(hModule);
 #endif
@@ -138,7 +138,7 @@ Collator_Unicode::loadCollatorAlgorithm(const OUString& rAlgorithm, const lang::
         UErrorCode status = U_ZERO_ERROR;
         OUString rule = LocaleDataImpl::get()->getCollatorRuleByAlgorithm(rLocale, rAlgorithm);
         if (!rule.isEmpty()) {
-            collator = new icu::RuleBasedCollator(reinterpret_cast<const UChar *>(rule.getStr()), status);
+            collator.reset( new icu::RuleBasedCollator(reinterpret_cast<const UChar *>(rule.getStr()), status) );
             if (! U_SUCCESS(status)) throw RuntimeException();
         }
         if (!collator && OUString(LOCAL_RULE_LANGS).indexOf(rLocale.Language) >= 0) {
@@ -354,12 +354,12 @@ Collator_Unicode::loadCollatorAlgorithm(const OUString& rAlgorithm, const lang::
                 // The default collator of the en-US locale would also fulfill
                 // the requirement. The collator of the actual locale or the
                 // NULL (default) locale does not.
-                uca_base = static_cast<icu::RuleBasedCollator*>(icu::Collator::createInstance(
-                            icu::Locale::getRoot(), status));
+                uca_base.reset( static_cast<icu::RuleBasedCollator*>(icu::Collator::createInstance(
+                            icu::Locale::getRoot(), status)) );
 #endif
                 if (! U_SUCCESS(status)) throw RuntimeException();
-                collator = new icu::RuleBasedCollator(
-                        reinterpret_cast<const uint8_t*>(ruleImage), ruleImageSize, uca_base, status);
+                collator.reset( new icu::RuleBasedCollator(
+                        reinterpret_cast<const uint8_t*>(ruleImage), ruleImageSize, uca_base.get(), status) );
                 if (! U_SUCCESS(status)) throw RuntimeException();
             }
         }
@@ -372,7 +372,7 @@ Collator_Unicode::loadCollatorAlgorithm(const OUString& rAlgorithm, const lang::
             */
             icu::Locale icuLocale( LanguageTagIcu::getIcuLocale( LanguageTag( rLocale), rAlgorithm));
             // load ICU collator
-            collator = static_cast<icu::RuleBasedCollator*>( icu::Collator::createInstance(icuLocale, status) );
+            collator.reset( static_cast<icu::RuleBasedCollator*>( icu::Collator::createInstance(icuLocale, status) ) );
             if (! U_SUCCESS(status)) throw RuntimeException();
         }
     }
diff --git a/i18npool/source/inputchecker/inputsequencechecker.cxx b/i18npool/source/inputchecker/inputsequencechecker.cxx
index 6fdc99440f28..15426db1bc57 100644
--- a/i18npool/source/inputchecker/inputsequencechecker.cxx
+++ b/i18npool/source/inputchecker/inputsequencechecker.cxx
@@ -43,11 +43,6 @@ InputSequenceCheckerImpl::InputSequenceCheckerImpl(const char *pServiceName)
 
 InputSequenceCheckerImpl::~InputSequenceCheckerImpl()
 {
-    // Clear lookuptable
-    for (lookupTableItem* p : lookupTable)
-        delete p;
-
-    lookupTable.clear();
 }
 
 sal_Bool SAL_CALL
@@ -113,8 +108,8 @@ InputSequenceCheckerImpl::getInputSequenceChecker(sal_Char const * rLanguage)
         return cachedItem->xISC;
     }
     else {
-        for (lookupTableItem* l : lookupTable) {
-            cachedItem = l;
+        for (auto& l : lookupTable) {
+            cachedItem = l.get();
             if (cachedItem->aLanguage == rLanguage)
                 return cachedItem->xISC;
         }
@@ -127,7 +122,8 @@ InputSequenceCheckerImpl::getInputSequenceChecker(sal_Char const * rLanguage)
         if ( xI.is() ) {
             Reference< XExtendedInputSequenceChecker > xISC( xI, UNO_QUERY );
             if (xISC.is()) {
-                lookupTable.push_back(cachedItem = new lookupTableItem(rLanguage, xISC));
+                lookupTable.emplace_back(new lookupTableItem(rLanguage, xISC));
+                cachedItem = lookupTable.back().get();
                 return cachedItem->xISC;
             }
         }
diff --git a/i18npool/source/search/textsearch.cxx b/i18npool/source/search/textsearch.cxx
index dfbdafbbf626..db3c5410b47c 100644
--- a/i18npool/source/search/textsearch.cxx
+++ b/i18npool/source/search/textsearch.cxx
@@ -118,10 +118,10 @@ TextSearch::TextSearch(const Reference < XComponentContext > & rxContext)
 
 TextSearch::~TextSearch()
 {
-    delete pRegexMatcher;
-    delete pWLD;
-    delete pJumpTable;
-    delete pJumpTable2;
+    pRegexMatcher.reset();
+    pWLD.reset();
+    pJumpTable.reset();
+    pJumpTable2.reset();
 }
 
 void TextSearch::setOptions2( const SearchOptions2& rOptions )
@@ -130,14 +130,10 @@ void TextSearch::setOptions2( const SearchOptions2& rOptions )
 
     aSrchPara = rOptions;
 
-    delete pRegexMatcher;
-    pRegexMatcher = nullptr;
-    delete pWLD;
-    pWLD = nullptr;
-    delete pJumpTable;
-    pJumpTable = nullptr;
-    delete pJumpTable2;
-    pJumpTable2 = nullptr;
+    pRegexMatcher.reset();
+    pWLD.reset();
+    pJumpTable.reset();
+    pJumpTable2.reset();
     maWildcardReversePattern.clear();
     maWildcardReversePattern2.clear();
     TransliterationFlags transliterateFlags = static_cast<TransliterationFlags>(aSrchPara.transliterateFlags);
@@ -232,9 +228,9 @@ void TextSearch::setOptions2( const SearchOptions2& rOptions )
             fnForward = &TextSearch::ApproxSrchFrwrd;
             fnBackward = &TextSearch::ApproxSrchBkwrd;
 
-            pWLD = new WLevDistance( sSrchStr.getStr(), aSrchPara.changedChars,
+            pWLD.reset( new WLevDistance( sSrchStr.getStr(), aSrchPara.changedChars,
                     aSrchPara.insertedChars, aSrchPara.deletedChars,
-                    0 != (SearchFlags::LEV_RELAXED & aSrchPara.searchFlag ) );
+                    0 != (SearchFlags::LEV_RELAXED & aSrchPara.searchFlag ) ) );
 
             nLimit = pWLD->GetLimit();
             break;
@@ -556,16 +552,15 @@ bool TextSearch::IsDelimiter( const OUString& rStr, sal_Int32 nPos ) const
 void TextSearch::MakeForwardTab()
 {
     // create the jumptable for the search text
-    if( pJumpTable )
+
+    if( pJumpTable && bIsForwardTab )
     {
-        if( bIsForwardTab )
-            return ;                                        // the jumpTable is ok
-        delete pJumpTable;
+        return; // the jumpTable is ok
     }
     bIsForwardTab = true;
 
     sal_Int32 n, nLen = sSrchStr.getLength();
-    pJumpTable = new TextSearchJumpTable;
+    pJumpTable.reset( new TextSearchJumpTable );
 
     for( n = 0; n < nLen - 1; ++n )
     {
@@ -583,16 +578,14 @@ void TextSearch::MakeForwardTab()
 void TextSearch::MakeForwardTab2()
 {
     // create the jumptable for the search text
-    if( pJumpTable2 )
+    if( pJumpTable2 && bIsForwardTab )
     {
-        if( bIsForwardTab )
-            return ;                                        // the jumpTable is ok
-        delete pJumpTable2;
+        return;        // the jumpTable is ok
     }
     bIsForwardTab = true;
 
     sal_Int32 n, nLen = sSrchStr2.getLength();
-    pJumpTable2 = new TextSearchJumpTable;
+    pJumpTable2.reset( new TextSearchJumpTable );
 
     for( n = 0; n < nLen - 1; ++n )
     {
@@ -610,16 +603,14 @@ void TextSearch::MakeForwardTab2()
 void TextSearch::MakeBackwardTab()
 {
     // create the jumptable for the search text
-    if( pJumpTable )
+    if( pJumpTable && !bIsForwardTab)
     {
-        if( !bIsForwardTab )
-            return ;                                        // the jumpTable is ok
-        delete pJumpTable;
+        return;   // the jumpTable is ok
     }
     bIsForwardTab = false;
 
     sal_Int32 n, nLen = sSrchStr.getLength();
-    pJumpTable = new TextSearchJumpTable;
+    pJumpTable.reset( new TextSearchJumpTable );
 
     for( n = nLen-1; n > 0; --n )
     {
@@ -635,16 +626,14 @@ void TextSearch::MakeBackwardTab()
 void TextSearch::MakeBackwardTab2()
 {
     // create the jumptable for the search text
-    if( pJumpTable2 )
+    if( pJumpTable2 && !bIsForwardTab )
     {
-        if( !bIsForwardTab )
-            return ;                                        // the jumpTable is ok
-        delete pJumpTable2;
+        return;    // the jumpTable is ok
     }
     bIsForwardTab = false;
 
     sal_Int32 n, nLen = sSrchStr2.getLength();
-    pJumpTable2 = new TextSearchJumpTable;
+    pJumpTable2.reset( new TextSearchJumpTable );
 
     for( n = nLen-1; n > 0; --n )
     {
@@ -663,10 +652,10 @@ sal_Int32 TextSearch::GetDiff( const sal_Unicode cChr ) const
     OUString sSearchKey;
 
     if ( bUsePrimarySrchStr ) {
-        pJump = pJumpTable;
+        pJump = pJumpTable.get();
         sSearchKey = sSrchStr;
     } else {
-        pJump = pJumpTable2;
+        pJump = pJumpTable2.get();
         sSearchKey = sSrchStr2;
     }
 
@@ -868,12 +857,11 @@ void TextSearch::RESrchPrepare( const css::util::SearchOptions2& rOptions)
     aIcuSearchPatStr = aChevronMatcherE.replaceAll( aChevronReplaceE, nIcuErr);
     aChevronMatcherE.reset();
 #endif
-    pRegexMatcher = new RegexMatcher( aIcuSearchPatStr, nIcuSearchFlags, nIcuErr);
+    pRegexMatcher.reset( new RegexMatcher( aIcuSearchPatStr, nIcuSearchFlags, nIcuErr) );
     if (nIcuErr)
     {
         SAL_INFO( "i18npool", "TextSearch::RESrchPrepare UErrorCode " << nIcuErr);
-        delete pRegexMatcher;
-        pRegexMatcher = nullptr;
+        pRegexMatcher.reset();
     }
     else
     {
@@ -897,7 +885,7 @@ void TextSearch::RESrchPrepare( const css::util::SearchOptions2& rOptions)
 }
 
 
-static bool lcl_findRegex( RegexMatcher * pRegexMatcher, sal_Int32 nStartPos, UErrorCode & rIcuErr )
+static bool lcl_findRegex( std::unique_ptr<RegexMatcher>& pRegexMatcher, sal_Int32 nStartPos, UErrorCode & rIcuErr )
 {
     if (!pRegexMatcher->find( nStartPos, rIcuErr))
     {
diff --git a/i18npool/source/search/textsearch.hxx b/i18npool/source/search/textsearch.hxx
index 05c158d302a1..0459049842c5 100644
--- a/i18npool/source/search/textsearch.hxx
+++ b/i18npool/source/search/textsearch.hxx
@@ -29,6 +29,7 @@
 #include <com/sun/star/uno/XComponentContext.hpp>
 
 #include <map>
+#include <memory>
 
 #include <unicode/regex.h>
 using namespace U_ICU_NAMESPACE;
@@ -64,8 +65,8 @@ class TextSearch: public cppu::WeakImplHelper
     FnSrch fnBackward;
 
     // Members and methods for the normal (Boyer-Moore) search
-    TextSearchJumpTable* pJumpTable;
-    TextSearchJumpTable* pJumpTable2;
+    std::unique_ptr<TextSearchJumpTable> pJumpTable;
+    std::unique_ptr<TextSearchJumpTable> pJumpTable2;
     bool bIsForwardTab;
     bool bUsePrimarySrchStr;
     void MakeForwardTab();
@@ -83,7 +84,7 @@ class TextSearch: public cppu::WeakImplHelper
                                 sal_Int32 startPos, sal_Int32 endPos );
 
     // Members and methods for the regular expression search
-    RegexMatcher* pRegexMatcher;
+    std::unique_ptr<RegexMatcher> pRegexMatcher;
     /// @throws css::uno::RuntimeException
     css::util::SearchResult SAL_CALL
         RESrchFrwrd( const OUString& searchStr,
@@ -96,7 +97,7 @@ class TextSearch: public cppu::WeakImplHelper
 
     // Members and methods for the "Weight Levenshtein-Distance" search
     int nLimit;
-    WLevDistance* pWLD;
+    std::unique_ptr<WLevDistance> pWLD;
     css::uno::Reference < css::i18n::XBreakIterator > xBreak;
     /// @throws css::uno::RuntimeException
     css::util::SearchResult SAL_CALL


More information about the Libreoffice-commits mailing list