From 726e2f02d14833bde2f7eef9677f5564c485a992 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lubo=C5=A1=20Lu=C5=88=C3=A1k?= Date: Fri, 17 May 2019 13:55:20 +0200 Subject: [PATCH] use position hint also when it is past the actual position The m_blocks data structure is a vector. It means that it can be also walked back, instead of resetting and starting from the very start. Allows a noticeable performance improvement in https://gerrit.libreoffice.org/#/c/72424/ . --- include/mdds/multi_type_vector_def.inl | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/include/mdds/multi_type_vector_def.inl b/include/mdds/multi_type_vector_def.inl index 22a0ee2..09894e6 100644 --- include/mdds/multi_type_vector_def.inl +++ include/mdds/multi_type_vector_def.inl @@ -861,7 +861,26 @@ void multi_type_vector<_CellBlockFunc, _EventFunc>::get_block_position( if (pos < start_row) { - // Position hint is past the insertion position. Reset. + // Position hint is past the insertion position. + // Walk back if that seems efficient. + if (pos > start_row / 2) + { + for (size_type i = block_index; i > 0;) + { + --i; + const block& blk = m_blocks[i]; + start_row -= blk.m_size; + if (pos >= start_row) + { + // Row is in this block. + block_index = i; + return; + } + // Specified row is not in this block. + } + assert(start_row == 0); + } + // Otherwise reset. start_row = 0; block_index = 0; } -- 2.16.4