#include "buffer.h"
#include "BufferView.h"
+#include "cursor.h"
#include "iterators.h"
#include "lyxtext.h"
#include "paragraph.h"
#include <boost/next_prior.hpp>
+
using boost::prior;
+
+PosIterator::PosIterator(ParagraphList * pl, ParagraphList::iterator pit,
+ lyx::pos_type pos)
+{
+ stack_.push_back(PosIteratorItem(pl, pit, pos));
+}
+
+
+PosIterator::PosIterator(BufferView & bv)
+{
+ LyXText * text = bv.getLyXText();
+ lyx::pos_type pos = text->cursor().pos();
+ ParagraphList::iterator pit = text->cursorPar();
+
+ ParIterator par = bv.buffer()->par_iterator_begin();
+ ParIterator end = bv.buffer()->par_iterator_end();
+ for (; par != end; ++par) {
+ if (par.pit() == pit)
+ break;
+ }
+ setFrom(par, pos);
+}
+
+
+PosIterator::PosIterator(ParIterator const & par, lyx::pos_type pos)
+{
+ setFrom(par, pos);
+}
+
+
+void PosIterator::setFrom(ParIterator const & par, lyx::pos_type pos)
+{
+ BOOST_ASSERT(par.size() > 0);
+
+ ParIterator::PosHolder const & ph = par.positions();
+
+ int const last = par.size() - 1;
+ for (int i = 0; i < last; ++i) {
+ ParPosition const & pp = ph[i];
+ stack_.push_back(
+ PosIteratorItem(const_cast<ParagraphList *>(pp.plist),
+ pp.pit, (*pp.it)->pos, *pp.index + 1));
+ }
+ ParPosition const & pp = ph[last];
+ stack_.push_back(
+ PosIteratorItem(const_cast<ParagraphList *>(pp.plist), pp.pit, pos, 0));
+}
+
+
PosIterator & PosIterator::operator++()
{
BOOST_ASSERT(!stack_.empty());
while (true) {
- PosIteratorItem & p = stack_.top();
-
+ PosIteratorItem & p = stack_.back();
+
if (p.pos < p.pit->size()) {
- InsetOld * inset = p.pit->getInset(p.pos);
- if (inset) {
- ParagraphList * pl = inset->getParagraphs(p.index);
- if (pl) {
+ if (InsetBase * inset = p.pit->getInset(p.pos)) {
+ if (LyXText * text = inset->getText(p.index)) {
+ ParagraphList & pl = text->paragraphs();
p.index++;
- stack_.push(PosIteratorItem(pl, pl->begin(), 0));
+ stack_.push_back(PosIteratorItem(&pl, pl.begin(), 0));
return *this;
}
}
++p.pit;
p.pos = 0;
}
-
+
if (p.pit != p.pl->end() || stack_.size() == 1)
return *this;
-
- stack_.pop();
+
+ stack_.pop_back();
}
return *this;
}
PosIterator & PosIterator::operator--()
{
BOOST_ASSERT(!stack_.empty());
-
+
// try to go one position backwards: if on the start of the
- // ParagraphList, pops an item
- PosIteratorItem & p = stack_.top();
+ // ParagraphList, pops an item
+ PosIteratorItem & p = stack_.back();
if (p.pos > 0) {
--p.pos;
- InsetOld * inset = p.pit->getInset(p.pos);
+ InsetBase * inset = p.pit->getInset(p.pos);
if (inset)
p.index = inset->numParagraphs();
} else {
if (p.pit == p.pl->begin()) {
if (stack_.size() == 1)
return *this;
- stack_.pop();
- --stack_.top().index;
+ stack_.pop_back();
+ --stack_.back().index;
} else {
--p.pit;
p.pos = p.pit->size();
}
}
// try to push an item if there is some left unexplored
- PosIteratorItem & q = stack_.top();
+ PosIteratorItem & q = stack_.back();
if (q.pos < q.pit->size()) {
- InsetOld * inset = q.pit->getInset(q.pos);
+ InsetBase * inset = q.pit->getInset(q.pos);
if (inset && q.index > 0) {
- ParagraphList *
- pl = inset->getParagraphs(q.index - 1);
- BOOST_ASSERT(pl);
- stack_.push(PosIteratorItem(pl, prior(pl->end()), pl->back().size()));
+ LyXText * text = inset->getText(q.index - 1);
+ BOOST_ASSERT(text);
+ ParagraphList & pl = text->paragraphs();
+ stack_.push_back(PosIteratorItem(&pl, prior(pl.end()), pl.back().size()));
}
}
return *this;
}
-bool operator!=(PosIterator const & lhs, PosIterator const & rhs)
-{
- return !(lhs == rhs);
-}
-
-
bool operator==(PosIterator const & lhs, PosIterator const & rhs)
{
-
- PosIteratorItem const & li = lhs.stack_.top();
- PosIteratorItem const & ri = rhs.stack_.top();
-
+ PosIteratorItem const & li = lhs.stack_.back();
+ PosIteratorItem const & ri = rhs.stack_.back();
+
return (li.pl == ri.pl && li.pit == ri.pit &&
(li.pit == li.pl->end() || li.pos == ri.pos));
}
}
-PosIterator::PosIterator(ParagraphList * pl, ParagraphList::iterator pit,
- lyx::pos_type pos)
-{
- stack_.push(PosIteratorItem(pl, pit, pos));
-}
-
-
-PosIterator::PosIterator(BufferView & bv)
-{
- LyXText * text = bv.getLyXText();
- lyx::pos_type pos = text->cursor.pos();
- ParagraphList::iterator pit = text->cursorPar();
-
- ParIterator par = bv.buffer()->par_iterator_begin();
- ParIterator end = bv.buffer()->par_iterator_end();
- for ( ; par != end; ++par) {
- if (par.pit() == pit)
- break;
- }
-
- operator=(par.asPosIterator(pos));
-}
-
-
-int distance(PosIterator const & cur, PosIterator const & end)
-{
- PosIterator p = cur;
- int count = 0;
- for (; p != end; ++p, ++count);
- return count;
-}
-
-
-void advance(PosIterator & cur, int howmuch)
+InsetBase * PosIterator::inset() const
{
- for (int i = 0; i < howmuch; ++i)
- ++cur;
- for (int i = 0; i > howmuch; --i)
- --cur;
+ if (stack_.size() == 1)
+ return 0;
+ PosIteratorItem const & pi = stack_[stack_.size() - 2];
+ return pi.pit->getInset(pi.pos);
}