Buffer: end is either one past last character, or one past last line

This commit is contained in:
Maxime Coste 2013-01-23 18:52:42 +01:00
parent 72cc61c987
commit 410067282a
2 changed files with 9 additions and 5 deletions

View File

@ -256,9 +256,9 @@ void Buffer::do_insert(const BufferIterator& pos, const String& content)
BufferIterator begin_it; BufferIterator begin_it;
BufferIterator end_it; BufferIterator end_it;
// if we inserted at the end of the buffer, we may have created a new // if we inserted at the end of the buffer, we have created a new
// line without inserting a '\n' // line without inserting a '\n'
if (pos == end() and (pos == begin() or *(pos-1) == '\n')) if (pos.is_end())
{ {
ByteCount start = 0; ByteCount start = 0;
for (ByteCount i = 0; i < content.length(); ++i) for (ByteCount i = 0; i < content.length(); ++i)
@ -361,7 +361,7 @@ void Buffer::apply_modification(const Modification& modification)
{ {
case Modification::Insert: case Modification::Insert:
{ {
do_insert(pos < end() ? pos : end(), content); do_insert(pos, content);
break; break;
} }
case Modification::Erase: case Modification::Erase:

View File

@ -116,8 +116,7 @@ inline char BufferIterator::operator*() const
inline ByteCount BufferIterator::offset() const inline ByteCount BufferIterator::offset() const
{ {
assert(m_buffer); assert(m_buffer);
return line() == 0 ? column() return m_buffer->m_lines[line()].start + column();
: m_buffer->m_lines[line()].start + column();
} }
inline size_t BufferIterator::operator-(const BufferIterator& iterator) const inline size_t BufferIterator::operator-(const BufferIterator& iterator) const
@ -221,6 +220,11 @@ inline bool BufferIterator::is_begin() const
inline bool BufferIterator::is_end() const inline bool BufferIterator::is_end() const
{ {
assert(m_buffer); assert(m_buffer);
if (m_coord.line == m_buffer->line_count())
{
assert(m_coord.column == 0);
return true;
}
return offset() == m_buffer->character_count(); return offset() == m_buffer->character_count();
} }