summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2013-04-03 19:22:12 +0200
committerMaxime Coste <frrrwww@gmail.com>2013-04-04 14:04:37 +0200
commit1fd99e7e88c48d503a07b8a53580622467ae407f (patch)
tree878121c0581af6ea4879c01f22a559480ab0bbfc /src
parent4fbe2dc6bc2522e79558fcb1af19d0cad947ea83 (diff)
do not check buffer invariant in do_{erase,insert} as this cause O(n²) behaviour
Diffstat (limited to 'src')
-rw-r--r--src/buffer.cc4
-rw-r--r--src/buffer.hh4
-rw-r--r--src/editor.cc5
-rw-r--r--src/editor.hh1
4 files changed, 5 insertions, 9 deletions
diff --git a/src/buffer.cc b/src/buffer.cc
index c8ad73c0..cce72005 100644
--- a/src/buffer.cc
+++ b/src/buffer.cc
@@ -321,8 +321,6 @@ void Buffer::do_insert(const BufferIterator& pos, const String& content)
end_it = BufferIterator{*this, { last_line, m_lines[last_line].length() - suffix.length() }};
}
- check_invariant();
-
for (auto listener : m_change_listeners)
listener->on_insert(begin_it, end_it);
}
@@ -348,8 +346,6 @@ void Buffer::do_erase(const BufferIterator& begin, const BufferIterator& end)
for (LineCount i = begin.line()+1; i < line_count(); ++i)
m_lines[i].start -= length;
- check_invariant();
-
for (auto listener : m_change_listeners)
listener->on_erase(begin, end);
}
diff --git a/src/buffer.hh b/src/buffer.hh
index 9879bec7..e01919ee 100644
--- a/src/buffer.hh
+++ b/src/buffer.hh
@@ -168,10 +168,10 @@ public:
const HookManager& hooks() const { return m_hooks; }
std::unordered_set<BufferChangeListener*>& change_listeners() const { return m_change_listeners; }
-private:
- friend class BufferIterator;
void check_invariant() const;
+private:
+ friend class BufferIterator;
struct Line
{
diff --git a/src/editor.cc b/src/editor.cc
index ef2d0a9b..6b058f3a 100644
--- a/src/editor.cc
+++ b/src/editor.cc
@@ -88,10 +88,10 @@ void Editor::insert(const String& str, InsertMode mode)
{
sel.first() = pos;
sel.last() = str.empty() ? pos : utf8::character_start(pos + str.length() - 1);
- sel.check_invariant();
}
sel.avoid_eol();
}
+ check_invariant();
}
void Editor::insert(const memoryview<String>& strings, InsertMode mode)
@@ -110,10 +110,10 @@ void Editor::insert(const memoryview<String>& strings, InsertMode mode)
{
sel.first() = pos;
sel.last() = str.empty() ? pos : utf8::character_start(pos + str.length() - 1);
- sel.check_invariant();
}
sel.avoid_eol();
}
+ check_invariant();
}
std::vector<String> Editor::selections_content() const
@@ -408,6 +408,7 @@ void Editor::check_invariant() const
assert(not m_selections.empty());
assert(m_main_sel < m_selections.size());
m_selections.check_invariant();
+ buffer().check_invariant();
assert(std::is_sorted(m_selections.begin(), m_selections.end(), compare_selections));
#endif
}
diff --git a/src/editor.hh b/src/editor.hh
index 1a99ceed..402f2c9c 100644
--- a/src/editor.hh
+++ b/src/editor.hh
@@ -87,7 +87,6 @@ public:
size_t cursor_pos = String::npos);
bool is_editing() const { return m_edition_level!= 0; }
-
private:
friend struct scoped_edition;
void begin_edition();