Skip to content

Commit 15420f2

Browse files
committedMar 26, 2021
Much faster QgsTemporalRange::mergeRanges
1 parent c262794 commit 15420f2

File tree

1 file changed

+20
-22
lines changed

1 file changed

+20
-22
lines changed
 

‎src/core/qgsrange.h

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -616,32 +616,30 @@ class QgsTemporalRange
616616
*/
617617
static QList< QgsTemporalRange<T> > mergeRanges( const QList< QgsTemporalRange<T> > &ranges )
618618
{
619-
QList< QgsTemporalRange<T > > res;
620-
621-
QList< QgsTemporalRange<T> > queue = ranges;
622-
while ( !queue.empty() )
619+
if ( ranges.empty() )
620+
return {};
621+
622+
QList< QgsTemporalRange<T > > sortedRanges = ranges;
623+
std::sort( sortedRanges.begin(), sortedRanges.end(), []( const QgsTemporalRange< T > &a, const QgsTemporalRange< T > &b ) -> bool { return a.begin() < b.begin(); } );
624+
QList< QgsTemporalRange<T>> res;
625+
res.reserve( sortedRanges.size() );
626+
627+
QgsTemporalRange<T> prevRange;
628+
auto it = sortedRanges.constBegin();
629+
prevRange = *it++;
630+
for ( ; it != sortedRanges.constEnd(); ++it )
623631
{
624-
QgsTemporalRange<T> range = queue.back();
625-
queue.pop_back();
626-
627-
bool extended = false;
628-
for ( int i = 0; i < res.count(); ++i )
632+
if ( prevRange.overlaps( *it ) )
629633
{
630-
if ( res[i].overlaps( range ) )
631-
{
632-
QgsTemporalRange< T > other = res.takeAt( i );
633-
other.extend( range );
634-
queue.push_back( other );
635-
extended = true;
636-
break;
637-
}
634+
prevRange.extend( *it );
635+
}
636+
else
637+
{
638+
res << prevRange;
639+
prevRange = *it;
638640
}
639-
640-
if ( !extended )
641-
res.push_back( range );
642641
}
643-
644-
std::sort( res.begin(), res.end(), []( const QgsTemporalRange< T > &a, const QgsTemporalRange< T > &b ) -> bool { return a.begin() < b.begin(); } );
642+
res << prevRange;
645643
return res;
646644
}
647645
#endif

0 commit comments

Comments
 (0)
Please sign in to comment.