summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorEike Rathke <erack@redhat.com>2014-01-22 00:07:14 +0100
committerEike Rathke <erack@redhat.com>2014-01-22 01:09:12 +0100
commit8fd7a53d3cf1ed788c705cafb443801203787c9d (patch)
treedb18fba53ebdf62dd8c16dbf66e94152bbcb0abd /sc
parent57b8e7c96bafb97f881b7db73624693392e13540 (diff)
Allocation happened also if no attributes were to be pasted and more memory could had been allocated than actually used. Also that array of arrays is entirely not needed. Change-Id: I37a58eea9c42cdc96824ce3e8fba5109921fb35a
Diffstat (limited to 'sc')
-rw-r--r--sc/source/core/data/attarray.cxx2
-rw-r--r--sc/source/core/data/document.cxx48
2 files changed, 29 insertions, 21 deletions
diff --git a/sc/source/core/data/attarray.cxx b/sc/source/core/data/attarray.cxx
index bee7eedf6a70..ec2512f96ba1 100644
--- a/sc/source/core/data/attarray.cxx
+++ b/sc/source/core/data/attarray.cxx
@@ -378,7 +378,7 @@ void ScAttrArray::RemoveCellCharAttribs( SCROW nStartRow, SCROW nEndRow,
bool ScAttrArray::Reserve( SCSIZE nReserve )
{
- if ( nCount <= nReserve )
+ if ( nLimit < nReserve )
{
if( ScAttrEntry* pNewData = new (std::nothrow) ScAttrEntry[nReserve] )
{
diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx
index 972cc44d48ac..4d45f565ffaf 100644
--- a/sc/source/core/data/document.cxx
+++ b/sc/source/core/data/document.cxx
@@ -2699,23 +2699,14 @@ void ScDocument::CopyFromClip( const ScRange& rDestRange, const ScMarkData& rMar
nR2 = nRow2;
const SCCOLROW PERFORMANCEOPTIMIZATION4PATTERNTHRESHOLD = 8192;
- bool bNeedPerformanceOptimization4Pattern = nRow2 - nRow1 > PERFORMANCEOPTIMIZATION4PATTERNTHRESHOLD;
- std::vector< std::vector< SCSIZE > > vvPatternCount( bNeedPerformanceOptimization4Pattern ? nCol2 - nCol1 + 1 : 0 );
+ bool bPreallocatePattern = ((nInsFlag & IDF_ATTRIB) && (nRow2 - nRow1 > PERFORMANCEOPTIMIZATION4PATTERNTHRESHOLD));
std::vector< SCTAB > vTables;
- if (bNeedPerformanceOptimization4Pattern)
+ if (bPreallocatePattern)
{
for (SCTAB i = aCxt.getTabStart(); i <= aCxt.getTabEnd(); ++i)
if (maTabs[i] && rMark.GetTableSelect( i ) )
vTables.push_back( i );
-
- for (SCSIZE i = 0; i < vvPatternCount.size(); ++i)
- {
- vvPatternCount[i].resize( vTables.size() );
-
- for (std::vector< SCTAB >::size_type j = 0; j < vTables.size(); ++j)
- vvPatternCount[i][j] = GetPatternCount( vTables[j], nCol1+i );
- }
}
do
@@ -2752,18 +2743,35 @@ void ScDocument::CopyFromClip( const ScRange& rDestRange, const ScMarkData& rMar
if (nC2 > nCol2)
nC2 = nCol2;
- if (bNeedPerformanceOptimization4Pattern && !vvPatternCount.empty())
+ // Preallocate pattern memory once if further chunks are to be pasted.
+ if (bPreallocatePattern && (nR2+1) <= nRow2)
{
- for (SCSIZE i = 0; i < vvPatternCount.size(); ++i)
+ SCROW nR3 = nR2 + 1;
+ for (size_t j = 0; j < vTables.size(); ++j)
{
- vvPatternCount[i].resize( vTables.size() );
-
- for (std::vector< SCTAB >::size_type j = 0; j<vTables.size(); ++j)
- ReservePatternCount( vTables[j], nCol1+i, vvPatternCount[i][j] + ( GetPatternCount( vTables[j], nCol1+i, nR1, nR2 ) ) * ( ( nRow2 - nRow1 + 1 ) / ( nYw + 1 ) ) );
+ SCTAB nTab = vTables[j];
+ for (SCCOL nCol = nCol1; nCol <= nCol2; ++nCol)
+ {
+ // Pattern count of the first chunk pasted.
+ SCSIZE nChunk = GetPatternCount( nTab, nCol, nR1, nR2);
+ // If it is only one pattern per chunk and chunks are
+ // pasted consecutively then it will get its range
+ // enlarged for each chunk and no further allocation
+ // happens. For non-consecutive chunks we're out of
+ // luck in this case.
+ if (nChunk > 1)
+ {
+ SCSIZE nNeeded = nChunk * (nRow2 - nR3 + 1) / (nYw + 1);
+ SCSIZE nRemain = GetPatternCount( nTab, nCol, nR3, nRow2);
+ if (nNeeded > nRemain)
+ {
+ SCSIZE nCurr = GetPatternCount( nTab, nCol);
+ ReservePatternCount( nTab, nCol, nCurr + nNeeded);
+ }
+ }
+ }
}
-
- bNeedPerformanceOptimization4Pattern = false;
- vvPatternCount.clear();
+ bPreallocatePattern = false;
}
nR1 = nR2 + 1;