Implement GapBuffer::Iterator movement functions
This commit is contained in:
parent
7d87de4bf1
commit
35b35cb2f1
@ -30,3 +30,29 @@ std::shared_ptr<GapBuffer::Cursor> 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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<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:
|
||||
uint8_t * m_buffer;
|
||||
|
Loading…
x
Reference in New Issue
Block a user