summaryrefslogtreecommitdiff
path: root/src/editor.cc
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2012-12-13 18:45:32 +0100
committerMaxime Coste <frrrwww@gmail.com>2012-12-13 18:50:27 +0100
commit8e170e4385e51d06a9b6083ded0880e56146f9a3 (patch)
tree206b48505ec51b81eecb714593c648cf319b65f7 /src/editor.cc
parent3aee1c37fb7345da33d0ed84e7f4b8b83de7dab2 (diff)
optimize merge_overlappings
assume selections are sorted, so we have a linear complexity algorithm instead of O(n²).
Diffstat (limited to 'src/editor.cc')
-rw-r--r--src/editor.cc18
1 files changed, 9 insertions, 9 deletions
diff --git a/src/editor.cc b/src/editor.cc
index d41ffe5f..02baf5f5 100644
--- a/src/editor.cc
+++ b/src/editor.cc
@@ -121,18 +121,18 @@ std::vector<String> Editor::selections_content() const
static void merge_overlapping(SelectionList& selections)
{
- for (size_t i = 0; i < selections.size(); ++i)
+ assert(std::is_sorted(selections.begin(), selections.end(),
+ [](const Selection& lhs, const Selection& rhs)
+ { return lhs.begin() < rhs.begin(); }));
+ for (size_t i = 0; i < selections.size()-1;)
{
- for (size_t j = i+1; j < selections.size();)
+ if (overlaps(selections[i], selections[i+1]))
{
- if (overlaps(selections[i], selections[j]))
- {
- selections[i].merge_with(selections[j]);
- selections.erase(selections.begin() + j);
- }
- else
- ++j;
+ selections[i].merge_with(selections[i+1]);
+ selections.erase(selections.begin() + i + 1);
}
+ else
+ ++i;
}
}