[Libreoffice-commits] core.git: sc/inc sc/source

Eike Rathke erack at redhat.com
Mon Nov 14 17:07:24 UTC 2016


 sc/inc/markarr.hxx              |    2 +-
 sc/source/core/data/markarr.cxx |   30 +++++++++++++++++-------------
 2 files changed, 18 insertions(+), 14 deletions(-)

New commits:
commit ec0f1b060a9ebff717b823daab75222307a09887
Author: Eike Rathke <erack at redhat.com>
Date:   Mon Nov 14 18:04:05 2016 +0100

    avoid reallocating if allocating once is enough
    
    Change-Id: I30dbdd59304095c3a535af98217ddcb973ba0416

diff --git a/sc/inc/markarr.hxx b/sc/inc/markarr.hxx
index 386b97a..0fd826c 100644
--- a/sc/inc/markarr.hxx
+++ b/sc/inc/markarr.hxx
@@ -43,7 +43,7 @@ public:
             ScMarkArray();
             ScMarkArray( ScMarkArray&& rArray );
             ~ScMarkArray();
-    void    Reset( bool bMarked = false );
+    void    Reset( bool bMarked = false, SCSIZE nNeeded = 1 );
     bool    GetMark( SCROW nRow ) const;
     void    SetMarkArea( SCROW nStartRow, SCROW nEndRow, bool bMarked );
     bool    IsAllMarked( SCROW nStartRow, SCROW nEndRow ) const;
diff --git a/sc/source/core/data/markarr.cxx b/sc/source/core/data/markarr.cxx
index 4a50213..dc65138 100644
--- a/sc/source/core/data/markarr.cxx
+++ b/sc/source/core/data/markarr.cxx
@@ -47,15 +47,17 @@ ScMarkArray::~ScMarkArray()
     delete[] pData;
 }
 
-void ScMarkArray::Reset( bool bMarked )
+void ScMarkArray::Reset( bool bMarked, SCSIZE nNeeded )
 {
     // always create pData here
     // (or have separate method to ensure pData)
 
     delete[] pData;
 
-    nCount = nLimit = 1;
-    pData = new ScMarkEntry[1];
+    assert(nNeeded);
+    nLimit = nNeeded;
+    nCount = 1;
+    pData = new ScMarkEntry[nNeeded];
     pData[0].nRow = MAXROW;
     pData[0].bMarked = bMarked;
 }
@@ -117,18 +119,20 @@ void ScMarkArray::SetMarkArea( SCROW nStartRow, SCROW nEndRow, bool bMarked )
         else
         {
             if (!pData)
-                Reset();   // create pData for further processing - could use special case handling!
-
-            SCSIZE nNeeded = nCount + 2;
-            if ( nLimit < nNeeded )
+                Reset( false, 3);   // create pData for further processing, allocating 1+2 entries
+            else
             {
-                nLimit += SC_MARKARRAY_DELTA;
+                SCSIZE nNeeded = nCount + 2;
                 if ( nLimit < nNeeded )
-                    nLimit = nNeeded;
-                ScMarkEntry* pNewData = new ScMarkEntry[nLimit];
-                memcpy( pNewData, pData, nCount*sizeof(ScMarkEntry) );
-                delete[] pData;
-                pData = pNewData;
+                {
+                    nLimit += SC_MARKARRAY_DELTA;
+                    if ( nLimit < nNeeded )
+                        nLimit = nNeeded;
+                    ScMarkEntry* pNewData = new ScMarkEntry[nLimit];
+                    memcpy( pNewData, pData, nCount*sizeof(ScMarkEntry) );
+                    delete[] pData;
+                    pData = pNewData;
+                }
             }
 
             SCSIZE ni;          // number of entries in beginning


More information about the Libreoffice-commits mailing list