From c3852e950ad12086912df98c7613675aa8bccd98 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Fri, 17 Nov 2017 16:58:00 -0500 Subject: [PATCH] Add Buffer::erase_range() --- src/core/Buffer.cc | 13 +++++++++++++ src/core/Buffer.h | 2 ++ test/src/test_Buffer.cc | 31 +++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+) diff --git a/src/core/Buffer.cc b/src/core/Buffer.cc index 1856f58..d2daa35 100644 --- a/src/core/Buffer.cc +++ b/src/core/Buffer.cc @@ -212,6 +212,19 @@ void Buffer::erase_code_point(const Buffer::Iterator & position) } } +void Buffer::erase_range(const Buffer::Iterator & start, + const Buffer::Iterator & end) +{ + if (start.valid() && (start < end)) + { + push_operation(); + size_t start_offset = start.offset(); + size_t end_offset = end.valid() ? end.offset() : m_gap_buffer->size(); + erase_data(start_offset, end_offset - start_offset, true); + pop_operation(); + } +} + void Buffer::erase_data(size_t offset, size_t length, bool do_record_change) { warp_iterators_before_delete(offset, length); diff --git a/src/core/Buffer.h b/src/core/Buffer.h index 11f69b8..b74d484 100644 --- a/src/core/Buffer.h +++ b/src/core/Buffer.h @@ -131,6 +131,8 @@ public: bool insert_mode() const { return m_insert_mode; } void insert_code_point(const Buffer::Iterator & position, uint32_t code_point); void erase_code_point(const Buffer::Iterator & position); + void erase_range(const Buffer::Iterator & start, + const Buffer::Iterator & end); std::shared_ptr filename() const { return m_filename; } Iterator begin() const { return Iterator(this); } Iterator end() const { return *m_eof_iterator; } diff --git a/test/src/test_Buffer.cc b/test/src/test_Buffer.cc index 76384dc..a59ed5b 100644 --- a/test/src/test_Buffer.cc +++ b/test/src/test_Buffer.cc @@ -133,6 +133,37 @@ TEST(BufferTest, allows_inserting_and_erasing_characters) b.exit_insert_mode(); } +TEST(BufferTest, allows_erasing_ranges) +{ + std::string s("abc\ndef\n"); + Buffer b((const uint8_t *)&s[0], s.size()); + auto it = b.add_iterator(); + auto it2 = b.add_iterator(); + it2->go_next_line(); + + /* Invalid tests. */ + b.erase_range(b.end(), b.end()); + EXPECT_EQ(ss("abc\ndef\n"), b.get_string()); + b.erase_range(*it, b.begin()); + EXPECT_EQ(ss("abc\ndef\n"), b.get_string()); + + EXPECT_EQ(C('a'), **it); + EXPECT_EQ(C('d'), **it2); + b.erase_range(*it, *it2); + EXPECT_EQ(ss("def\n"), b.get_string()); + EXPECT_EQ(*it, *it2); + EXPECT_EQ(C('d'), **it); + while (it2->valid()) + { + it2->go_forward(); + } + EXPECT_EQ(C('d'), **it); + b.erase_range(*it, *it2); + EXPECT_EQ(ss(""), b.get_string()); + EXPECT_FALSE(it->valid()); + EXPECT_FALSE(it2->valid()); +} + TEST(BufferTest, adds_a_newline_after_inserted_character_when_inserting_in_an_empty_buffer) { Buffer b;