sc/source/filter/excel/xistyle.cxx |   33 ++++++++++++++++-----------------
 sc/source/filter/inc/xistyle.hxx   |    4 ++--
 2 files changed, 18 insertions(+), 19 deletions(-)

New commits:
commit 397d7af2cbb1f2786ba857d350fb4641525e3bb2
Author:     Noel Grandin <noel.gran...@collabora.co.uk>
AuthorDate: Wed May 22 15:03:40 2024 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Fri May 24 18:29:02 2024 +0200

    tdf#161210 speedup loading large XLS
    
    takes the time from 22s to 20s for me
    
    Change-Id: Ib401c03ba13f82047c8376741e3547aadf5b18df
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/168011
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/sc/source/filter/excel/xistyle.cxx 
b/sc/source/filter/excel/xistyle.cxx
index 23db22d23ed8..00bc34c744bd 100644
--- a/sc/source/filter/excel/xistyle.cxx
+++ b/sc/source/filter/excel/xistyle.cxx
@@ -1724,7 +1724,7 @@ void XclImpXFRangeColumn::SetDefaultXF( const 
XclImpXFIndex& rXFIndex, const Xcl
     OSL_ENSURE( maIndexList.empty(), "XclImpXFRangeColumn::SetDefaultXF - 
Setting Default Column XF is not empty" );
 
     // insert a complete row range with one insert.
-    maIndexList.push_back( std::make_unique<XclImpXFRange>( 0, 
rRoot.GetDoc().MaxRow(), rXFIndex ) );
+    maIndexList.push_back( XclImpXFRange( 0, rRoot.GetDoc().MaxRow(), rXFIndex 
) );
 }
 
 void XclImpXFRangeColumn::SetXF( SCROW nScRow, const XclImpXFIndex& rXFIndex )
@@ -1748,7 +1748,7 @@ void XclImpXFRangeColumn::SetXF( SCROW nScRow, const 
XclImpXFIndex& rXFIndex )
             SCROW nLastScRow = pPrevRange->mnScRow2;
             sal_uLong nIndex = nNextIndex - 1;
             XclImpXFRange* pThisRange = pPrevRange;
-            pPrevRange = (nIndex > 0 && nIndex <= maIndexList.size()) ? 
maIndexList[ nIndex - 1 ].get() : nullptr;
+            pPrevRange = (nIndex > 0 && nIndex <= maIndexList.size()) ? 
&maIndexList[ nIndex - 1 ] : nullptr;
 
             if( nFirstScRow == nLastScRow )         // replace solely XF
             {
@@ -1761,20 +1761,20 @@ void XclImpXFRangeColumn::SetXF( SCROW nScRow, const 
XclImpXFIndex& rXFIndex )
                 ++(pThisRange->mnScRow1);
                 // try to concatenate with previous of this
                 if( !pPrevRange || !pPrevRange->Expand( nScRow, rXFIndex ) )
-                    Insert( new XclImpXFRange( nScRow, rXFIndex ), nIndex );
+                    Insert( XclImpXFRange( nScRow, rXFIndex ), nIndex );
             }
             else if( nLastScRow == nScRow )         // replace last XF
             {
                 --(pThisRange->mnScRow2);
                 if( !pNextRange || !pNextRange->Expand( nScRow, rXFIndex ) )
-                    Insert( new XclImpXFRange( nScRow, rXFIndex ), nNextIndex 
);
+                    Insert( XclImpXFRange( nScRow, rXFIndex ), nNextIndex );
             }
             else                                    // insert in the middle of 
the range
             {
                 pThisRange->mnScRow1 = nScRow + 1;
                 // List::Insert() moves entries towards end of list, so insert 
twice at nIndex
-                Insert( new XclImpXFRange( nScRow, rXFIndex ), nIndex );
-                Insert( new XclImpXFRange( nFirstScRow, nScRow - 1, 
pThisRange->maXFIndex ), nIndex );
+                Insert( XclImpXFRange( nScRow, rXFIndex ), nIndex );
+                Insert( XclImpXFRange( nFirstScRow, nScRow - 1, 
pThisRange->maXFIndex ), nIndex );
             }
             return;
         }
@@ -1790,12 +1790,12 @@ void XclImpXFRangeColumn::SetXF( SCROW nScRow, const 
XclImpXFIndex& rXFIndex )
         return;
 
     // create new range
-    Insert( new XclImpXFRange( nScRow, rXFIndex ), nNextIndex );
+    Insert( XclImpXFRange( nScRow, rXFIndex ), nNextIndex );
 }
 
