shrink up the Change structure a bit
This commit is contained in:
parent
14a3c17835
commit
b9c23084be
@ -374,14 +374,12 @@ void PieceTable::begin_insert(const Cursor & cursor, bool before)
|
|||||||
new_piece_2->next = piece->next;
|
new_piece_2->next = piece->next;
|
||||||
|
|
||||||
Change * change = add_change();
|
Change * change = add_change();
|
||||||
change->links[0][0][0] = piece->prev;
|
change->before = piece->prev;
|
||||||
change->links[0][0][1] = piece;
|
change->after = piece->next;
|
||||||
change->links[0][1][0] = piece;
|
change->chains[0][0] = piece;
|
||||||
change->links[0][1][1] = piece->next;
|
change->chains[0][1] = nullptr;
|
||||||
change->links[1][0][0] = piece->prev;
|
change->chains[1][0] = new_piece_1;
|
||||||
change->links[1][0][1] = new_piece_1;
|
change->chains[1][1] = new_piece_2;
|
||||||
change->links[1][1][0] = new_piece_2;
|
|
||||||
change->links[1][1][1] = piece->next;
|
|
||||||
|
|
||||||
apply_change(change, 1u);
|
apply_change(change, 1u);
|
||||||
|
|
||||||
@ -402,14 +400,12 @@ void PieceTable::insert_code_point(uint32_t code_point)
|
|||||||
m_inserting_piece->next = m_insert_before_piece->next;
|
m_inserting_piece->next = m_insert_before_piece->next;
|
||||||
|
|
||||||
Change * change = add_change();
|
Change * change = add_change();
|
||||||
change->links[0][0][0] = m_insert_before_piece;
|
change->before = m_insert_before_piece;
|
||||||
change->links[0][0][1] = m_insert_before_piece->next;
|
change->after = m_insert_before_piece->next;
|
||||||
change->links[0][1][0] = nullptr;
|
change->chains[0][0] = nullptr;
|
||||||
change->links[0][1][1] = nullptr;
|
change->chains[0][1] = nullptr;
|
||||||
change->links[1][0][0] = m_insert_before_piece;
|
change->chains[1][0] = m_inserting_piece;
|
||||||
change->links[1][0][1] = m_inserting_piece;
|
change->chains[1][1] = nullptr;
|
||||||
change->links[1][1][0] = m_inserting_piece;
|
|
||||||
change->links[1][1][1] = m_insert_before_piece->next;
|
|
||||||
|
|
||||||
apply_change(change, 1u);
|
apply_change(change, 1u);
|
||||||
}
|
}
|
||||||
@ -432,14 +428,15 @@ void PieceTable::insertion_test(Cursor & c)
|
|||||||
m_append_buffer[m_append_buffer_index++] = 'y';
|
m_append_buffer[m_append_buffer_index++] = 'y';
|
||||||
m_append_buffer[m_append_buffer_index++] = 'z';
|
m_append_buffer[m_append_buffer_index++] = 'z';
|
||||||
|
|
||||||
Change * change = &m_changes[m_changes_index++];
|
Change * change = add_change();
|
||||||
|
Change * change2 = nullptr;
|
||||||
|
|
||||||
if (c.iterator.valid())
|
if (c.iterator.valid())
|
||||||
{
|
{
|
||||||
change->links[0][0][0] = c.iterator.piece->prev;
|
change->before = c.iterator.piece->prev;
|
||||||
change->links[0][0][1] = c.iterator.piece;
|
change->after = c.iterator.piece->next;
|
||||||
change->links[0][1][0] = c.iterator.piece;
|
change->chains[0][0] = c.iterator.piece;
|
||||||
change->links[0][1][1] = c.iterator.piece->next;
|
change->chains[0][1] = nullptr;
|
||||||
if (c.iterator.offset > 0u)
|
if (c.iterator.offset > 0u)
|
||||||
{
|
{
|
||||||
Piece * piece2 = add_piece();
|
Piece * piece2 = add_piece();
|
||||||
@ -455,42 +452,42 @@ void PieceTable::insertion_test(Cursor & c)
|
|||||||
piece->next = piece3;
|
piece->next = piece3;
|
||||||
piece3->prev = piece;
|
piece3->prev = piece;
|
||||||
|
|
||||||
change->links[1][0][0] = c.iterator.piece->prev;
|
change->chains[1][0] = piece2;
|
||||||
change->links[1][0][1] = piece2;
|
change->chains[1][1] = piece;
|
||||||
change->links[1][1][0] = piece3;
|
|
||||||
change->links[1][1][1] = c.iterator.piece->next;
|
change2 = add_change();
|
||||||
|
change2->before = piece;
|
||||||
|
change2->after = c.iterator.piece->next;
|
||||||
|
change2->chains[0][0] = nullptr;
|
||||||
|
change2->chains[0][1] = nullptr;
|
||||||
|
change2->chains[1][0] = piece3;
|
||||||
|
change2->chains[1][1] = nullptr;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (c.iterator.piece->length == 0u)
|
change->chains[1][0] = piece;
|
||||||
|
change->chains[1][1] = nullptr;
|
||||||
|
if (c.iterator.piece->length != 0u)
|
||||||
{
|
{
|
||||||
change->links[1][0][0] = c.iterator.piece->prev;
|
change->after = c.iterator.piece;
|
||||||
change->links[1][0][1] = piece;
|
|
||||||
change->links[1][1][0] = piece;
|
|
||||||
change->links[1][1][1] = c.iterator.piece->next;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
change->links[1][0][0] = c.iterator.piece->prev;
|
|
||||||
change->links[1][0][1] = piece;
|
|
||||||
change->links[1][1][0] = piece;
|
|
||||||
change->links[1][1][1] = c.iterator.piece;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
change->links[0][0][0] = start_piece;
|
change->before = start_piece;
|
||||||
change->links[0][0][1] = end_piece;
|
change->after = end_piece;
|
||||||
change->links[0][1][0] = nullptr;
|
change->chains[0][0] = nullptr;
|
||||||
change->links[0][1][1] = nullptr;
|
change->chains[0][1] = nullptr;
|
||||||
change->links[1][0][0] = start_piece;
|
change->chains[1][0] = piece;
|
||||||
change->links[1][0][1] = piece;
|
change->chains[1][1] = nullptr;
|
||||||
change->links[1][1][0] = piece;
|
|
||||||
change->links[1][1][1] = end_piece;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
apply_change(change, 1u);
|
apply_change(change, 1u);
|
||||||
|
if (change2 != nullptr)
|
||||||
|
{
|
||||||
|
apply_change(change2, 1u);
|
||||||
|
}
|
||||||
|
|
||||||
c.warp_to_inserted_piece(piece);
|
c.warp_to_inserted_piece(piece);
|
||||||
}
|
}
|
||||||
@ -506,11 +503,17 @@ void PieceTable::undo()
|
|||||||
|
|
||||||
void PieceTable::apply_change(Change * change, uint8_t forward)
|
void PieceTable::apply_change(Change * change, uint8_t forward)
|
||||||
{
|
{
|
||||||
change->links[forward][0][0]->next = change->links[forward][0][1];
|
Piece * p = change->before;
|
||||||
change->links[forward][0][1]->prev = change->links[forward][0][0];
|
for (uint8_t i = 0; i < sizeof(change->chains[0]) / sizeof(change->chains[0][0]); i++)
|
||||||
if (change->links[forward][1][0] != nullptr)
|
|
||||||
{
|
{
|
||||||
change->links[forward][1][0]->next = change->links[forward][1][1];
|
if (change->chains[forward][i] == nullptr)
|
||||||
change->links[forward][1][1]->prev = change->links[forward][1][0];
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
p->next = change->chains[forward][i];
|
||||||
|
change->chains[forward][i]->prev = p;
|
||||||
|
p = change->chains[forward][i];
|
||||||
}
|
}
|
||||||
|
p->next = change->after;
|
||||||
|
change->after->prev = p;
|
||||||
}
|
}
|
||||||
|
@ -125,7 +125,9 @@ public:
|
|||||||
|
|
||||||
struct Change
|
struct Change
|
||||||
{
|
{
|
||||||
Piece * links[2][2][2];
|
Piece * before;
|
||||||
|
Piece * after;
|
||||||
|
Piece * chains[2][2];
|
||||||
};
|
};
|
||||||
|
|
||||||
Piece * start_piece;
|
Piece * start_piece;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user