summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDennis Francis <dennisfrancis.in@gmail.com>2016-01-20 13:07:38 +0530
committerMarkus Mohrhard <markus.mohrhard@googlemail.com>2016-02-04 19:38:56 +0000
commitf14d271d31e75de09821cf1766c7ab2a9c6e0461 (patch)
tree30e5263ad4feeecfbd208694d51f81bcf05599e5
parent4186368f9240acf0b5951d541d5ed1a4790e711f (diff)
Patch#1 : Dynamic column container in the pursuit of tdf#50916
In this patch dynamic column structure is introduced, basically wrapping std::vector<ScColumn*>. In ScTable the column container is pre-allocated with MAXCOL + 1 columns so that the rest of the code that uses need not change for now. So for now the new column container will still behave like the static one. The plan is to *incrementally* modify all instances of iterations over columns to make use of the dynamic column container and also to address the issues mentioned in the thread : http://nabble.documentfoundation.org/tdf-50916-Calc-Dynamic-column-container-td4162663.html The final step would be to remove the pre-allocation of the container in ScTable constructor and increase of MAXCOLCOUNT Change-Id: I3ff18cdebc99d8348e06a76f287d1d30279366bd Reviewed-on: https://gerrit.libreoffice.org/21620 Reviewed-by: Markus Mohrhard <markus.mohrhard@googlemail.com> Tested-by: Jenkins <ci@libreoffice.org>
-rw-r--r--sc/Library_sc.mk1
-rw-r--r--sc/inc/colcontainer.hxx88
-rw-r--r--sc/inc/edittextiterator.hxx8
-rw-r--r--sc/inc/table.hxx3
-rw-r--r--sc/source/core/data/colcontainer.cxx95
-rw-r--r--sc/source/core/data/documentimport.cxx7
-rw-r--r--sc/source/core/data/edittextiterator.cxx41
-rw-r--r--sc/source/core/data/table1.cxx12
-rw-r--r--sc/source/core/data/table2.cxx8
-rw-r--r--sc/source/core/data/table3.cxx4
10 files changed, 233 insertions, 34 deletions
diff --git a/sc/Library_sc.mk b/sc/Library_sc.mk
index d082a6bd62df..f30bf33ab4bf 100644
--- a/sc/Library_sc.mk
+++ b/sc/Library_sc.mk
@@ -107,6 +107,7 @@ $(eval $(call gb_Library_add_exception_objects,sc,\
sc/source/core/data/cellvalues \
sc/source/core/data/clipcontext \
sc/source/core/data/clipparam \
+ sc/source/core/data/colcontainer \
sc/source/core/data/column \
sc/source/core/data/column2 \
sc/source/core/data/column3 \
diff --git a/sc/inc/colcontainer.hxx b/sc/inc/colcontainer.hxx
new file mode 100644
index 000000000000..2ce35eb8bd9a
--- /dev/null
+++ b/sc/inc/colcontainer.hxx
@@ -0,0 +1,88 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#ifndef INCLUDED_SC_INC_COLCONTAINER_HXX
+#define INCLUDED_SC_INC_COLCONTAINER_HXX
+
+
+#include "types.hxx"
+#include "address.hxx"
+
+#include <vector>
+
+
+class ScColumn;
+class ScDocument;
+class ScColContainer
+{
+public:
+ typedef std::vector<ScColumn*> ScColumnVector;
+private:
+ ScColumnVector aCols;
+ ScDocument* pDocument;
+public:
+ ScColContainer( ScDocument* pDoc );
+ ScColContainer( ScDocument* pDoc, const size_t nSize );
+ ~ScColContainer();
+
+ const ScColumn& operator[] ( const size_t nIndex ) const
+ {
+ return *aCols[nIndex];
+ }
+
+ const ScColumn& operator[] ( SCCOL nIndex ) const
+ {
+ return ( *this )[ static_cast<const size_t>( nIndex ) ];
+ }
+
+ const ScColumn& operator[] ( int nIndex ) const
+ {
+ return ( *this )[ static_cast<const size_t>( nIndex ) ];
+ }
+
+ ScColumn& operator[] ( const size_t nIndex )
+ {
+ return *aCols[nIndex];
+ }
+
+ ScColumn& operator[] ( SCCOL nIndex )
+ {
+ return ( *this )[ static_cast<const size_t>( nIndex ) ];
+ }
+
+ ScColumn& operator[] ( int nIndex )
+ {
+ return ( *this )[ static_cast<const size_t>( nIndex ) ];
+ }
+
+ SCCOL size() const
+ {
+ return static_cast<SCCOL>( aCols.size() );
+ }
+
+ void CreateCol( SCCOL nColIdx, SCTAB nTab );
+ void DeleteLastCols( SCSIZE nCols );
+ bool ColumnExists( SCCOL nColIdx ) const;
+ void Clear();
+};
+
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/inc/edittextiterator.hxx b/sc/inc/edittextiterator.hxx
index f1ec1e982af1..f64b7f4a7eee 100644
--- a/sc/inc/edittextiterator.hxx
+++ b/sc/inc/edittextiterator.hxx
@@ -13,7 +13,6 @@
#include "address.hxx"
#include "mtvelements.hxx"
-class ScColumn;
class ScTable;
class ScDocument;
class EditTextObject;
@@ -29,8 +28,7 @@ namespace sc {
class EditTextIterator
{
const ScTable& mrTable;
- const ScColumn* mpCol;
- const ScColumn* mpColEnd;
+ SCCOL mnCol;
const CellStoreType* mpCells;
CellStoreType::const_position_type maPos;
CellStoreType::const_iterator miEnd;
@@ -46,6 +44,10 @@ class EditTextIterator
*/
void incPos();
void incBlock();
+ /**
+ * Initialize members w.r.t the dynamic column container in the given table.
+ */
+ void init();
public:
EditTextIterator( const ScDocument& rDoc, SCTAB nTab );
diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx
index 0e84a70b6f62..43a4897f6ca3 100644
--- a/sc/inc/table.hxx
+++ b/sc/inc/table.hxx
@@ -26,6 +26,7 @@
#include <tools/color.hxx>
#include <com/sun/star/uno/Sequence.hxx>
#include "column.hxx"
+#include "colcontainer.hxx"
#include "sortparam.hxx"
#include "compressedarray.hxx"
#include "postit.hxx"
@@ -119,7 +120,7 @@ class ScTable : private boost::noncopyable
private:
typedef ::std::vector< ScRange > ScRangeVec;
- ScColumn aCol[MAXCOLCOUNT];
+ ScColContainer aCol;
OUString aName;
OUString aCodeName;
diff --git a/sc/source/core/data/colcontainer.cxx b/sc/source/core/data/colcontainer.cxx
new file mode 100644
index 000000000000..bbe45fc0a9ec
--- /dev/null
+++ b/sc/source/core/data/colcontainer.cxx
@@ -0,0 +1,95 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+
+#include "colcontainer.hxx"
+#include "column.hxx"
+#include "document.hxx"
+
+ScColContainer::ScColContainer( ScDocument* pDoc ):
+ aCols( ScColumnVector() ),
+ pDocument( pDoc )
+{}
+
+ScColContainer::ScColContainer( ScDocument* pDoc, const size_t nSize )
+{
+ pDocument = pDoc;
+ aCols.resize( nSize );
+ for ( size_t nCol = 0; nCol < nSize; ++nCol )
+ aCols[nCol] = new ScColumn;
+}
+
+ScColContainer::~ScColContainer()
+{
+ Clear();
+}
+
+void ScColContainer::CreateCol( SCCOL nColIdx, SCTAB nTab )
+{
+ assert( nColIdx >= 0 );
+ SCCOL nSize = size();
+ if ( nColIdx < nSize )
+ return;
+ else
+ {
+ aCols.resize( nColIdx + 1, nullptr );
+ for ( SCCOL nNewColIdx = nSize; nNewColIdx <= nColIdx; ++nNewColIdx )
+ {
+ aCols[nNewColIdx] = new ScColumn;
+ aCols[nNewColIdx]->Init( nNewColIdx, nTab, pDocument );
+ // TODO: Apply any full row formatting / document formatting
+ }
+ }
+}
+
+void ScColContainer::DeleteLastCols( SCSIZE nCols )
+{
+ SCCOL nSize = size();
+ SCCOL nFirstColToDelete = nSize - nCols;
+ if ( !ColumnExists( nFirstColToDelete ) )
+ return;
+
+ for ( SCCOL nColToDelete = nFirstColToDelete; nColToDelete < nSize; ++nColToDelete )
+ {
+ if ( !pDocument->IsInDtorClear() )
+ aCols[nColToDelete]->FreeNotes();
+ aCols[nColToDelete]->PrepareBroadcastersForDestruction();
+ delete aCols[nColToDelete];
+ aCols.resize( static_cast<size_t>( nFirstColToDelete ) );
+ }
+}
+
+bool ScColContainer::ColumnExists( SCCOL nColIdx ) const
+{
+ if ( nColIdx < 0 || nColIdx >= size() )
+ return false;
+ return true;
+}
+
+void ScColContainer::Clear()
+{
+ SCCOL nSize = size();
+ for ( SCCOL nIdx = 0; nIdx < nSize; ++nIdx )
+ {
+ aCols[nIdx]->PrepareBroadcastersForDestruction();
+ delete aCols[nIdx];
+ }
+ aCols.clear();
+}
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/core/data/documentimport.cxx b/sc/source/core/data/documentimport.cxx
index 14dfef5394b2..49243d88ba0b 100644
--- a/sc/source/core/data/documentimport.cxx
+++ b/sc/source/core/data/documentimport.cxx
@@ -593,10 +593,9 @@ void ScDocumentImport::finalize()
continue;
ScTable& rTab = **itTab;
- ScColumn* pCol = &rTab.aCol[0];
- ScColumn* pColEnd = pCol + static_cast<size_t>(MAXCOLCOUNT);
- for (; pCol != pColEnd; ++pCol)
- initColumn(*pCol);
+ SCCOL nNumCols = rTab.aCol.size();
+ for (SCCOL nColIdx = 0; nColIdx < nNumCols; ++nColIdx)
+ initColumn(rTab.aCol[nColIdx]);
}
}
diff --git a/sc/source/core/data/edittextiterator.cxx b/sc/source/core/data/edittextiterator.cxx
index 778ef2ba4a2d..c689ebc65f6b 100644
--- a/sc/source/core/data/edittextiterator.cxx
+++ b/sc/source/core/data/edittextiterator.cxx
@@ -16,12 +16,26 @@ namespace sc {
EditTextIterator::EditTextIterator( const ScDocument& rDoc, SCTAB nTab ) :
mrTable(*rDoc.maTabs.at(nTab)),
- mpCol(&mrTable.aCol[0]),
- mpColEnd(mpCol + static_cast<size_t>(MAXCOLCOUNT)),
- mpCells(&mpCol->maCells),
- maPos(mpCells->position(0)),
- miEnd(mpCells->end())
+ mnCol(0),
+ mpCells(nullptr),
+ maPos(sc::CellStoreType::const_position_type()),
+ miEnd(maPos.first)
{
+ init();
+}
+
+void EditTextIterator::init()
+{
+ mnCol = 0;
+ if (mnCol >= mrTable.aCol.size())
+ mnCol = -1;
+
+ if (mnCol != -1)
+ {
+ mpCells = &mrTable.aCol[mnCol].maCells;
+ maPos = mpCells->position(0);
+ miEnd = mpCells->end();
+ }
}
const EditTextObject* EditTextIterator::seek()
@@ -32,12 +46,12 @@ const EditTextObject* EditTextIterator::seek()
if (maPos.first == miEnd)
{
// Move to the next column.
- ++mpCol;
- if (mpCol == mpColEnd)
+ ++mnCol;
+ if (mnCol >= mrTable.aCol.size())
// No more columns.
return nullptr;
- mpCells = &mpCol->maCells;
+ mpCells = &mrTable.aCol[mnCol].maCells;
maPos = mpCells->position(0);
miEnd = mpCells->end();
}
@@ -64,16 +78,17 @@ void EditTextIterator::incBlock()
const EditTextObject* EditTextIterator::first()
{
- mpCol = &mrTable.aCol[0];
- mpColEnd = mpCol + static_cast<size_t>(MAXCOLCOUNT);
- mpCells = &mpCol->maCells;
- maPos = mpCells->position(0);
- miEnd = mpCells->end();
+ init();
+ if (mnCol == -1)
+ return nullptr;
return seek();
}
const EditTextObject* EditTextIterator::next()
{
+ if (mnCol == -1)
+ return nullptr;
+
if (maPos.first == miEnd)
return nullptr;
diff --git a/sc/source/core/data/table1.cxx b/sc/source/core/data/table1.cxx
index 2bc27053d964..355d6d0aa335 100644
--- a/sc/source/core/data/table1.cxx
+++ b/sc/source/core/data/table1.cxx
@@ -81,7 +81,7 @@ ScProgress* GetProgressBar(
}
void GetOptimalHeightsInColumn(
- sc::RowHeightContext& rCxt, ScColumn* pCol, SCROW nStartRow, SCROW nEndRow,
+ sc::RowHeightContext& rCxt, ScColContainer& rCol, SCROW nStartRow, SCROW nEndRow,
ScProgress* pProgress, sal_uInt32 nProgressStart )
{
assert(nStartRow <= nEndRow);
@@ -94,7 +94,7 @@ void GetOptimalHeightsInColumn(
std::vector<sal_uInt16>& rHeights = rCxt.getHeightArray();
- pCol[MAXCOL].GetOptimalHeight(rCxt, nStartRow, nEndRow, 0, 0);
+ rCol[MAXCOL].GetOptimalHeight(rCxt, nStartRow, nEndRow, 0, 0);
// from there search for the standard height that is in use in the lower part
@@ -107,11 +107,11 @@ void GetOptimalHeightsInColumn(
sal_uLong nWeightedCount = 0;
for (SCCOL nCol=0; nCol<MAXCOL; nCol++) // MAXCOL already above
{
- pCol[nCol].GetOptimalHeight(rCxt, nStartRow, nEndRow, nMinHeight, nMinStart);
+ rCol[nCol].GetOptimalHeight(rCxt, nStartRow, nEndRow, nMinHeight, nMinStart);
if (pProgress)
{
- sal_uLong nWeight = pCol[nCol].GetWeightedCount();
+ sal_uLong nWeight = rCol[nCol].GetWeightedCount();
if (nWeight) // does not have to be the same Status
{
nWeightedCount += nWeight;
@@ -227,6 +227,7 @@ bool SetOptimalHeightsToRows(
ScTable::ScTable( ScDocument* pDoc, SCTAB nNewTab, const OUString& rNewName,
bool bColInfo, bool bRowInfo ) :
+ aCol( pDoc, MAXCOLCOUNT ),
aName( rNewName ),
aCodeName( rNewName ),
nLinkRefreshDelay( 0 ),
@@ -349,9 +350,6 @@ ScTable::~ScTable()
delete mpRangeName;
delete pDBDataNoName;
DestroySortCollator();
-
- for (SCCOL k=0; k<=MAXCOL; k++)
- aCol[k].PrepareBroadcastersForDestruction();
}
void ScTable::GetName( OUString& rName ) const
diff --git a/sc/source/core/data/table2.cxx b/sc/source/core/data/table2.cxx
index 11c0d58c7bd9..a47cb9b55ed2 100644
--- a/sc/source/core/data/table2.cxx
+++ b/sc/source/core/data/table2.cxx
@@ -67,16 +67,16 @@ namespace {
class ColumnRegroupFormulaCells
{
- ScColumn* mpCols;
+ ScColContainer& mrCols;
std::vector<ScAddress>* mpGroupPos;
public:
- ColumnRegroupFormulaCells( ScColumn* pCols, std::vector<ScAddress>* pGroupPos ) :
- mpCols(pCols), mpGroupPos(pGroupPos) {}
+ ColumnRegroupFormulaCells( ScColContainer& rCols, std::vector<ScAddress>* pGroupPos ) :
+ mrCols(rCols), mpGroupPos(pGroupPos) {}
void operator() (SCCOL nCol)
{
- mpCols[nCol].RegroupFormulaCells(mpGroupPos);
+ mrCols[nCol].RegroupFormulaCells(mpGroupPos);
}
};
diff --git a/sc/source/core/data/table3.cxx b/sc/source/core/data/table3.cxx
index 27139922c40b..828f0a84a1fa 100644
--- a/sc/source/core/data/table3.cxx
+++ b/sc/source/core/data/table3.cxx
@@ -414,7 +414,7 @@ public:
namespace {
void initDataRows(
- ScSortInfoArray& rArray, ScTable& rTab, ScColumn* pCols,
+ ScSortInfoArray& rArray, ScTable& rTab, ScColContainer& rCols,
SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2,
bool bPattern, bool bHiddenFiltered )
{
@@ -423,7 +423,7 @@ void initDataRows(
for (SCCOL nCol = nCol1; nCol <= nCol2; ++nCol)
{
- ScColumn& rCol = pCols[nCol];
+ ScColumn& rCol = rCols[nCol];
// Skip reordering of cell formats if the whole span is on the same pattern entry.
bool bUniformPattern = rCol.GetPatternCount(nRow1, nRow2) < 2u;