From b9c23084be103874ef07bdf0603f4195fc2a4ce3 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Tue, 18 Oct 2016 21:53:18 -0400 Subject: [PATCH] shrink up the Change structure a bit --- src/core/PieceTable.cc | 103 +++++++++++++++++++++-------------------- src/core/PieceTable.h | 4 +- 2 files changed, 56 insertions(+), 51 deletions(-) diff --git a/src/core/PieceTable.cc b/src/core/PieceTable.cc index d2bd0e8..df0d3ae 100644 --- a/src/core/PieceTable.cc +++ b/src/core/PieceTable.cc @@ -374,14 +374,12 @@ void PieceTable::begin_insert(const Cursor & cursor, bool before) new_piece_2->next = piece->next; Change * change = add_change(); - change->links[0][0][0] = piece->prev; - change->links[0][0][1] = piece; - change->links[0][1][0] = piece; - change->links[0][1][1] = piece->next; - change->links[1][0][0] = piece->prev; - change->links[1][0][1] = new_piece_1; - change->links[1][1][0] = new_piece_2; - change->links[1][1][1] = piece->next; + 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; 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; Change * change = add_change(); - change->links[0][0][0] = m_insert_before_piece; - change->links[0][0][1] = m_insert_before_piece->next; - change->links[0][1][0] = nullptr; - change->links[0][1][1] = nullptr; - change->links[1][0][0] = m_insert_before_piece; - change->links[1][0][1] = m_inserting_piece; - change->links[1][1][0] = m_inserting_piece; - change->links[1][1][1] = m_insert_before_piece->next; + 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); } @@ -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++] = 'z'; - Change * change = &m_changes[m_changes_index++]; + Change * change = add_change(); + Change * change2 = nullptr; if (c.iterator.valid()) { - change->links[0][0][0] = c.iterator.piece->prev; - change->links[0][0][1] = c.iterator.piece; - change->links[0][1][0] = c.iterator.piece; - change->links[0][1][1] = c.iterator.piece->next; + change->before = c.iterator.piece->prev; + change->after = c.iterator.piece->next; + change->chains[0][0] = c.iterator.piece; + change->chains[0][1] = nullptr; if (c.iterator.offset > 0u) { Piece * piece2 = add_piece(); @@ -455,42 +452,42 @@ void PieceTable::insertion_test(Cursor & c) piece->next = piece3; piece3->prev = piece; - change->links[1][0][0] = c.iterator.piece->prev; - change->links[1][0][1] = piece2; - change->links[1][1][0] = piece3; - change->links[1][1][1] = c.iterator.piece->next; + change->chains[1][0] = piece2; + change->chains[1][1] = piece; + + 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 { - 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->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; + change->after = c.iterator.piece; } } } else { - change->links[0][0][0] = start_piece; - change->links[0][0][1] = end_piece; - change->links[0][1][0] = nullptr; - change->links[0][1][1] = nullptr; - change->links[1][0][0] = start_piece; - change->links[1][0][1] = piece; - change->links[1][1][0] = piece; - change->links[1][1][1] = end_piece; + change->before = start_piece; + change->after = end_piece; + change->chains[0][0] = nullptr; + change->chains[0][1] = nullptr; + change->chains[1][0] = piece; + change->chains[1][1] = nullptr; } apply_change(change, 1u); + if (change2 != nullptr) + { + apply_change(change2, 1u); + } c.warp_to_inserted_piece(piece); } @@ -506,11 +503,17 @@ void PieceTable::undo() void PieceTable::apply_change(Change * change, uint8_t forward) { - change->links[forward][0][0]->next = change->links[forward][0][1]; - change->links[forward][0][1]->prev = change->links[forward][0][0]; - if (change->links[forward][1][0] != nullptr) + Piece * p = change->before; + for (uint8_t i = 0; i < sizeof(change->chains[0]) / sizeof(change->chains[0][0]); i++) { - change->links[forward][1][0]->next = change->links[forward][1][1]; - change->links[forward][1][1]->prev = change->links[forward][1][0]; + if (change->chains[forward][i] == nullptr) + { + 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; } diff --git a/src/core/PieceTable.h b/src/core/PieceTable.h index ae98c65..d88160d 100644 --- a/src/core/PieceTable.h +++ b/src/core/PieceTable.h @@ -125,7 +125,9 @@ public: struct Change { - Piece * links[2][2][2]; + Piece * before; + Piece * after; + Piece * chains[2][2]; }; Piece * start_piece;