diff --git a/src/core/PieceTable.cc b/src/core/PieceTable.cc index 062fd98..ddfb9ca 100644 --- a/src/core/PieceTable.cc +++ b/src/core/PieceTable.cc @@ -11,6 +11,7 @@ PieceTable::PieceTable(const uint8_t * file_buffer, unsigned long file_buffer_si m_piece_index = 2u; tabstop = 4u; m_append_buffer_index = 0u; + m_changes_buffer_index = 0u; } void PieceTable::append_initial_line_piece(uint8_t * start, uint32_t length, bool eol) @@ -342,6 +343,13 @@ void PieceTable::insertion_test(Cursor & c) m_append_buffer[m_append_buffer_index++] = 'x'; m_append_buffer[m_append_buffer_index++] = 'y'; m_append_buffer[m_append_buffer_index++] = 'z'; + + Change * change = &m_changes_buffer[m_changes_buffer_index++]; + change->prior_link[0][0] = c.iterator.piece->prev; + change->prior_link[0][1] = c.iterator.piece; + change->prior_link[1][0] = c.iterator.piece; + change->prior_link[1][1] = c.iterator.piece->next; + if (c.iterator.valid()) { if (c.iterator.offset > 0u) @@ -356,42 +364,47 @@ void PieceTable::insertion_test(Cursor & c) piece3->length = c.iterator.piece->length - c.iterator.offset; piece3->flags = c.iterator.piece->flags; - c.iterator.piece->prev->next = piece2; - piece2->prev = c.iterator.piece->prev; piece2->next = piece; piece->prev = piece2; - piece->next = piece3; piece3->prev = piece; - piece3->next = c.iterator.piece->next; - piece3->next->prev = piece3; + + change->new_link[0][0] = c.iterator.piece->prev; + change->new_link[0][1] = piece2; + change->new_link[1][0] = piece3; + change->new_link[1][1] = c.iterator.piece->next; } else { if (c.iterator.piece->length == 0u) { piece->flags = c.iterator.piece->flags; - c.iterator.piece->prev->next = piece; - c.iterator.piece->next->prev = piece; - piece->prev = c.iterator.piece->prev; - piece->next = c.iterator.piece->next; + change->new_link[0][0] = c.iterator.piece->prev; + change->new_link[0][1] = piece; + change->new_link[1][0] = piece; + change->new_link[1][1] = c.iterator.piece->next; } else { - c.iterator.piece->prev->next = piece; - piece->prev = c.iterator.piece->prev; - c.iterator.piece->prev = piece; - piece->next = c.iterator.piece; + change->new_link[0][0] = c.iterator.piece->prev; + change->new_link[0][1] = piece; + change->new_link[1][0] = piece; + change->new_link[1][1] = c.iterator.piece; } } } else { - start_piece->next = piece; - piece->prev = start_piece; - end_piece->prev = piece; - piece->next = end_piece; + change->new_link[0][0] = start_piece; + change->new_link[0][1] = piece; + change->new_link[1][0] = piece; + change->new_link[1][1] = end_piece; } + change->new_link[0][0]->next = change->new_link[0][1]; + change->new_link[0][1]->prev = change->new_link[0][0]; + change->new_link[1][0]->next = change->new_link[1][1]; + change->new_link[1][1]->prev = change->new_link[1][0]; + c.warp_to_inserted_piece(piece); } diff --git a/src/core/PieceTable.h b/src/core/PieceTable.h index 8dbdbd2..46a670b 100644 --- a/src/core/PieceTable.h +++ b/src/core/PieceTable.h @@ -132,6 +132,13 @@ public: void forward_to_column(uint32_t c); }; + struct Change + { + Piece * prior_link[2][2]; + Piece * new_link[2][2]; + bool insert; + }; + Piece * start_piece; Piece * end_piece; uint8_t tabstop; @@ -168,6 +175,8 @@ protected: PagedBuffer m_append_buffer; uint32_t m_append_buffer_index; PagedBuffer m_pieces; + PagedBuffer m_changes_buffer; + uint32_t m_changes_buffer_index; std::list> m_cursors; };