]> git.lyx.org Git - lyx.git/blobdiff - src/iterators.C
Point fix, earlier forgotten
[lyx.git] / src / iterators.C
index 011e44062baaedaf2660e29b5c38ac0082182b2c..920c66ab7c586bbbfdec67b3d7e55329002827a1 100644 (file)
@@ -5,7 +5,7 @@
  * \author unknown
  * \author Lars Gullik Bjønnes
  *
- * Full author contact details are available in file CREDITS
+ * Full author contact details are available in file CREDITS.
  */
 
 
 #include <boost/next_prior.hpp>
 #include <boost/optional.hpp>
 
-#include <stack>
+// it's conceptionally a stack, but undo needs random access...
+//#include <stack>
+#include <vector>
 
 using boost::next;
 using boost::optional;
-using std::stack;
+using std::vector;
 
 ///
 /// ParPosition
@@ -45,7 +47,7 @@ public:
 ParPosition::ParPosition(ParagraphList::iterator p, ParagraphList const & pl)
        : pit(p), plist(&pl)
 {
-       if (p != pl.end()) {
+       if (p != const_cast<ParagraphList&>(pl).end()) {
                it.reset(p->insetlist.begin());
        }
 }
@@ -68,14 +70,14 @@ bool operator!=(ParPosition const & pos1, ParPosition const & pos2)
 ///
 
 struct ParIterator::Pimpl {
-       typedef stack<ParPosition> PosHolder;
+       typedef vector<ParPosition> PosHolder;
        PosHolder positions;
 };
 
 ParIterator::ParIterator(ParagraphList::iterator pit, ParagraphList const & pl)
        : pimpl_(new Pimpl)
 {
-       pimpl_->positions.push(ParPosition(pit, pl));
+       pimpl_->positions.push_back(ParPosition(pit, pl));
 }
 
 
@@ -98,14 +100,14 @@ void ParIterator::operator=(ParIterator const & pi)
 ParIterator & ParIterator::operator++()
 {
        while (!pimpl_->positions.empty()) {
-               ParPosition & p = pimpl_->positions.top();
+               ParPosition & p = pimpl_->positions.back();
 
                // Does the current inset contain more "cells" ?
                if (p.index) {
                        ++(*p.index);
-                       ParagraphList * plist = p.it->getInset()->getParagraphs(*p.index);
+                       ParagraphList * plist = (*p.it)->inset->getParagraphs(*p.index);
                        if (plist && !plist->empty()) {
-                               pimpl_->positions.push(ParPosition(plist->begin(), *plist));
+                               pimpl_->positions.push_back(ParPosition(plist->begin(), *plist));
                                return *this;
                        }
                        ++(*p.it);
@@ -118,16 +120,16 @@ ParIterator & ParIterator::operator++()
                // Try to find the next inset that contains paragraphs
                InsetList::iterator end = p.pit->insetlist.end();
                for (; *p.it != end; ++(*p.it)) {
-                       ParagraphList * plist = p.it->getInset()->getParagraphs(0);
+                       ParagraphList * plist = (*p.it)->inset->getParagraphs(0);
                        if (plist && !plist->empty()) {
                                p.index.reset(0);
-                               pimpl_->positions.push(ParPosition(plist->begin(), *plist));
+                               pimpl_->positions.push_back(ParPosition(plist->begin(), *plist));
                                return *this;
                        }
                }
 
                // Try to go to the next paragarph
-               if (next(p.pit) != p.plist->end()
+               if (next(p.pit) != const_cast<ParagraphList*>(p.plist)->end()
                    || pimpl_->positions.size() == 1) {
                        ++p.pit;
                        p.index.reset();
@@ -137,21 +139,33 @@ ParIterator & ParIterator::operator++()
                }
 
                // Drop end and move up in the stack.
-               pimpl_->positions.pop();
+               pimpl_->positions.pop_back();
        }
        return *this;
 }
 
 
-ParagraphList::iterator ParIterator::operator*() const
+Paragraph & ParIterator::operator*() const
 {
-       return pimpl_->positions.top().pit;
+       return *pimpl_->positions.back().pit;
+}
+
+
+ParagraphList::iterator ParIterator::pit() const
+{
+       return pimpl_->positions.back().pit;
 }
 
 
 ParagraphList::iterator ParIterator::operator->() const
 {
-       return pimpl_->positions.top().pit;
+       return pimpl_->positions.back().pit;
+}
+
+
+ParagraphList::iterator ParIterator::outerPar() const
+{
+       return pimpl_->positions[0].pit;
 }
 
 
@@ -163,7 +177,7 @@ size_t ParIterator::size() const
 
 ParagraphList & ParIterator::plist() const
 {
-       return *const_cast<ParagraphList*>(pimpl_->positions.top().plist);
+       return *const_cast<ParagraphList*>(pimpl_->positions.back().plist);
 }
 
 
@@ -185,7 +199,7 @@ bool operator!=(ParIterator const & iter1, ParIterator const & iter2)
 
 
 struct ParConstIterator::Pimpl {
-       typedef stack<ParPosition> PosHolder;
+       typedef vector<ParPosition> PosHolder;
        PosHolder positions;
 };
 
@@ -194,7 +208,7 @@ ParConstIterator::ParConstIterator(ParagraphList::iterator pit,
                                   ParagraphList const & pl)
        : pimpl_(new Pimpl)
 {
-       pimpl_->positions.push(ParPosition(pit, pl));
+       pimpl_->positions.push_back(ParPosition(pit, pl));
 }
 
 
@@ -210,14 +224,14 @@ ParConstIterator::ParConstIterator(ParConstIterator const & pi)
 ParConstIterator & ParConstIterator::operator++()
 {
        while (!pimpl_->positions.empty()) {
-               ParPosition & p = pimpl_->positions.top();
+               ParPosition & p = pimpl_->positions.back();
 
                // Does the current inset contain more "cells" ?
                if (p.index) {
                        ++(*p.index);
-                       ParagraphList * plist = p.it->getInset()->getParagraphs(*p.index);
+                       ParagraphList * plist = (*p.it)->inset->getParagraphs(*p.index);
                        if (plist && !plist->empty()) {
-                               pimpl_->positions.push(ParPosition(plist->begin(), *plist));
+                               pimpl_->positions.push_back(ParPosition(plist->begin(), *plist));
                                return *this;
                        }
                        ++(*p.it);
@@ -230,16 +244,16 @@ ParConstIterator & ParConstIterator::operator++()
                // Try to find the next inset that contains paragraphs
                InsetList::iterator end = p.pit->insetlist.end();
                for (; *p.it != end; ++(*p.it)) {
-                       ParagraphList * plist = p.it->getInset()->getParagraphs(0);
+                       ParagraphList * plist = (*p.it)->inset->getParagraphs(0);
                        if (plist && !plist->empty()) {
                                p.index.reset(0);
-                               pimpl_->positions.push(ParPosition(plist->begin(), *plist));
+                               pimpl_->positions.push_back(ParPosition(plist->begin(), *plist));
                                return *this;
                        }
                }
 
                // Try to go to the next paragarph
-               if (next(p.pit) != p.plist->end()
+               if (next(p.pit) != const_cast<ParagraphList*>(p.plist)->end()
                    || pimpl_->positions.size() == 1) {
                        ++p.pit;
                        p.index.reset();
@@ -249,22 +263,34 @@ ParConstIterator & ParConstIterator::operator++()
                }
 
                // Drop end and move up in the stack.
-               pimpl_->positions.pop();
+               pimpl_->positions.pop_back();
        }
 
        return *this;
 }
 
 
-ParagraphList::iterator ParConstIterator::operator*() const
+Paragraph const & ParConstIterator::operator*() const
+{
+       return *pimpl_->positions.back().pit;
+}
+
+
+ParagraphList::const_iterator ParConstIterator::pit() const
+{
+       return pimpl_->positions.back().pit;
+}
+
+
+ParagraphList::const_iterator ParConstIterator::operator->() const
 {
-       return pimpl_->positions.top().pit;
+       return pimpl_->positions.back().pit;
 }
 
 
-ParagraphList::iterator ParConstIterator::operator->() const
+ParagraphList const & ParConstIterator::plist() const
 {
-       return pimpl_->positions.top().pit;
+       return *pimpl_->positions.back().plist;
 }