[Libreoffice-commits] core.git: 2 commits - compilerplugins/clang connectivity/source sc/source

Noel Grandin noel.grandin at collabora.co.uk
Tue Jul 4 06:36:03 UTC 2017


 compilerplugins/clang/unusedfields.untouched.results      |   12 
 connectivity/source/drivers/evoab2/NPreparedStatement.hxx |   13 
 connectivity/source/drivers/evoab2/NResultSet.hxx         |    1 
 connectivity/source/drivers/evoab2/NTable.hxx             |    1 
 sc/source/filter/excel/tokstack.cxx                       |  309 ++------------
 sc/source/filter/inc/tokstack.hxx                         |  100 +++-
 sc/source/ui/vba/vbafont.cxx                              |    1 
 sc/source/ui/vba/vbafont.hxx                              |    1 
 8 files changed, 134 insertions(+), 304 deletions(-)

New commits:
commit b3499a00fc7c1ce3393577c592b9ac6771d2a922
Author: Noel Grandin <noel.grandin at collabora.co.uk>
Date:   Mon Jul 3 15:34:34 2017 +0200

    loplugin:unusedfields
    
    Change-Id: I6bf3de7ba6e6bff2fd607156a0dcdd554887e491
    Reviewed-on: https://gerrit.libreoffice.org/39475
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>

diff --git a/compilerplugins/clang/unusedfields.untouched.results b/compilerplugins/clang/unusedfields.untouched.results
index 255619b13b04..bbd876920d94 100644
--- a/compilerplugins/clang/unusedfields.untouched.results
+++ b/compilerplugins/clang/unusedfields.untouched.results
@@ -20,16 +20,6 @@ connectivity/source/drivers/evoab2/EApi.h:122
     (anonymous) address_format char *
 connectivity/source/drivers/evoab2/EApi.h:126
     (anonymous) ext char *
-connectivity/source/drivers/evoab2/NPreparedStatement.hxx:51
-    connectivity::evoab::OEvoabPreparedStatement::Parameter aValue css::uno::Any
-connectivity/source/drivers/evoab2/NPreparedStatement.hxx:52
-    connectivity::evoab::OEvoabPreparedStatement::Parameter nDataType sal_Int32
-connectivity/source/drivers/evoab2/NPreparedStatement.hxx:60
-    connectivity::evoab::OEvoabPreparedStatement m_aParameters std::vector<Parameter>
-connectivity/source/drivers/evoab2/NResultSet.hxx:91
-    connectivity::evoab::OEvoabResultSet m_aStatement css::uno::WeakReferenceHelper
-connectivity/source/drivers/evoab2/NTable.hxx:34
-    connectivity::evoab::OEvoabTable m_xMetaData css::uno::Reference<css::sdbc::XDatabaseMetaData>
 connectivity/source/drivers/mork/MDatabaseMetaData.hxx:29
     connectivity::mork::ODatabaseMetaData m_pMetaDataHelper std::unique_ptr<MDatabaseMetaDataHelper>
 connectivity/source/inc/OTypeInfo.hxx:31
@@ -138,8 +128,6 @@ sc/source/ui/inc/dataprovider.hxx:46
     sc::ExternalDataMapper maDocument class ScDocument
 sc/source/ui/inc/docsh.hxx:438
     ScDocShellModificator mpProtector std::unique_ptr<ScRefreshTimerProtector>
-sc/source/ui/vba/vbafont.hxx:36
-    ScVbaFont mPalette class ScVbaPalette
 sd/source/ui/remotecontrol/ZeroconfService.hxx:36
     sd::ZeroconfService port uint
 sd/source/ui/table/TableDesignPane.hxx:113