-void XclImpXFRangeColumn::Insert(XclImpXFRange* pXFRange, sal_uLong nIndex)
+void XclImpXFRangeColumn::Insert(XclImpXFRange aXFRange, sal_uLong nIndex)
 {
-    maIndexList.insert( maIndexList.begin() + nIndex, 
std::unique_ptr<XclImpXFRange>(pXFRange) );
+    maIndexList.insert( maIndexList.begin() + nIndex, std::move(aXFRange) );
 }
 
 void XclImpXFRangeColumn::Find(
@@ -1811,8 +1811,8 @@ void XclImpXFRangeColumn::Find(
         return;
     }
 
-    rpPrevRange = maIndexList.front().get();
-    rpNextRange = maIndexList.back().get();
+    rpPrevRange = &maIndexList.front();
+    rpNextRange = &maIndexList.back();
 
     // test whether row is at end of list (contained in or behind last range)
     // rpPrevRange will contain a possible existing row
@@ -1843,7 +1843,7 @@ void XclImpXFRangeColumn::Find(
     while( ((rnNextIndex - nPrevIndex) > 1) && (rpPrevRange->mnScRow2 < 
nScRow) )
     {
         nMidIndex = (nPrevIndex + rnNextIndex) / 2;
-        pMidRange = maIndexList[nMidIndex].get();
+        pMidRange = &maIndexList[nMidIndex];
         assert(pMidRange && "XclImpXFRangeColumn::Find - missing XF index 
range");
         if( nScRow < pMidRange->mnScRow1 )      // row is really before 
pMidRange
         {
@@ -1861,7 +1861,7 @@ void XclImpXFRangeColumn::Find(
     if( nScRow <= rpPrevRange->mnScRow2 )
     {
         rnNextIndex = nPrevIndex + 1;
-        rpNextRange = maIndexList[rnNextIndex].get();
+        rpNextRange = &maIndexList[rnNextIndex];
     }
 }
 
@@ -1870,8 +1870,8 @@ void XclImpXFRangeColumn::TryConcatPrev( sal_uLong nIndex 
)
     if( !nIndex || nIndex >= maIndexList.size() )
         return;
 
-    XclImpXFRange& prevRange = *maIndexList[ nIndex - 1 ];
-    XclImpXFRange& nextRange = *maIndexList[ nIndex ];
+    XclImpXFRange& prevRange = maIndexList[ nIndex - 1 ];
+    XclImpXFRange& nextRange = maIndexList[ nIndex ];
 
     if( prevRange.Expand( nextRange ) )
         maIndexList.erase( maIndexList.begin() + nIndex );
@@ -2004,9 +2004,8 @@ void XclImpXFRangeBuffer::Finalize()
             std::vector<ScAttrEntry> aAttrs;
             aAttrs.reserve(rColumn.end() - rColumn.begin());
 
-            for (const auto& rxStyle : rColumn)
+            for (const auto& rStyle : rColumn)
             {
-                XclImpXFRange& rStyle = *rxStyle;
                 const XclImpXFIndex& rXFIndex = rStyle.maXFIndex;
                 XclImpXF* pXF = rXFBuffer.GetXF( rXFIndex.GetXFIndex() );
                 if (!pXF)
diff --git a/sc/source/filter/inc/xistyle.hxx b/sc/source/filter/inc/xistyle.hxx
index b7ed707f9822..963beb2ab609 100644
--- a/sc/source/filter/inc/xistyle.hxx
+++ b/sc/source/filter/inc/xistyle.hxx
@@ -569,7 +569,7 @@ public:
     XclImpXFRangeColumn(const XclImpXFRangeColumn&) = delete;
     const XclImpXFRangeColumn& operator=(const XclImpXFRangeColumn&) = delete;
 
-    typedef std::vector< std::unique_ptr<XclImpXFRange> > IndexList;
+    typedef std::vector< XclImpXFRange > IndexList;
 
     explicit     XclImpXFRangeColumn() {}
 
@@ -597,7 +597,7 @@ private:
     void                TryConcatPrev( sal_uLong nIndex );
 
     /** Insert a range into the list at the specified index. */
-    void                Insert(XclImpXFRange* pXFRange, sal_uLong nIndex);
+    void                Insert(XclImpXFRange aXFRange, sal_uLong nIndex);
 
 private:
     IndexList maIndexList;    /// The list of XF index range.

Reply via email to