Editor: store a safe_ptr to buffer instead of reference

This commit is contained in:
Maxime Coste 2012-11-04 23:39:25 +01:00
parent ea17525b2a
commit 42315c4b5c
2 changed files with 18 additions and 18 deletions

View File

@ -13,7 +13,7 @@ namespace Kakoune
{
Editor::Editor(Buffer& buffer)
: m_buffer(buffer),
: m_buffer(&buffer),
m_edition_level(0)
{
m_selections.push_back(Selection(buffer.begin(), buffer.begin()));
@ -24,7 +24,7 @@ void Editor::erase()
scoped_edition edition(*this);
for (auto& sel : m_selections)
{
m_buffer.erase(sel.begin(), sel.end());
m_buffer->erase(sel.begin(), sel.end());
sel.selection.avoid_eol();
}
}
@ -68,8 +68,8 @@ void Editor::insert(const String& string, InsertMode mode)
for (auto& sel : m_selections)
{
BufferIterator pos = prepare_insert(m_buffer, sel.selection, mode);
m_buffer.insert(pos, string);
BufferIterator pos = prepare_insert(*m_buffer, sel.selection, mode);
m_buffer->insert(pos, string);
}
}
@ -84,9 +84,9 @@ void Editor::insert(const memoryview<String>& strings, InsertMode mode)
for (size_t i = 0; i < selections().size(); ++i)
{
BufferIterator pos = prepare_insert(m_buffer, m_selections[i].selection, mode);
BufferIterator pos = prepare_insert(*m_buffer, m_selections[i].selection, mode);
size_t index = std::min(i, strings.size()-1);
m_buffer.insert(pos, strings[index]);
m_buffer->insert(pos, strings[index]);
}
}
@ -94,7 +94,7 @@ std::vector<String> Editor::selections_content() const
{
std::vector<String> contents;
for (auto& sel : m_selections)
contents.push_back(m_buffer.string(sel.begin(),
contents.push_back(m_buffer->string(sel.begin(),
sel.end()));
return contents;
}
@ -142,9 +142,9 @@ void Editor::move_selections(LineCount offset, SelectMode mode)
assert(mode == SelectMode::Replace or mode == SelectMode::Extend);
for (auto& sel : m_selections)
{
BufferCoord pos = m_buffer.line_and_column_at(sel.last());
BufferCoord pos = m_buffer->line_and_column_at(sel.last());
pos.line += offset;
BufferIterator last = utf8::finish(m_buffer.iterator_at(pos, true));
BufferIterator last = utf8::finish(m_buffer->iterator_at(pos, true));
sel.selection = Selection(mode == SelectMode::Extend ? sel.first() : last, last);
}
merge_overlapping(m_selections);
@ -290,7 +290,7 @@ private:
bool Editor::undo()
{
LastModifiedRangeListener listener(buffer());
bool res = m_buffer.undo();
bool res = m_buffer->undo();
if (res)
{
m_selections.clear();
@ -303,7 +303,7 @@ bool Editor::undo()
bool Editor::redo()
{
LastModifiedRangeListener listener(buffer());
bool res = m_buffer.redo();
bool res = m_buffer->redo();
if (res)
{
m_selections.clear();
@ -323,14 +323,14 @@ void Editor::begin_edition()
++m_edition_level;
if (m_edition_level == 1)
m_buffer.begin_undo_group();
m_buffer->begin_undo_group();
}
void Editor::end_edition()
{
assert(m_edition_level > 0);
if (m_edition_level == 1)
m_buffer.end_undo_group();
m_buffer->end_undo_group();
--m_edition_level;
}
@ -341,7 +341,7 @@ IncrementalInserter::IncrementalInserter(Editor& editor, InsertMode mode)
: m_editor(editor), m_edition(editor), m_mode(mode)
{
m_editor.on_incremental_insertion_begin();
Buffer& buffer = editor.m_buffer;
Buffer& buffer = *editor.m_buffer;
if (mode == InsertMode::Replace)
{
@ -443,8 +443,8 @@ void IncrementalInserter::move_cursors(const BufferCoord& offset)
{
for (auto& sel : m_editor.m_selections)
{
BufferCoord pos = m_editor.m_buffer.line_and_column_at(sel.last());
BufferIterator it = m_editor.m_buffer.iterator_at(pos + offset);
BufferCoord pos = m_editor.m_buffer->line_and_column_at(sel.last());
BufferIterator it = m_editor.m_buffer->iterator_at(pos + offset);
sel = Selection(it, it);
}
}

View File

@ -45,7 +45,7 @@ public:
Editor(Buffer& buffer);
virtual ~Editor() {}
Buffer& buffer() const { return m_buffer; }
Buffer& buffer() const { return *m_buffer; }
void erase();
@ -93,7 +93,7 @@ private:
virtual void on_incremental_insertion_begin() {}
virtual void on_incremental_insertion_end() {}
Buffer& m_buffer;
safe_ptr<Buffer> m_buffer;
SelectionAndCapturesList m_selections;
FilterGroup m_filters;
};