introduce a PieceTable::Change structure to record changes
This commit is contained in:
parent
0a1bb6eb92
commit
249fd87067
@ -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);
|
||||
}
|
||||
|
@ -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<uint8_t> m_append_buffer;
|
||||
uint32_t m_append_buffer_index;
|
||||
PagedBuffer<Piece> m_pieces;
|
||||
PagedBuffer<Change> m_changes_buffer;
|
||||
uint32_t m_changes_buffer_index;
|
||||
|
||||
std::list<std::shared_ptr<Cursor>> m_cursors;
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user