insert at a cursor position; adjust all cursors after inserting
This commit is contained in:
parent
915d62ceef
commit
1404c33a46
@ -46,19 +46,34 @@ void GapBuffer::compact()
|
|||||||
/**
|
/**
|
||||||
* Insert code_point into the gap buffer at position position.
|
* Insert code_point into the gap buffer at position position.
|
||||||
*
|
*
|
||||||
* @param position Position in the gap buffer to insert the code point at.
|
* @param insert_cursor Cursor in the gap buffer to insert the code point at.
|
||||||
* Must be <= size.
|
|
||||||
* @param code_point The code point to insert.
|
* @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)
|
size_t position = insert_cursor.iterator().offset();
|
||||||
return;
|
|
||||||
check_grow();
|
check_grow();
|
||||||
move_gap(position);
|
move_gap(position);
|
||||||
size_t size = Encoding::encode(code_point, m_encoding, &m_buffer[m_gap_position]);
|
size_t size = Encoding::encode(code_point, m_encoding, &m_buffer[m_gap_position]);
|
||||||
m_gap_position += size;
|
m_gap_position += size;
|
||||||
m_size += 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -46,6 +46,8 @@ public:
|
|||||||
{
|
{
|
||||||
return m_offset < other.m_offset;
|
return m_offset < other.m_offset;
|
||||||
}
|
}
|
||||||
|
size_t offset() { return m_offset; }
|
||||||
|
void set_offset(size_t new_offset) { m_offset = new_offset; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
GapBuffer * m_gap_buffer;
|
GapBuffer * m_gap_buffer;
|
||||||
@ -78,6 +80,9 @@ public:
|
|||||||
bool valid() const { return m_iterator.valid(); }
|
bool valid() const { return m_iterator.valid(); }
|
||||||
size_t line() const { return m_line; }
|
size_t line() const { return m_line; }
|
||||||
size_t column() const { return m_column; }
|
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:
|
protected:
|
||||||
Iterator m_iterator;
|
Iterator m_iterator;
|
||||||
@ -85,7 +90,6 @@ public:
|
|||||||
size_t m_column;
|
size_t m_column;
|
||||||
|
|
||||||
void init_column();
|
void init_column();
|
||||||
void calculate_column();
|
|
||||||
void forward_to_column(size_t target_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; }
|
size_t gap_size() const { return m_buffer_size - m_size; }
|
||||||
void compact();
|
void compact();
|
||||||
void insert(size_t position, uint32_t code_point);
|
void insert(Cursor & insert_cursor, uint32_t code_point);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
uint8_t * m_buffer;
|
uint8_t * m_buffer;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user