Implement GapBuffer::Iterator movement functions

This commit is contained in:
Josh Holtrop 2016-11-02 21:11:09 -04:00
parent 7d87de4bf1
commit 35b35cb2f1
2 changed files with 46 additions and 3 deletions

View File

@ -30,3 +30,29 @@ std::shared_ptr<GapBuffer::Cursor> GapBuffer::add_cursor()
m_cursors.push_back(cursor); m_cursors.push_back(cursor);
return 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);
}
}
}

View File

@ -18,10 +18,16 @@ public:
m_gap_buffer = gap_buffer; m_gap_buffer = gap_buffer;
m_offset = 0u; m_offset = 0u;
} }
bool valid() bool valid() const
{ {
return m_offset < m_gap_buffer->size(); return m_offset < m_gap_buffer->size();
} }
void forward();
void back();
uint8_t * address() const
{
return m_gap_buffer->address(m_offset);
}
protected: protected:
GapBuffer * m_gap_buffer; GapBuffer * m_gap_buffer;
@ -47,9 +53,20 @@ public:
GapBuffer(Encoding::Type encoding); GapBuffer(Encoding::Type encoding);
GapBuffer(uint8_t * buffer, size_t buffer_size, size_t size, Encoding::Type encoding); GapBuffer(uint8_t * buffer, size_t buffer_size, size_t size, Encoding::Type encoding);
~GapBuffer(); ~GapBuffer();
size_t buffer_size() { return m_buffer_size; } size_t buffer_size() const { return m_buffer_size; }
size_t size() { return m_size; } size_t size() const { return m_size; }
std::shared_ptr<Cursor> add_cursor(); std::shared_ptr<Cursor> 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: protected:
uint8_t * m_buffer; uint8_t * m_buffer;