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);
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user