[Libreoffice-commits] .: 2 commits - sc/inc sc/source
Kohei Yoshida
kohei at kemper.freedesktop.org
Fri Mar 9 12:56:33 PST 2012
sc/inc/dpcache.hxx | 6 +++---
sc/source/core/data/dpcache.cxx | 29 ++++++++++++-----------------
2 files changed, 15 insertions(+), 20 deletions(-)
New commits:
commit 3a28389d6713bf29e1da2fea07b663fdd9cc3faa
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date: Fri Mar 9 15:56:30 2012 -0500
Use flat_segment_tree to store the empty row flags.
diff --git a/sc/inc/dpcache.hxx b/sc/inc/dpcache.hxx
index 31d5103..2880c5a 100644
--- a/sc/inc/dpcache.hxx
+++ b/sc/inc/dpcache.hxx
@@ -41,6 +41,7 @@
#include <boost/noncopyable.hpp>
#include <boost/scoped_ptr.hpp>
#include <boost/ptr_container/ptr_vector.hpp>
+#include <mdds/flat_segment_tree.hpp>
#include <vector>
@@ -119,7 +120,7 @@ private:
GroupFieldsType maGroupFields;
LabelsType maLabelNames; // Stores dimension names.
- std::vector<bool> maEmptyRows; // Keeps track of empty rows.
+ mdds::flat_segment_tree<SCROW, bool> maEmptyRows;
bool mbDisposing;
@@ -150,7 +151,7 @@ public:
SCROW GetRowCount() const;
SCROW GetItemDataId( sal_uInt16 nDim, SCROW nRow, bool bRepeatIfEmpty ) const;
rtl::OUString GetDimensionName(LabelsType::size_type nDim) const;
- bool IsRowEmpty( SCROW nRow ) const;
+ bool IsRowEmpty(SCROW nRow) const;
bool ValidQuery(SCROW nRow, const ScQueryParam& rQueryParam) const;
ScDocument* GetDoc() const;
diff --git a/sc/source/core/data/dpcache.cxx b/sc/source/core/data/dpcache.cxx
index 9ae41a4..73e1819 100644
--- a/sc/source/core/data/dpcache.cxx
+++ b/sc/source/core/data/dpcache.cxx
@@ -228,6 +228,7 @@ ScDPCache::Field::Field() {}
ScDPCache::ScDPCache(ScDocument* pDoc) :
mpDoc( pDoc ),
mnColumnCount ( 0 ),
+ maEmptyRows(0, MAXROW, true),
mbDisposing(false)
{
}
@@ -341,6 +342,9 @@ bool ScDPCache::InitFromDoc(ScDocument* pDoc, const ScRange& rRange)
maLabelNames.reserve(mnColumnCount+1);
+ // Set all rows non-empty first, then only tag empty ones in AddData().
+ maEmptyRows.insert_front(nStartRow, nEndRow+1, false);
+
for (sal_uInt16 nCol = nStartCol; nCol <= nEndCol; ++nCol)
{
AddLabel(createLabelString(pDoc, nCol, nStartRow, nDocTab));
@@ -352,6 +356,7 @@ bool ScDPCache::InitFromDoc(ScDocument* pDoc, const ScRange& rRange)
AddData(nCol - nStartCol, pData.release(), nNumFormat);
}
}
+ maEmptyRows.build_tree();
return true;
}
@@ -409,6 +414,7 @@ bool ScDPCache::InitFromDataBase (const Reference<sdbc::XRowSet>& xRowSet, const
xRowSet->beforeFirst();
+ maEmptyRows.build_tree();
return true;
}
catch (const Exception&)
@@ -610,9 +616,11 @@ bool ScDPCache::ValidQuery( SCROW nRow, const ScQueryParam &rParam) const
return bRet;
}
-bool ScDPCache::IsRowEmpty( SCROW nRow ) const
+bool ScDPCache::IsRowEmpty(SCROW nRow) const
{
- return maEmptyRows[nRow];
+ bool bEmpty = true;
+ maEmptyRows.search_tree(nRow, bEmpty);
+ return bEmpty;
}
bool ScDPCache::AddData(long nDim, ScDPItemData* pData, sal_uLong nNumFormat)
@@ -639,14 +647,10 @@ bool ScDPCache::AddData(long nDim, ScDPItemData* pData, sal_uLong nNumFormat)
else
rField.maData.push_back(rField.maGlobalOrder[nIndex]);
-//init empty row tag
size_t nCurRow = maFields[nDim].maData.size() - 1;
- while (maEmptyRows.size() <= nCurRow)
- maEmptyRows.push_back(true);
-
- if (!pData->IsEmpty())
- maEmptyRows[nCurRow] = false;
+ if (pData->IsEmpty())
+ maEmptyRows.insert_back(nCurRow, nCurRow+1, true);
return true;
}
commit 2877147c477f064c213af53a8f250ce96ad1e5f2
Author: Kohei Yoshida <kohei.yoshida at gmail.com>
Date: Fri Mar 9 15:13:36 2012 -0500
IsValid() is superfluous.
diff --git a/sc/inc/dpcache.hxx b/sc/inc/dpcache.hxx
index 661c5cd..31d5103 100644
--- a/sc/inc/dpcache.hxx
+++ b/sc/inc/dpcache.hxx
@@ -151,7 +151,6 @@ public:
SCROW GetItemDataId( sal_uInt16 nDim, SCROW nRow, bool bRepeatIfEmpty ) const;
rtl::OUString GetDimensionName(LabelsType::size_type nDim) const;
bool IsRowEmpty( SCROW nRow ) const;
- bool IsValid() const;
bool ValidQuery(SCROW nRow, const ScQueryParam& rQueryParam) const;
ScDocument* GetDoc() const;
diff --git a/sc/source/core/data/dpcache.cxx b/sc/source/core/data/dpcache.cxx
index 33a0a25..9ae41a4 100644
--- a/sc/source/core/data/dpcache.cxx
+++ b/sc/source/core/data/dpcache.cxx
@@ -252,11 +252,6 @@ ScDPCache::~ScDPCache()
std::for_each(maRefObjects.begin(), maRefObjects.end(), ClearObjectSource());
}
-bool ScDPCache::IsValid() const
-{
- return !maFields.empty() && mnColumnCount > 0;
-}
-
namespace {
/**
@@ -622,7 +617,6 @@ bool ScDPCache::IsRowEmpty( SCROW nRow ) const
bool ScDPCache::AddData(long nDim, ScDPItemData* pData, sal_uLong nNumFormat)
{
- OSL_ENSURE( IsValid(), " IsValid() == false " );
OSL_ENSURE( nDim < mnColumnCount && nDim >=0 , "dimension out of bound" );
// Wrap this instance with scoped pointer to ensure proper deletion.
@@ -713,7 +707,6 @@ void ScDPCache::Clear()
void ScDPCache::AddLabel(const rtl::OUString& rLabel)
{
- OSL_ENSURE( IsValid(), " IsValid() == false " );
if ( maLabelNames.empty() )
maLabelNames.push_back(ScGlobal::GetRscString(STR_PIVOT_DATA));
@@ -741,7 +734,6 @@ void ScDPCache::AddLabel(const rtl::OUString& rLabel)
SCROW ScDPCache::GetItemDataId(sal_uInt16 nDim, SCROW nRow, bool bRepeatIfEmpty) const
{
- OSL_ENSURE( IsValid(), " IsValid() == false " );
OSL_ENSURE(nDim < mnColumnCount, "ScDPTableDataCache::GetItemDataId ");
const Field& rField = maFields[nDim];
@@ -1086,7 +1078,6 @@ void ScDPCache::ClearGroupFields()
SCROW ScDPCache::GetOrder(long nDim, SCROW nIndex) const
{
- OSL_ENSURE( IsValid(), " IsValid() == false " );
OSL_ENSURE( nDim >=0 && nDim < mnColumnCount, "ScDPTableDataCache::GetOrder : out of bound" );
const Field& rField = maFields[nDim];
More information about the Libreoffice-commits
mailing list