summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2016-11-14 18:04:05 +0100
committerEike Rathke <erack@redhat.com>2016-11-14 18:07:01 +0100
commitec0f1b060a9ebff717b823daab75222307a09887 (patch)
tree3e7fd1025603c7d4a001e568822ff459cc6f5227 /sc
parent27ee9ee8e816334447f1cf781bc2892469e0c8dc (diff)
avoid reallocating if allocating once is enough
Change-Id: I30dbdd59304095c3a535af98217ddcb973ba0416
Diffstat (limited to 'sc')
-rw-r--r--sc/inc/markarr.hxx2
-rw-r--r--sc/source/core/data/markarr.cxx30
2 files changed, 18 insertions, 14 deletions
diff --git a/sc/inc/markarr.hxx b/sc/inc/markarr.hxx
index 386b97adaa8a..0fd826cad395 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 4a5021301f59..dc65138ef062 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