diff options
author | Luboš Luňák <l.lunak@collabora.com> | 2018-05-24 14:38:59 +0200 |
---|---|---|
committer | Michael Meeks <michael.meeks@collabora.com> | 2018-05-24 17:55:22 +0200 |
commit | 3a801799536e6870f2fb111b1cc00b9575a35a39 (patch) | |
tree | 19ef4e0194b4f3db90767bde3fe30d8d7ba98c3f | |
parent | 8f7eb6edfa5cc561d52060f44128d4c0e5d439bf (diff) |
optimize ScColumn::HandleRefArrayForParallelism()libreoffice-6-1-branch-point
Change-Id: I53b7f514be2e015445eb9cb0471c22d41c464e4e
Reviewed-on: https://gerrit.libreoffice.org/54767
Reviewed-by: Michael Meeks <michael.meeks@collabora.com>
Tested-by: Michael Meeks <michael.meeks@collabora.com>
-rw-r--r-- | sc/source/core/data/column2.cxx | 37 |
1 files changed, 30 insertions, 7 deletions
diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx index 0a62cb10506d..79654808a14f 100644 --- a/sc/source/core/data/column2.cxx +++ b/sc/source/core/data/column2.cxx @@ -2818,14 +2818,37 @@ bool ScColumn::HandleRefArrayForParallelism( SCROW nRow1, SCROW nRow2 ) if (nRow1 > nRow2) return false; - for (auto i = nRow1; i <= nRow2; ++i) + std::pair<sc::CellStoreType::const_iterator,size_t> aPos = maCells.position(nRow1); + sc::CellStoreType::const_iterator it = aPos.first; + size_t nOffset = aPos.second; + SCROW nRow = nRow1; + for (;it != maCells.end() && nRow <= nRow2; ++it, nOffset = 0) { - auto aCell = GetCellValue(i); - if (aCell.meType == CELLTYPE_FORMULA) - aCell.mpFormula->MaybeInterpret(); - // These require EditEngine (in ScEditUtils::GetString()), which is probably too complex for use in threads. - if (aCell.meType == CELLTYPE_EDIT) - return false; + switch( it->type ) + { + case sc::element_type_edittext: + // These require EditEngine (in ScEditUtils::GetString()), which is probably + // too complex for use in threads. + return false; + case sc::element_type_formula: + { + size_t nRowsToRead = nRow2 - nRow + 1; + size_t nEnd = std::min(it->size, nOffset+nRowsToRead); // last row + 1 + sc::formula_block::const_iterator itCell = sc::formula_block::begin(*it->data); + std::advance(itCell, nOffset); + for (size_t i = nOffset; i < nEnd; ++itCell, ++i) + { + // Loop inside the formula block. + (*itCell)->MaybeInterpret(); + } + nRow += nEnd; + break; + } + default: + // Skip this block. + nRow += it->size - nOffset; + continue; + } } return true; |