diff --git a/connectivity/source/drivers/evoab2/NPreparedStatement.hxx b/connectivity/source/drivers/evoab2/NPreparedStatement.hxx
index 51bfd46d4d1f..e9b0b8ec7961 100644
--- a/connectivity/source/drivers/evoab2/NPreparedStatement.hxx
+++ b/connectivity/source/drivers/evoab2/NPreparedStatement.hxx
@@ -46,19 +46,6 @@ namespace connectivity
                                         ,public OPreparedStatement_BASE
         {
         protected:
-            struct Parameter
-            {
-                css::uno::Any               aValue;
-                sal_Int32                   nDataType;
-
-                Parameter(const css::uno::Any& rValue, sal_Int32 rDataType) : aValue(rValue),nDataType(rDataType)
-                {
-                }
-
-            };
-
-            std::vector< Parameter>       m_aParameters;
-
             // Data attributes
 
 
diff --git a/connectivity/source/drivers/evoab2/NResultSet.hxx b/connectivity/source/drivers/evoab2/NResultSet.hxx
index 6d506dc238e9..2ed512817c12 100644
--- a/connectivity/source/drivers/evoab2/NResultSet.hxx
+++ b/connectivity/source/drivers/evoab2/NResultSet.hxx
@@ -88,7 +88,6 @@ namespace connectivity
 
             OCommonStatement*                           m_pStatement;
             OEvoabConnection*                           m_pConnection;
-            css::uno::WeakReferenceHelper               m_aStatement;
             rtl::Reference<OEvoabResultSetMetaData>     m_xMetaData;
             ::dbtools::WarningsContainer                m_aWarnings;
 
diff --git a/connectivity/source/drivers/evoab2/NTable.hxx b/connectivity/source/drivers/evoab2/NTable.hxx
index 4d0a4ea88b69..c3e984ce78b6 100644
--- a/connectivity/source/drivers/evoab2/NTable.hxx
+++ b/connectivity/source/drivers/evoab2/NTable.hxx
@@ -31,7 +31,6 @@ namespace connectivity
 
         class OEvoabTable : public OEvoabTable_TYPEDEF
         {
-            css::uno::Reference< css::sdbc::XDatabaseMetaData > m_xMetaData;
             OEvoabConnection* m_pConnection;
 
         public:
diff --git a/sc/source/ui/vba/vbafont.cxx b/sc/source/ui/vba/vbafont.cxx
index 36ef891c0b94..8ca9ff6e604a 100644
--- a/sc/source/ui/vba/vbafont.cxx
+++ b/sc/source/ui/vba/vbafont.cxx
@@ -43,7 +43,6 @@ ScVbaFont::ScVbaFont(
         const uno::Reference< beans::XPropertySet >& xPropertySet,
         ScCellRangeObj* pRangeObj, bool bFormControl ) :
     ScVbaFont_BASE( xParent, xContext, dPalette.getPalette(), xPropertySet, bFormControl ),
-    mPalette( dPalette ),
     mpRangeObj( pRangeObj )
 {
 }
diff --git a/sc/source/ui/vba/vbafont.hxx b/sc/source/ui/vba/vbafont.hxx
index f5d7d7bcdcd0..35c0891b74b9 100644
--- a/sc/source/ui/vba/vbafont.hxx
+++ b/sc/source/ui/vba/vbafont.hxx
@@ -33,7 +33,6 @@ typedef cppu::ImplInheritanceHelper< VbaFontBase, ov::excel::XFont > ScVbaFont_B
 
 class ScVbaFont : public ScVbaFont_BASE
 {
-    ScVbaPalette mPalette;
     ScCellRangeObj* mpRangeObj;
     SfxItemSet*  GetDataSet();
 public:
commit bc37a4c803cf16e969e51a67349ff83bd4de0fb0
Author: Noel Grandin <noel.grandin at collabora.co.uk>
Date:   Tue Jun 27 16:28:10 2017 +0200

    extract common code in TokenPool into template
    
    Change-Id: I773ade4f8c4f1a2a99f80482b7dd86212137b2c4
    Reviewed-on: https://gerrit.libreoffice.org/39305
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>

diff --git a/sc/source/filter/excel/tokstack.cxx b/sc/source/filter/excel/tokstack.cxx
index dc810ee82104..cb5a42805b88 100644
--- a/sc/source/filter/excel/tokstack.cxx
+++ b/sc/source/filter/excel/tokstack.cxx
@@ -46,8 +46,6 @@ TokenStack::~TokenStack()
 TokenPool::TokenPool( svl::SharedStringPool& rSPool ) :
     mrStringPool(rSPool)
 {
-    sal_uInt16  nLauf = nScTokenOff;
-
     // pool for Id-sequences
     nP_Id = 256;
     pP_Id = new sal_uInt16[ nP_Id ];
@@ -59,33 +57,6 @@ TokenPool::TokenPool( svl::SharedStringPool& rSPool ) :
     pSize = new sal_uInt16[ nElement ];
     nP_IdLast = 0;
 
-    // pool for strings
-    nP_Str = 4;
-    ppP_Str = new OUString *[ nP_Str ];
-    for( nLauf = 0 ; nLauf < nP_Str ; nLauf++ )
-        ppP_Str[ nLauf ] = nullptr;
-
-    // pool for double
-    nP_Dbl = 8;
-    pP_Dbl = new double[ nP_Dbl ];
-
-    // pool for error codes
-    pP_Err = new sal_uInt16[ nP_Err ];
-
-    // pool for References
-    nP_RefTr = 32;
-    ppP_RefTr = new ScSingleRefData *[ nP_RefTr ];
-    for( nLauf = 0 ; nLauf < nP_RefTr ; nLauf++ )
-        ppP_RefTr[ nLauf ] = nullptr;
-
-    nP_Ext = 32;
-    ppP_Ext = new EXTCONT*[ nP_Ext ];
-    memset( ppP_Ext, 0, sizeof( EXTCONT* ) * nP_Ext );
-
-    nP_Nlf = 16;
-    ppP_Nlf = new NLFCONT*[ nP_Nlf ];
-    memset( ppP_Nlf, 0, sizeof( NLFCONT* ) * nP_Nlf );
-
     nP_Matrix = 16;
     ppP_Matrix = new ScMatrix*[ nP_Matrix ];
     memset( ppP_Matrix, 0, sizeof( ScMatrix* ) * nP_Matrix );
@@ -97,30 +68,10 @@ TokenPool::TokenPool( svl::SharedStringPool& rSPool ) :
 
 TokenPool::~TokenPool()
 {
-    sal_uInt16 n;
-
     delete[] pP_Id;
     delete[] pElement;
     delete[] pType;
     delete[] pSize;
-    delete[] pP_Dbl;
-    delete[] pP_Err;
-
-    for( n = 0 ; n < nP_RefTr ; n++ )
-        delete ppP_RefTr[ n ];
-    delete[] ppP_RefTr;
-
-    for( n = 0 ; n < nP_Str ; n++ )
-        delete ppP_Str[ n ];
-    delete[] ppP_Str;
-
-    for( n = 0 ; n < nP_Ext ; n++ )
-        delete ppP_Ext[ n ];
-    delete[] ppP_Ext;
-
-    for( n = 0 ; n < nP_Nlf ; n++ )
-        delete ppP_Nlf[ n ];
-    delete[] ppP_Nlf;
 
     ClearMatrix();
     delete[] ppP_Matrix;
@@ -144,97 +95,6 @@ static sal_uInt16 lcl_canGrow( sal_uInt16 nOld, sal_uInt16 nByMin = 1 )
     return static_cast<sal_uInt16>(nNew);
 }
 
-bool TokenPool::GrowString()
-{
-    sal_uInt16 nP_StrNew = lcl_canGrow( nP_Str);
-    if (!nP_StrNew)
-        return false;
-
-    sal_uInt16      nL;
-
-    OUString** ppP_StrNew = new (::std::nothrow) OUString *[ nP_StrNew ];
-    if (!ppP_StrNew)
-        return false;
-
-    for( nL = 0 ; nL < nP_Str ; nL++ )
-        ppP_StrNew[ nL ] = ppP_Str[ nL ];
-    for( nL = nP_Str ; nL < nP_StrNew ; nL++ )
-        ppP_StrNew[ nL ] = nullptr;
-
-    nP_Str = nP_StrNew;
-
-    delete[]    ppP_Str;
-    ppP_Str = ppP_StrNew;
-    return true;
-}
-
-bool TokenPool::GrowDouble()
-{
-    sal_uInt16 nP_DblNew = lcl_canGrow( nP_Dbl);
-    if (!nP_DblNew)
-        return false;
-
-    double* pP_DblNew = new (::std::nothrow) double[ nP_DblNew ];
-    if (!pP_DblNew)
-        return false;
-
-    for( sal_uInt16 nL = 0 ; nL < nP_Dbl ; nL++ )
-        pP_DblNew[ nL ] = pP_Dbl[ nL ];
-
-    nP_Dbl = nP_DblNew;
-
-    delete[] pP_Dbl;
-    pP_Dbl = pP_DblNew;
-    return true;
-}
-
-/* TODO: in case we had FormulaTokenArray::AddError() */
-#if 0
-void TokenPool::GrowError()
-{
-    sal_uInt16 nP_ErrNew = lcl_canGrow( nP_Err);
-    if (!nP_ErrNew)
-        return false;
-
-    sal_uInt16*     pP_ErrNew = new (::std::nothrow) sal_uInt16[ nP_ErrNew ];
-    if (!pP_ErrNew)
-        return false;
-
-    for( sal_uInt16 nL = 0 ; nL < nP_Err ; nL++ )
-        pP_ErrNew[ nL ] = pP_Err[ nL ];
-
-    nP_Err = nP_ErrNew;
-
-    delete[] pP_Err;
-    pP_Err = pP_ErrNew;
-    return true;
-}
-#endif
-
-bool TokenPool::GrowTripel( sal_uInt16 nByMin )
-{
-    sal_uInt16 nP_RefTrNew = lcl_canGrow( nP_RefTr, nByMin);
-    if (!nP_RefTrNew)
-        return false;
-
-    sal_uInt16          nL;
-
-    ScSingleRefData** ppP_RefTrNew = new (::std::nothrow) ScSingleRefData *[ nP_RefTrNew ];
-    if (!ppP_RefTrNew)
-        return false;
-
-    for( nL = 0 ; nL < nP_RefTr ; nL++ )
-        ppP_RefTrNew[ nL ] = ppP_RefTr[ nL ];
-    for( nL = nP_RefTr ; nL < nP_RefTrNew ; nL++ )
-        ppP_RefTrNew[ nL ] = nullptr;
-
-    nP_RefTr = nP_RefTrNew;
-
-    delete[] ppP_RefTr;
-    ppP_RefTr = ppP_RefTrNew;
-    return true;
-}
-
 bool TokenPool::GrowId()
 {
     sal_uInt16 nP_IdNew = lcl_canGrow( nP_Id);
@@ -290,44 +150,6 @@ bool TokenPool::GrowElement()
     return true;
 }
 
-bool TokenPool::GrowExt()
-{
-    sal_uInt16 nNewSize = lcl_canGrow( nP_Ext);
-    if (!nNewSize)
-        return false;
-
-    EXTCONT** ppNew = new (::std::nothrow) EXTCONT*[ nNewSize ];
-    if (!ppNew)
-        return false;
-
-    memset( ppNew, 0, sizeof( EXTCONT* ) * nNewSize );
-    memcpy( ppNew, ppP_Ext, sizeof( EXTCONT* ) * nP_Ext );
-
-    delete[] ppP_Ext;
-    ppP_Ext = ppNew;
-    nP_Ext = nNewSize;
-    return true;
-}
-
-bool TokenPool::GrowNlf()
-{
-    sal_uInt16 nNewSize = lcl_canGrow( nP_Nlf);
-    if (!nNewSize)
-        return false;
-
-    NLFCONT** ppNew = new (::std::nothrow) NLFCONT*[ nNewSize ];
-    if (!ppNew)
-        return false;
-
-    memset( ppNew, 0, sizeof( NLFCONT* ) * nNewSize );
-    memcpy( ppNew, ppP_Nlf, sizeof( NLFCONT* ) * nP_Nlf );
-
-    delete[] ppP_Nlf;
-    ppP_Nlf = ppNew;
-    nP_Nlf = nNewSize;
-    return true;
-}
-
 bool TokenPool::GrowMatrix()
 {
     sal_uInt16 nNewSize = lcl_canGrow( nP_Matrix);
@@ -363,9 +185,9 @@ bool TokenPool::GetElement( const sal_uInt16 nId )
             case T_Str:
                 {
                     sal_uInt16 n = pElement[ nId ];
-                    OUString* p = ( n < nP_Str )? ppP_Str[ n ] : nullptr;
+                    auto* p = ppP_Str.getIfInRange( n );
                     if (p)
-                        pScToken->AddString(mrStringPool.intern(*p));
+                        pScToken->AddString(mrStringPool.intern(*p->get()));
                     else
                         bRet = false;
                 }
@@ -373,7 +195,7 @@ bool TokenPool::GetElement( const sal_uInt16 nId )
             case T_D:
                 {
                     sal_uInt16 n = pElement[ nId ];
-                    if (n < nP_Dbl)
+                    if (n < pP_Dbl.m_writemark)
                         pScToken->AddDouble( pP_Dbl[ n ] );
                     else
                         bRet = false;
@@ -394,9 +216,9 @@ bool TokenPool::GetElement( const sal_uInt16 nId )
             case T_RefC:
                 {
                     sal_uInt16 n = pElement[ nId ];
-                    ScSingleRefData* p = ( n < nP_RefTr )? ppP_RefTr[ n ] : nullptr;
+                    auto p = ppP_RefTr.getIfInRange(n);
                     if (p)
-                        pScToken->AddSingleReference( *p );
+                        pScToken->AddSingleReference( **p );
                     else
                         bRet = false;
                 }
@@ -404,7 +226,7 @@ bool TokenPool::GetElement( const sal_uInt16 nId )
             case T_RefA:
                 {
                     sal_uInt16 n = pElement[ nId ];
-                    if (n < nP_RefTr && ppP_RefTr[ n ] && n+1 < nP_RefTr && ppP_RefTr[ n + 1 ])
+                    if (n < ppP_RefTr.m_writemark && ppP_RefTr[ n ] && n+1 < ppP_RefTr.m_writemark && ppP_RefTr[ n + 1 ])
                     {
                         ScComplexRefData aScComplexRefData;
                         aScComplexRefData.Ref1 = *ppP_RefTr[ n ];
@@ -427,15 +249,15 @@ bool TokenPool::GetElement( const sal_uInt16 nId )
             break;
             case T_Ext:
                 {
-                    sal_uInt16      n = pElement[ nId ];
-                    EXTCONT*        p = ( n < nP_Ext )? ppP_Ext[ n ] : nullptr;
+                    sal_uInt16 n = pElement[ nId ];
+                    auto       p = ppP_Ext.getIfInRange(n);
 
                     if( p )
                     {
-                        if( p->eId == ocEuroConvert )
-                            pScToken->AddOpCode( p->eId );
+                        if( (*p)->eId == ocEuroConvert )
+                            pScToken->AddOpCode( (*p)->eId );
                         else
-                            pScToken->AddExternal( p->aText, p->eId );
+                            pScToken->AddExternal( (*p)->aText, (*p)->eId );
                     }
                     else
                         bRet = false;
@@ -443,11 +265,11 @@ bool TokenPool::GetElement( const sal_uInt16 nId )
                 break;
             case T_Nlf:
                 {
-                    sal_uInt16      n = pElement[ nId ];
-                    NLFCONT*        p = ( n < nP_Nlf )? ppP_Nlf[ n ] : nullptr;
+                    sal_uInt16 n = pElement[ nId ];
+                    auto       p = ppP_Nlf.getIfInRange(n);
 
                     if( p )
-                        pScToken->AddColRowName( p->aRef );
+                        pScToken->AddColRowName( **p );
                     else
                         bRet = false;
                 }
@@ -601,19 +423,19 @@ const TokenId TokenPool::Store( const double& rDouble )
         if (!GrowElement())
             return static_cast<const TokenId>(nElementAkt+1);
 
-    if( nP_DblAkt >= nP_Dbl )
-        if (!GrowDouble())
+    if( pP_Dbl.m_writemark >= pP_Dbl.m_capacity )
+        if (!pP_Dbl.Grow())
             return static_cast<const TokenId>(nElementAkt+1);
 
-    pElement[ nElementAkt ] = nP_DblAkt;    // Index in Double-Array
+    pElement[ nElementAkt ] = pP_Dbl.m_writemark;    // Index in Double-Array
     pType[ nElementAkt ] = T_D;             // set Typeinfo Double
 
-    pP_Dbl[ nP_DblAkt ] = rDouble;
+    pP_Dbl[ pP_Dbl.m_writemark ] = rDouble;
 
     pSize[ nElementAkt ] = 1;               // does not matter
 
     nElementAkt++;
-    nP_DblAkt++;
+    pP_Dbl.m_writemark++;
 
     return static_cast<const TokenId>(nElementAkt); // return old value + 1!
 }
@@ -630,29 +452,26 @@ const TokenId TokenPool::Store( const OUString& rString )
         if (!GrowElement())
             return static_cast<const TokenId>(nElementAkt+1);
 
-    if( nP_StrAkt >= nP_Str )
-        if (!GrowString())
+    if( ppP_Str.m_writemark >= ppP_Str.m_capacity )
+        if (!ppP_Str.Grow())
             return static_cast<const TokenId>(nElementAkt+1);
 
-    pElement[ nElementAkt ] = nP_StrAkt;    // Index in String-Array
+    pElement[ nElementAkt ] = ppP_Str.m_writemark;    // Index in String-Array
     pType[ nElementAkt ] = T_Str;           // set Typeinfo String
 
     // create String
-    if( !ppP_Str[ nP_StrAkt ] )
+    if( !ppP_Str[ ppP_Str.m_writemark ] )
         //...but only, if it does not exist already
-        ppP_Str[ nP_StrAkt ] = new (::std::nothrow) OUString( rString );
+        ppP_Str[ ppP_Str.m_writemark ].reset( new OUString( rString ) );
     else
         //...copy otherwise
-        *ppP_Str[ nP_StrAkt ] = rString;
+        *ppP_Str[ ppP_Str.m_writemark ] = rString;
 
-    if (ppP_Str[ nP_StrAkt ])
-    {
-        /* attention truncate to 16 bits */
-        pSize[ nElementAkt ] = ( sal_uInt16 ) ppP_Str[ nP_StrAkt ]->getLength();
-    }
+    /* attention truncate to 16 bits */
+    pSize[ nElementAkt ] = ( sal_uInt16 ) ppP_Str[ ppP_Str.m_writemark ]->getLength();
 
     nElementAkt++;
-    nP_StrAkt++;
+    ppP_Str.m_writemark++;
 
     return static_cast<const TokenId>(nElementAkt); // return old value + 1!
 }
@@ -663,20 +482,20 @@ const TokenId TokenPool::Store( const ScSingleRefData& rTr )
         if (!GrowElement())
             return static_cast<const TokenId>(nElementAkt+1);
 
-    if( nP_RefTrAkt >= nP_RefTr )
-        if (!GrowTripel())
+    if( ppP_RefTr.m_writemark >= ppP_RefTr.m_capacity )
+        if (!ppP_RefTr.Grow())
             return static_cast<const TokenId>(nElementAkt+1);
 
-    pElement[ nElementAkt ] = nP_RefTrAkt;
+    pElement[ nElementAkt ] = ppP_RefTr.m_writemark;
     pType[ nElementAkt ] = T_RefC;          // set Typeinfo Cell-Ref
 
-    if( !ppP_RefTr[ nP_RefTrAkt ] )
-        ppP_RefTr[ nP_RefTrAkt ] = new ScSingleRefData( rTr );
+    if( !ppP_RefTr[ ppP_RefTr.m_writemark ] )
+        ppP_RefTr[ ppP_RefTr.m_writemark ].reset( new ScSingleRefData( rTr ) );
     else
-        *ppP_RefTr[ nP_RefTrAkt ] = rTr;
+        *ppP_RefTr[ ppP_RefTr.m_writemark ] = rTr;
 
     nElementAkt++;
-    nP_RefTrAkt++;
+    ppP_RefTr.m_writemark++;
 
     return static_cast<const TokenId>(nElementAkt); // return old value + 1!
 }
@@ -687,24 +506,24 @@ const TokenId TokenPool::Store( const ScComplexRefData& rTr )
         if (!GrowElement())
             return static_cast<const TokenId>(nElementAkt+1);
 
-    if( nP_RefTrAkt + 1 >= nP_RefTr )
-        if (!GrowTripel( 2))
+    if( ppP_RefTr.m_writemark + 1 >= ppP_RefTr.m_capacity )
+        if (!ppP_RefTr.Grow(2))
             return static_cast<const TokenId>(nElementAkt+1);
 
-    pElement[ nElementAkt ] = nP_RefTrAkt;
+    pElement[ nElementAkt ] = ppP_RefTr.m_writemark;
     pType[ nElementAkt ] = T_RefA;          // setTypeinfo Area-Ref
 
-    if( !ppP_RefTr[ nP_RefTrAkt ] )
-        ppP_RefTr[ nP_RefTrAkt ] = new ScSingleRefData( rTr.Ref1 );
+    if( !ppP_RefTr[ ppP_RefTr.m_writemark ] )
+        ppP_RefTr[ ppP_RefTr.m_writemark ].reset( new ScSingleRefData( rTr.Ref1 ) );
     else
-        *ppP_RefTr[ nP_RefTrAkt ] = rTr.Ref1;
-    nP_RefTrAkt++;
+        *ppP_RefTr[ ppP_RefTr.m_writemark ] = rTr.Ref1;
+    ppP_RefTr.m_writemark++;
 
-    if( !ppP_RefTr[ nP_RefTrAkt ] )
-        ppP_RefTr[ nP_RefTrAkt ] = new ScSingleRefData( rTr.Ref2 );
+    if( !ppP_RefTr[ ppP_RefTr.m_writemark ] )
+        ppP_RefTr[ ppP_RefTr.m_writemark ].reset( new ScSingleRefData( rTr.Ref2 ) );
     else
-        *ppP_RefTr[ nP_RefTrAkt ] = rTr.Ref2;
-    nP_RefTrAkt++;
+        *ppP_RefTr[ ppP_RefTr.m_writemark ] = rTr.Ref2;
+    ppP_RefTr.m_writemark++;
 
     nElementAkt++;
 
@@ -717,23 +536,23 @@ const TokenId TokenPool::Store( const DefTokenId e, const OUString& r )
         if (!GrowElement())
             return static_cast<const TokenId>(nElementAkt+1);
 
-    if( nP_ExtAkt >= nP_Ext )
-        if (!GrowExt())
+    if( ppP_Ext.m_writemark >= ppP_Ext.m_capacity )
+        if (!ppP_Ext.Grow())
             return static_cast<const TokenId>(nElementAkt+1);
 
-    pElement[ nElementAkt ] = nP_ExtAkt;
+    pElement[ nElementAkt ] = ppP_Ext.m_writemark;
     pType[ nElementAkt ] = T_Ext;           // set Typeinfo String
 
-    if( ppP_Ext[ nP_ExtAkt ] )
+    if( ppP_Ext[ ppP_Ext.m_writemark ] )
     {
-        ppP_Ext[ nP_ExtAkt ]->eId = e;
-        ppP_Ext[ nP_ExtAkt ]->aText = r;
+        ppP_Ext[ ppP_Ext.m_writemark ]->eId = e;
+        ppP_Ext[ ppP_Ext.m_writemark ]->aText = r;
     }
     else
-        ppP_Ext[ nP_ExtAkt ] = new EXTCONT( e, r );
+        ppP_Ext[ ppP_Ext.m_writemark ].reset( new EXTCONT( e, r ) );
 
     nElementAkt++;
-    nP_ExtAkt++;
+    ppP_Ext.m_writemark++;
 
     return static_cast<const TokenId>(nElementAkt); // return old value + 1!
 }
@@ -744,22 +563,22 @@ const TokenId TokenPool::StoreNlf( const ScSingleRefData& rTr )
         if (!GrowElement())
             return static_cast<const TokenId>(nElementAkt+1);
 
-    if( nP_NlfAkt >= nP_Nlf )
-        if (!GrowNlf())
+    if( ppP_Nlf.m_writemark >= ppP_Nlf.m_capacity )
+        if (!ppP_Nlf.Grow())
             return static_cast<const TokenId>(nElementAkt+1);
 
-    pElement[ nElementAkt ] = nP_NlfAkt;
+    pElement[ nElementAkt ] = ppP_Nlf.m_writemark;
     pType[ nElementAkt ] = T_Nlf;
 
-    if( ppP_Nlf[ nP_NlfAkt ] )
+    if( ppP_Nlf[ ppP_Nlf.m_writemark ] )
     {
-        ppP_Nlf[ nP_NlfAkt ]->aRef = rTr;
+        *ppP_Nlf[ ppP_Nlf.m_writemark ] = rTr;
     }
     else
-        ppP_Nlf[ nP_NlfAkt ] = new NLFCONT( rTr );
+        ppP_Nlf[ ppP_Nlf.m_writemark ].reset( new ScSingleRefData( rTr ) );
 
     nElementAkt++;
-    nP_NlfAkt++;
+    ppP_Nlf.m_writemark++;
 
     return static_cast<const TokenId>(nElementAkt);
 }
@@ -867,7 +686,9 @@ const TokenId TokenPool::StoreExtRef( sal_uInt16 nFileId, const OUString& rTabNa
 
 void TokenPool::Reset()
 {
-    nP_IdAkt = nP_IdLast = nElementAkt = nP_StrAkt = nP_DblAkt = nP_ErrAkt = nP_RefTrAkt = nP_ExtAkt = nP_NlfAkt = nP_MatrixAkt = 0;
+    nP_IdAkt = nP_IdLast = nElementAkt
+        = ppP_Str.m_writemark = pP_Dbl.m_writemark = pP_Err.m_writemark
+        = ppP_RefTr.m_writemark = ppP_Ext.m_writemark = ppP_Nlf.m_writemark = nP_MatrixAkt = 0;
     maRangeNames.clear();
     maExtNames.clear();
     maExtCellRefs.clear();
@@ -911,7 +732,7 @@ const OUString* TokenPool::GetExternal( const TokenId& rId ) const
         if( pType[ n ] == T_Ext )
         {
             sal_uInt16 nExt = pElement[ n ];
-            if ( nExt < nP_Ext && ppP_Ext[ nExt ] )
+            if ( nExt < ppP_Ext.m_writemark && ppP_Ext[ nExt ] )
                 p = &ppP_Ext[ nExt ]->aText;
         }
     }
diff --git a/sc/source/filter/inc/tokstack.hxx b/sc/source/filter/inc/tokstack.hxx
index a3e75bb61238..eca4d346e723 100644
--- a/sc/source/filter/inc/tokstack.hxx
+++ b/sc/source/filter/inc/tokstack.hxx
@@ -70,6 +70,64 @@ enum E_TYPE
     T_ExtRefA
 };
 
+template<typename T, int InitialCapacity>
+struct TokenPoolPool
+{
+    std::unique_ptr<T[]> ppP_Str;
+    sal_uInt16                            m_capacity;
+    sal_uInt16                            m_writemark;
+
+    TokenPoolPool() :
+        ppP_Str( new T[InitialCapacity] ),
+        m_capacity(InitialCapacity),
+        m_writemark(0)
+    {
+    }
+    bool Grow(sal_uInt16 nByMin = 1)
+    {
+        sal_uInt16 nP_StrNew = lcl_canGrow(m_capacity, nByMin);
+        if (!nP_StrNew)
+            return false;
+
+        T* ppP_StrNew = new T[ nP_StrNew ];
+
+        for( sal_uInt16 i = 0 ; i < m_capacity ; i++ )
+            ppP_StrNew[ i ] = std::move(ppP_Str[ i ]);
+
+        m_capacity = nP_StrNew;
+
+        ppP_Str.reset( ppP_StrNew );
+        return true;
+    }
+    /** Returns the new number of elements, or 0 if overflow. */
+    static sal_uInt16 lcl_canGrow( sal_uInt16 nOld, sal_uInt16 nByMin = 1 )
+    {
+        if (!nOld)
+            return nByMin ? nByMin : 1;
+        if (nOld == SAL_MAX_UINT16)
+            return 0;
+        sal_uInt32 nNew = ::std::max( static_cast<sal_uInt32>(nOld) * 2,
+                static_cast<sal_uInt32>(nOld) + nByMin);
+        if (nNew > SAL_MAX_UINT16)
+            nNew = SAL_MAX_UINT16;
+        if (nNew - nByMin < nOld)
+            nNew = 0;
+        return static_cast<sal_uInt16>(nNew);
+    }
+    T* getIfInRange(sal_uInt16 n) const
+    {
+         return ( n < m_capacity ) ? &ppP_Str[ n ] : nullptr;
+    }
+    T const & operator[](sal_uInt16 n) const
+    {
+         return ppP_Str[ n ];
+    }
+    T & operator[](sal_uInt16 n)
+    {
+         return ppP_Str[ n ];
+    }
+};
+
 class TokenPool
 {
     // !ATTENTION!: external Id-Basis is 1, internal 0!
@@ -77,21 +135,16 @@ class TokenPool
 private:
     svl::SharedStringPool& mrStringPool;
 
-        OUString**                      ppP_Str;    // Pool for Strings
-        sal_uInt16                      nP_Str;     // ...with size
-        sal_uInt16                      nP_StrAkt;  // ...and Write-Mark
+        TokenPoolPool<std::unique_ptr<OUString>, 4>
+                                        ppP_Str;    // Pool for Strings
 
-        double*                         pP_Dbl;     // Pool for Doubles
-        sal_uInt16                      nP_Dbl;
-        sal_uInt16                      nP_DblAkt;
+        TokenPoolPool<double, 8>        pP_Dbl;     // Pool for Doubles
 
-        sal_uInt16*                     pP_Err;     // Pool for error codes
-        static const sal_uInt16         nP_Err = 8;
-        sal_uInt16                      nP_ErrAkt;
+        TokenPoolPool<sal_uInt16, 8>
+                                        pP_Err;     // Pool for error codes
 
-        ScSingleRefData**               ppP_RefTr;  // Pool for References
-        sal_uInt16                      nP_RefTr;
-        sal_uInt16                      nP_RefTrAkt;
+        TokenPoolPool<std::unique_ptr<ScSingleRefData>, 32>
+                                        ppP_RefTr;  // Pool for References
 
         sal_uInt16*                     pP_Id;      // Pool for Id-sets
         sal_uInt16                      nP_Id;
@@ -105,18 +158,11 @@ private:
                                     EXTCONT( const DefTokenId e, const OUString& r ) :
                                         eId( e ), aText( r ){}
         };
-        EXTCONT**                   ppP_Ext;
-        sal_uInt16                      nP_Ext;
-        sal_uInt16                      nP_ExtAkt;
+        TokenPoolPool<std::unique_ptr<EXTCONT>, 32>
+                                        ppP_Ext;
 
-        struct  NLFCONT
-        {
-            ScSingleRefData         aRef;
-                                    NLFCONT( const ScSingleRefData& r ) : aRef( r ) {}
-        };
-        NLFCONT**                   ppP_Nlf;
-        sal_uInt16                      nP_Nlf;
-        sal_uInt16                      nP_NlfAkt;
+        TokenPoolPool<std::unique_ptr<ScSingleRefData>, 16>
+                                        ppP_Nlf;
 
         ScMatrix**                  ppP_Matrix;     // Pool for Matrices
         sal_uInt16                      nP_Matrix;
@@ -168,17 +214,9 @@ private:
 #endif
         ScTokenArray*               pScToken;   // Token array
 
-        bool                        GrowString();
-        bool                        GrowDouble();
-/* TODO: in case we had FormulaTokenArray::AddError() */
-#if 0
-        bool                        GrowError();
-#endif
         bool                        GrowTripel( sal_uInt16 nByMin = 1 );
         bool                        GrowId();
         bool                        GrowElement();
-        bool                        GrowExt();
-        bool                        GrowNlf();
         bool                        GrowMatrix();
         bool                        GetElement( const sal_uInt16 nId );
         bool                        GetElementRek( const sal_uInt16 nId );


More information about the Libreoffice-commits mailing list