sc/source/core/data/column2.cxx | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-)
New commits: commit 675e9f4f402086cdd16730865fcea8eeed739a64 Author: Kohei Yoshida <kohei.yosh...@gmail.com> Date: Wed May 15 12:55:02 2013 -0400 Avoid expensive element position lookup twice. This moderately improves the performance of pasting a large array of formula cells. Change-Id: I27a59ff348cb715df15db80693cb7d193e67ec2e diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx index 1df0d9d..400488b 100644 --- a/sc/source/core/data/column2.cxx +++ b/sc/source/core/data/column2.cxx @@ -1864,13 +1864,37 @@ void ScColumn::FindUsed( SCROW nStartRow, SCROW nEndRow, bool* pUsed ) const void ScColumn::StartListening( SvtListener& rLst, SCROW nRow ) { - SvtBroadcaster* pBC = GetBroadcaster(nRow); - if (!pBC) + std::pair<BCStoreType::iterator,size_t> aPos = maBroadcasters.position(nRow); + BCStoreType::iterator it = aPos.first; // block position. + size_t nElemPos = aPos.second; // element position within the block. + switch (it->type) { - pBC = new SvtBroadcaster; - maBroadcasters.set(nRow, pBC); + case sc::element_type_broadcaster: + { + // Broadcaster already exists here. + sc::custom_broadcaster_block::iterator itData = sc::custom_broadcaster_block::begin(*it->data); + std::advance(itData, nElemPos); + SvtBroadcaster* pBC = *itData; + rLst.StartListening(*pBC); + } + break; + case mdds::mtv::element_type_empty: + { + // No broadcaster exists at this position yet. + SvtBroadcaster* pBC = new SvtBroadcaster; + rLst.StartListening(*pBC); + maBroadcasters.set(it, nRow, pBC); + } + break; + default: +#if DEBUG_COLUMN_STORAGE + cout << "ScColumn::StartListening: wrong block type encountered in the broadcaster storage." << endl; + cout.flush(); + abort(); +#else + ; +#endif } - rLst.StartListening(*pBC); } void ScColumn::MoveListeners( SvtBroadcaster& rSource, SCROW nDestRow ) _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits