summaryrefslogtreecommitdiff
path: root/sc/source/core/data
diff options
context:
space:
mode:
authorKohei Yoshida <kohei.yoshida@collabora.com>2014-02-04 21:51:57 -0500
committerKohei Yoshida <kohei.yoshida@collabora.com>2014-02-05 00:29:19 -0500
commitfc16069d1a8db45b7ecaa01c3ee1af0e904062c2 (patch)
treee87356f68b73003c8f849470e3e3aabce7846385 /sc/source/core/data
parentb8a863a219ae3efaa050e5f213d5ae3a91459c06 (diff)
Reimplement ScMarkData::GetMarkedRowSpans() to use flat_segment_tree directly.
Change-Id: I90a1d4b3ae2e6aff9a7926b5842bc85ac172683d
Diffstat (limited to 'sc/source/core/data')
-rw-r--r--sc/source/core/data/columnspanset.cxx20
-rw-r--r--sc/source/core/data/markdata.cxx27
2 files changed, 19 insertions, 28 deletions
diff --git a/sc/source/core/data/columnspanset.cxx b/sc/source/core/data/columnspanset.cxx
index efa51b5a2707..1aa57ba11c94 100644
--- a/sc/source/core/data/columnspanset.cxx
+++ b/sc/source/core/data/columnspanset.cxx
@@ -15,6 +15,7 @@
#include "mtvfunctions.hxx"
#include "markdata.hxx"
#include "rangelst.hxx"
+#include <fstalgorithm.hxx>
#include <algorithm>
@@ -22,6 +23,8 @@ namespace sc {
RowSpan::RowSpan(SCROW nRow1, SCROW nRow2) : mnRow1(nRow1), mnRow2(nRow2) {}
+ColRowSpan::ColRowSpan(SCCOLROW nStart, SCCOLROW nEnd) : mnStart(nStart), mnEnd(nEnd) {}
+
ColumnSpanSet::ColumnType::ColumnType(SCROW nStart, SCROW nEnd, bool bInit) :
maSpans(nStart, nEnd+1, bInit), miPos(maSpans.begin()) {}
@@ -262,22 +265,7 @@ void SingleColumnSpanSet::getRows(std::vector<SCROW> &rRows) const
void SingleColumnSpanSet::getSpans(SpansType& rSpans) const
{
- SpansType aSpans;
- ColumnSpansType::const_iterator it = maSpans.begin(), itEnd = maSpans.end();
- SCROW nLastRow = it->first;
- bool bLastVal = it->second;
- for (++it; it != itEnd; ++it)
- {
- SCROW nThisRow = it->first;
- bool bThisVal = it->second;
-
- if (bLastVal)
- aSpans.push_back(RowSpan(nLastRow, nThisRow-1));
-
- nLastRow = nThisRow;
- bLastVal = bThisVal;
- }
-
+ SpansType aSpans = toSpanArray<SCROW,RowSpan>(maSpans);
rSpans.swap(aSpans);
}
diff --git a/sc/source/core/data/markdata.cxx b/sc/source/core/data/markdata.cxx
index 556df504ca3a..37693777a8c1 100644
--- a/sc/source/core/data/markdata.cxx
+++ b/sc/source/core/data/markdata.cxx
@@ -21,6 +21,9 @@
#include "markarr.hxx"
#include "rangelst.hxx"
#include <columnspanset.hxx>
+#include <fstalgorithm.hxx>
+
+#include <mdds/flat_segment_tree.hpp>
// STATIC DATA -----------------------------------------------------------
@@ -548,24 +551,24 @@ SCCOLROW ScMarkData::GetMarkRowRanges( SCCOLROW* pRanges )
return nRangeCnt;
}
-void ScMarkData::GetMarkedRowSpans( SCTAB nTab, std::vector<sc::RowSpan>& rSpans )
+std::vector<sc::ColRowSpan> ScMarkData::GetMarkedRowSpans( SCTAB nTab ) const
{
- std::vector<sc::RowSpan> aSpans;
+ typedef mdds::flat_segment_tree<SCCOLROW, bool> SpansType;
- if (bMarked)
- MarkToMulti();
+ ScRangeList aRanges = GetMarkedRanges();
+ SpansType aSpans(0, MAXROW+1, false);
+ SpansType::const_iterator itPos = aSpans.begin();
- if (!bMultiMarked)
+ for (size_t i = 0, n = aRanges.size(); i < n; ++i)
{
- rSpans.swap(aSpans);
- return;
- }
+ const ScRange& r = *aRanges[i];
+ if (r.aStart.Tab() != nTab)
+ continue;
- sc::SingleColumnSpanSet aMarkedRows;
- for (SCCOL nCol = aMultiRange.aStart.Col(); nCol <= aMultiRange.aEnd.Col(); ++nCol)
- aMarkedRows.scan(*this, nTab, nCol);
+ itPos = aSpans.insert(itPos, r.aStart.Row(), r.aEnd.Row()+1, true).first;
+ }
- aMarkedRows.getSpans(rSpans);
+ return sc::toSpanArray<SCCOLROW,sc::ColRowSpan>(aSpans);
}
bool ScMarkData::IsAllMarked( const ScRange& rRange ) const