From fc16069d1a8db45b7ecaa01c3ee1af0e904062c2 Mon Sep 17 00:00:00 2001 From: Kohei Yoshida Date: Tue, 4 Feb 2014 21:51:57 -0500 Subject: Reimplement ScMarkData::GetMarkedRowSpans() to use flat_segment_tree directly. Change-Id: I90a1d4b3ae2e6aff9a7926b5842bc85ac172683d --- sc/source/core/data/columnspanset.cxx | 20 ++++---------------- sc/source/core/data/markdata.cxx | 27 +++++++++++++++------------ 2 files changed, 19 insertions(+), 28 deletions(-) (limited to 'sc/source/core') 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 #include @@ -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 &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(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 +#include + +#include // STATIC DATA ----------------------------------------------------------- @@ -548,24 +551,24 @@ SCCOLROW ScMarkData::GetMarkRowRanges( SCCOLROW* pRanges ) return nRangeCnt; } -void ScMarkData::GetMarkedRowSpans( SCTAB nTab, std::vector& rSpans ) +std::vector ScMarkData::GetMarkedRowSpans( SCTAB nTab ) const { - std::vector aSpans; + typedef mdds::flat_segment_tree 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(aSpans); } bool ScMarkData::IsAllMarked( const ScRange& rRange ) const -- cgit v1.2.3