From 35b35cb2f1816293061dab1e6ecd21736eef4487 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Wed, 2 Nov 2016 21:11:09 -0400 Subject: [PATCH] Implement GapBuffer::Iterator movement functions --- src/core/GapBuffer.cc | 26 ++++++++++++++++++++++++++ src/core/GapBuffer.h | 23 ++++++++++++++++++++--- 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/src/core/GapBuffer.cc b/src/core/GapBuffer.cc index e987d02..6461cbc 100644 --- a/src/core/GapBuffer.cc +++ b/src/core/GapBuffer.cc @@ -30,3 +30,29 @@ std::shared_ptr GapBuffer::add_cursor() m_cursors.push_back(cursor); return cursor; } + + +void GapBuffer::Iterator::forward() +{ + if (valid()) + { + m_offset += Encoding::num_bytes_in_code_point(m_gap_buffer->m_encoding, address()); + } +} + +void GapBuffer::Iterator::back() +{ + if (valid()) + { + if (m_offset == 0u) + { + m_offset = 0xFFFFFFFFu; + } + else + { + const uint8_t * a = m_gap_buffer->address(m_offset - 1u); + const uint8_t * beginning_of_code_point = Encoding::beginning_of_code_point(m_gap_buffer->m_encoding, a); + m_offset -= ((a - beginning_of_code_point) + 1u); + } + } +} diff --git a/src/core/GapBuffer.h b/src/core/GapBuffer.h index 0f22389..a819f0e 100644 --- a/src/core/GapBuffer.h +++ b/src/core/GapBuffer.h @@ -18,10 +18,16 @@ public: m_gap_buffer = gap_buffer; m_offset = 0u; } - bool valid() + bool valid() const { return m_offset < m_gap_buffer->size(); } + void forward(); + void back(); + uint8_t * address() const + { + return m_gap_buffer->address(m_offset); + } protected: GapBuffer * m_gap_buffer; @@ -47,9 +53,20 @@ public: GapBuffer(Encoding::Type encoding); GapBuffer(uint8_t * buffer, size_t buffer_size, size_t size, Encoding::Type encoding); ~GapBuffer(); - size_t buffer_size() { return m_buffer_size; } - size_t size() { return m_size; } + size_t buffer_size() const { return m_buffer_size; } + size_t size() const { return m_size; } std::shared_ptr add_cursor(); + uint8_t * address(size_t offset) const + { + if (offset < m_gap_position) + { + return &m_buffer[offset]; + } + else + { + return &m_buffer[offset + (m_buffer_size - m_size)]; + } + } protected: uint8_t * m_buffer;