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 <er...@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 _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits