diff options
author | Kohei Yoshida <kohei.yoshida@collabora.com> | 2014-02-04 21:51:57 -0500 |
---|---|---|
committer | Kohei Yoshida <kohei.yoshida@collabora.com> | 2014-02-05 00:29:19 -0500 |
commit | fc16069d1a8db45b7ecaa01c3ee1af0e904062c2 (patch) | |
tree | e87356f68b73003c8f849470e3e3aabce7846385 /sc/source/core/data | |
parent | b8a863a219ae3efaa050e5f213d5ae3a91459c06 (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.cxx | 20 | ||||
-rw-r--r-- | sc/source/core/data/markdata.cxx | 27 |
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 |