diff --git a/src/core/Buffer.cc b/src/core/Buffer.cc index 07606dd..60ced06 100644 --- a/src/core/Buffer.cc +++ b/src/core/Buffer.cc @@ -183,13 +183,7 @@ void Buffer::insert_code_point(const Buffer::Iterator & position, uint32_t code_ ssize_t lines = (code_point == '\n') ? 1 : 0; if (adjust_iterators) { - for (auto iterator : m_iterators) - { - if (*iterator >= local_position) - { - iterator->warp(bytes, lines); - } - } + warp_iterators(local_position.offset(), bytes, lines, true); } pop_operation(); } @@ -205,17 +199,26 @@ void Buffer::erase_code_point(const Buffer::Iterator & position) record_change(local_position.address(), bytes, local_position.offset(), false); m_gap_buffer->erase(local_position.offset(), bytes); ssize_t lines = (code_point == '\n') ? -1 : 0; - for (auto iterator : m_iterators) - { - if (*iterator > local_position) - { - iterator->warp(-(ssize_t)bytes, lines); - } - } + warp_iterators(local_position.offset(), -(ssize_t)bytes, lines, false); pop_operation(); } } +void Buffer::warp_iterators(size_t offset, ssize_t offset_adjustment, ssize_t lines_adjustment, bool include_equal) +{ + if (!include_equal) + { + offset++; + } + for (auto iterator : m_iterators) + { + if (iterator->offset() >= offset) + { + iterator->warp(offset_adjustment, lines_adjustment); + } + } +} + void Buffer::pop_operation() { if (m_operation_level > 0) diff --git a/src/core/Buffer.h b/src/core/Buffer.h index b650d31..6b0daa9 100644 --- a/src/core/Buffer.h +++ b/src/core/Buffer.h @@ -144,6 +144,7 @@ protected: void load_text_in_buffer(uint8_t * buffer, size_t buffer_size, size_t data_length); void record_change(uint8_t data[], size_t length, size_t buffer_position, bool insert); void save_current_operation(); + void warp_iterators(size_t offset, ssize_t offset_adjustment, ssize_t lines_adjustments, bool include_equal); }; #endif