insert at a cursor position; adjust all cursors after inserting

This commit is contained in:
Josh Holtrop 2016-11-27 17:51:16 -05:00
parent 915d62ceef
commit 1404c33a46
2 changed files with 26 additions and 7 deletions

View File

@ -46,19 +46,34 @@ void GapBuffer::compact()
/**
* Insert code_point into the gap buffer at position position.
*
* @param position Position in the gap buffer to insert the code point at.
* Must be <= size.
* @param insert_cursor Cursor in the gap buffer to insert the code point at.
* @param code_point The code point to insert.
*/
void GapBuffer::insert(size_t position, uint32_t code_point)
void GapBuffer::insert(Cursor & insert_cursor, uint32_t code_point)
{
if (position > m_size)
return;
size_t position = insert_cursor.iterator().offset();
check_grow();
move_gap(position);
size_t size = Encoding::encode(code_point, m_encoding, &m_buffer[m_gap_position]);
m_gap_position += size;
m_size += size;
/* Now adjust any cursors that were >= position. */
for (auto cursor : m_cursors)
{
if (cursor->iterator().offset() >= position)
{
cursor->iterator().set_offset(cursor->iterator().offset() + size);
if (cursor->line() == insert_cursor.line())
{
cursor->calculate_column();
}
if (code_point == '\n')
{
cursor->set_line(cursor->line() + 1u);
}
}
}
}
/**

View File

@ -46,6 +46,8 @@ public:
{
return m_offset < other.m_offset;
}
size_t offset() { return m_offset; }
void set_offset(size_t new_offset) { m_offset = new_offset; }
protected:
GapBuffer * m_gap_buffer;
@ -78,6 +80,9 @@ public:
bool valid() const { return m_iterator.valid(); }
size_t line() const { return m_line; }
size_t column() const { return m_column; }
Iterator & iterator() { return m_iterator; }
void set_line(size_t line) { m_line = line; }
void calculate_column();
protected:
Iterator m_iterator;
@ -85,7 +90,6 @@ public:
size_t m_column;
void init_column();
void calculate_column();
void forward_to_column(size_t target_column);
};
@ -110,7 +114,7 @@ public:
}
size_t gap_size() const { return m_buffer_size - m_size; }
void compact();
void insert(size_t position, uint32_t code_point);
void insert(Cursor & insert_cursor, uint32_t code_point);
protected:
uint8_t * m_buffer;