diff options
-rw-r--r-- | sc/inc/markarr.hxx | 2 | ||||
-rw-r--r-- | sc/source/core/data/markarr.cxx | 30 |
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 |