diff --git a/src/core/PieceTable.cc b/src/core/PieceTable.cc index 9a36aa9..68b3108 100644 --- a/src/core/PieceTable.cc +++ b/src/core/PieceTable.cc @@ -426,15 +426,21 @@ void PieceTable::begin_insert(const Cursor & cursor, bool before) { 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) { /* 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) { /* Insert happens at piece boundary between piece and piece->next. */ - m_insert_before_piece = piece; + change->before = piece; + change->after = piece->next; } else { @@ -453,50 +459,42 @@ void PieceTable::begin_insert(const Cursor & cursor, bool before) new_piece_2->prev = new_piece_1; new_piece_2->next = piece->next; - Change * change = add_change(); - change->before = piece->prev; - change->after = piece->next; - change->chains[0][0] = piece; - change->chains[0][1] = nullptr; - change->chains[1][0] = new_piece_1; - change->chains[1][1] = new_piece_2; + Change * change2 = add_change(); + change2->before = piece->prev; + change2->after = piece->next; + change2->chains[0][0] = piece; + change2->chains[0][1] = nullptr; + change2->chains[1][0] = new_piece_1; + 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) { - if (m_inserting_piece == nullptr) + if (in_insert_mode()) { - m_inserting_piece = add_piece(); - m_inserting_piece->start = &m_append_buffer[m_append_buffer_index]; - m_inserting_piece->length = 0u; - m_inserting_piece->prev = m_insert_before_piece; - 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); + /* TODO: worry about append buffer page boundaries */ + 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; } - - 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() { + m_inserting_piece = nullptr; } void PieceTable::insertion_test(Cursor & c) diff --git a/src/core/PieceTable.h b/src/core/PieceTable.h index 4c545a3..e343049 100644 --- a/src/core/PieceTable.h +++ b/src/core/PieceTable.h @@ -172,6 +172,8 @@ public: void undo(); + bool in_insert_mode() { return m_inserting_piece != nullptr; } + protected: Piece * add_piece() { @@ -199,7 +201,6 @@ protected: uint32_t m_piece_index; PagedBuffer m_changes; uint32_t m_changes_index; - Piece * m_insert_before_piece; Piece * m_inserting_piece; std::list> m_cursors;