[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