DisplayBuffer: store atoms in a std::list instead of a vector

This commit is contained in:
Maxime Coste 2011-10-18 13:59:32 +00:00
parent 6fd7f97fa7
commit 32e01947fa
4 changed files with 14 additions and 15 deletions

View File

@ -98,7 +98,6 @@ DisplayBuffer::iterator DisplayBuffer::atom_containing(const BufferIterator& whe
DisplayBuffer::iterator DisplayBuffer::split(iterator atom, const BufferIterator& pos) DisplayBuffer::iterator DisplayBuffer::split(iterator atom, const BufferIterator& pos)
{ {
assert(atom < end());
assert(pos > atom->begin()); assert(pos > atom->begin());
assert(pos < atom->end()); assert(pos < atom->end());
DisplayAtom new_atom(atom->coord(), atom->begin(), pos, DisplayAtom new_atom(atom->coord(), atom->begin(), pos,
@ -113,21 +112,22 @@ DisplayBuffer::iterator DisplayBuffer::split(iterator atom, const BufferIterator
void DisplayBuffer::check_invariant() const void DisplayBuffer::check_invariant() const
{ {
for (size_t i = 0; i < m_atoms.size(); ++i) const_iterator prev_it;
for (const_iterator it = begin(); it != end(); ++it)
{ {
assert(m_atoms[i].end() >= m_atoms[i].begin()); assert(it->end() >= it->begin());
if (i > 0) if (it != begin())
{ {
assert(m_atoms[i-1].end() == m_atoms[i].begin()); assert(prev_it->end() == it->begin());
assert(m_atoms[i-1].end_coord() == m_atoms[i].coord()); assert(prev_it->end_coord() == it->coord());
} }
prev_it = it;
} }
} }
void DisplayBuffer::replace_atom_content(iterator atom, void DisplayBuffer::replace_atom_content(iterator atom,
const BufferString& replacement) const BufferString& replacement)
{ {
assert(atom < end());
atom->m_replacement_text = replacement; atom->m_replacement_text = replacement;
// update coordinates of subsequents atoms // update coordinates of subsequents atoms

View File

@ -93,7 +93,7 @@ private:
class DisplayBuffer class DisplayBuffer
{ {
public: public:
typedef std::vector<DisplayAtom> AtomList; typedef std::list<DisplayAtom> AtomList;
typedef AtomList::iterator iterator; typedef AtomList::iterator iterator;
typedef AtomList::const_iterator const_iterator; typedef AtomList::const_iterator const_iterator;

View File

@ -15,7 +15,7 @@ void colorize_regex(DisplayBuffer& display_buffer,
{ {
const BufferIterator& begin = matches.begin()->first; const BufferIterator& begin = matches.begin()->first;
if (begin != atom_it->begin()) if (begin != atom_it->begin())
atom_it = display_buffer.split(atom_it, begin) + 1; atom_it = ++display_buffer.split(atom_it, begin);
const BufferIterator& end = matches.begin()->second; const BufferIterator& end = matches.begin()->second;
if (end != atom_it->end()) if (end != atom_it->end())
@ -64,7 +64,7 @@ void expand_tabulations(DisplayBuffer& display_buffer)
if (*it == '\t') if (*it == '\t')
{ {
if (it != atom_it->begin()) if (it != atom_it->begin())
atom_it = display_buffer.split(atom_it, it) + 1; atom_it = ++display_buffer.split(atom_it, it);
if (it+1 != atom_it->end()) if (it+1 != atom_it->end())
atom_it = display_buffer.split(atom_it, it+1); atom_it = display_buffer.split(atom_it, it+1);
@ -108,7 +108,7 @@ void show_line_numbers(DisplayBuffer& display_buffer)
if (not atom_it->splitable()) if (not atom_it->splitable())
continue; continue;
atom_it = display_buffer.split(atom_it, line_start) + 1; atom_it = ++display_buffer.split(atom_it, line_start);
} }
atom_it = display_buffer.insert( atom_it = display_buffer.insert(
atom_it, atom_it,

View File

@ -71,7 +71,7 @@ public:
else if (atom.begin() < sel.begin() and atom.end() > sel.end()) else if (atom.begin() < sel.begin() and atom.end() > sel.end())
{ {
atom_it = display_buffer.split(atom_it, sel.begin()); atom_it = display_buffer.split(atom_it, sel.begin());
atom_it = display_buffer.split(atom_it + 1, sel.end()); atom_it = display_buffer.split(++atom_it, sel.end());
atom_it->attribute() |= Attributes::Underline; atom_it->attribute() |= Attributes::Underline;
++atom_it; ++atom_it;
++sel_it; ++sel_it;
@ -79,7 +79,7 @@ public:
// [------###] // [------###]
else if (atom.begin() < sel.begin() and atom.end() > sel.begin()) else if (atom.begin() < sel.begin() and atom.end() > sel.begin())
{ {
atom_it = display_buffer.split(atom_it, sel.begin()) + 1; atom_it = ++display_buffer.split(atom_it, sel.begin());
atom_it->attribute() |= Attributes::Underline; atom_it->attribute() |= Attributes::Underline;
++atom_it; ++atom_it;
} }
@ -225,8 +225,7 @@ BufferIterator Window::iterator_at(const DisplayCoord& window_pos) const
{ {
if (window_pos < atom_it->coord()) if (window_pos < atom_it->coord())
{ {
const DisplayAtom& atom = *(atom_it - 1); return (--atom_it)->iterator_at(window_pos);
return atom.iterator_at(window_pos);
} }
} }
} }