Create empty inserting piece when entering insert mode

This commit is contained in:
Josh Holtrop 2016-10-29 09:07:48 -04:00
parent 827f4efdd9
commit fe64622762
2 changed files with 32 additions and 33 deletions

View File

@ -426,15 +426,21 @@ void PieceTable::begin_insert(const Cursor & cursor, bool before)
{ {
offset += cursor.iterator.num_bytes_in_code_point(); offset += cursor.iterator.num_bytes_in_code_point();
} }
Change * change = add_change();
m_inserting_piece = add_piece();
m_inserting_piece->start = &m_append_buffer[m_append_buffer_index];
m_inserting_piece->length = 0u;
if (offset == 0u) if (offset == 0u)
{ {
/* Insert happens at piece boundary between piece->prev and piece. */ /* Insert happens at piece boundary between piece->prev and piece. */
m_insert_before_piece = piece->prev; change->before = piece->prev;
change->after = piece;
} }
else if (offset >= piece->length) else if (offset >= piece->length)
{ {
/* Insert happens at piece boundary between piece and piece->next. */ /* Insert happens at piece boundary between piece and piece->next. */
m_insert_before_piece = piece; change->before = piece;
change->after = piece->next;
} }
else else
{ {
@ -453,50 +459,42 @@ void PieceTable::begin_insert(const Cursor & cursor, bool before)
new_piece_2->prev = new_piece_1; new_piece_2->prev = new_piece_1;
new_piece_2->next = piece->next; new_piece_2->next = piece->next;
Change * change = add_change(); Change * change2 = add_change();
change->before = piece->prev; change2->before = piece->prev;
change->after = piece->next; change2->after = piece->next;
change->chains[0][0] = piece; change2->chains[0][0] = piece;
change->chains[0][1] = nullptr; change2->chains[0][1] = nullptr;
change->chains[1][0] = new_piece_1; change2->chains[1][0] = new_piece_1;
change->chains[1][1] = new_piece_2; change2->chains[1][1] = new_piece_2;
apply_change(change, 1u); apply_change(change2, 1u);
m_insert_before_piece = new_piece_1; change->before = new_piece_1;
change->after = new_piece_2;
} }
m_inserting_piece = nullptr; change->chains[0][0] = nullptr;
change->chains[0][1] = nullptr;
change->chains[1][0] = m_inserting_piece;
change->chains[1][1] = nullptr;
apply_change(change, 1u);
} }
void PieceTable::insert_code_point(uint32_t code_point) void PieceTable::insert_code_point(uint32_t code_point)
{ {
if (m_inserting_piece == nullptr) if (in_insert_mode())
{ {
m_inserting_piece = add_piece(); /* TODO: worry about append buffer page boundaries */
m_inserting_piece->start = &m_append_buffer[m_append_buffer_index]; uint8_t bytes = Encoding::encode(code_point, encoding, &m_append_buffer[m_append_buffer_index]);
m_inserting_piece->length = 0u; m_inserting_piece->length += bytes;
m_inserting_piece->prev = m_insert_before_piece; m_append_buffer_index += bytes;
m_inserting_piece->next = m_insert_before_piece->next;
Change * change = add_change();
change->before = m_insert_before_piece;
change->after = m_insert_before_piece->next;
change->chains[0][0] = nullptr;
change->chains[0][1] = nullptr;
change->chains[1][0] = m_inserting_piece;
change->chains[1][1] = nullptr;
apply_change(change, 1u);
} }
uint8_t bytes = Encoding::encode(code_point, encoding, &m_append_buffer[m_append_buffer_index]);
m_inserting_piece->length += bytes;
m_append_buffer_index += bytes;
} }
void PieceTable::end_insert() void PieceTable::end_insert()
{ {
m_inserting_piece = nullptr;
} }
void PieceTable::insertion_test(Cursor & c) void PieceTable::insertion_test(Cursor & c)

View File

@ -172,6 +172,8 @@ public:
void undo(); void undo();
bool in_insert_mode() { return m_inserting_piece != nullptr; }
protected: protected:
Piece * add_piece() Piece * add_piece()
{ {
@ -199,7 +201,6 @@ protected:
uint32_t m_piece_index; uint32_t m_piece_index;
PagedBuffer<Change> m_changes; PagedBuffer<Change> m_changes;
uint32_t m_changes_index; uint32_t m_changes_index;
Piece * m_insert_before_piece;
Piece * m_inserting_piece; Piece * m_inserting_piece;
std::list<std::shared_ptr<Cursor>> m_cursors; std::list<std::shared_ptr<Cursor>> m_cursors;