]> git.lyx.org Git - lyx.git/blobdiff - src/iterators.h
another safety belt
[lyx.git] / src / iterators.h
index 148eda029ceabff7a47c8fbdea8794230d70f10a..8bc2128a08c297b9a7fb7e3aa855421c86221704 100644 (file)
@@ -3,18 +3,18 @@
 #ifndef ITERATORS_H
 #define ITERATORS_H
 
-#include <vector>
+#include <stack>
 
 #include "paragraph.h"
 
 class ParPosition {
 public:
        ParPosition(Paragraph * p)
-               : par(p), it(p->inset_iterator_begin()), index(-1) {}
+               : par(p), it(p->insetlist.begin()), index(-1) {}
        ///
        Paragraph * par;
        ///
-       Paragraph::inset_iterator it;
+       InsetList::iterator it;
        ///
        int index;
 };
@@ -35,24 +35,29 @@ bool operator!=(ParPosition const & pos1, ParPosition const & pos2) {
 
 class ParIterator {
 public:
+       ///
+       typedef std::stack<ParPosition> PosHolder;
        ///
        ParIterator() {}
-       //
-       ParIterator(Paragraph * par) 
-               : positions(1, ParPosition(par)) {}
+       ///
+       ParIterator(Paragraph * par) {
+               positions.push(ParPosition(par));
+       }
        ///
        ParIterator & operator++();
        ///
-       Paragraph * operator*() { return positions.back().par; }
+       Paragraph * operator*() {
+               return positions.top().par;
+       }
        ///
-       vector<ParPosition>::size_type size() const 
+       PosHolder::size_type size() const
                { return positions.size(); }
        ///
        friend
        bool operator==(ParIterator const & iter1, ParIterator const & iter2);
 private:
        ///
-       std::vector<ParPosition> positions;
+       PosHolder positions;
 };
 
 
@@ -69,4 +74,46 @@ bool operator!=(ParIterator const & iter1, ParIterator const & iter2) {
        return !(iter1 == iter2);
 }
 
+
+class ParConstIterator {
+public:
+       ///
+       typedef std::stack<ParPosition> PosHolder;
+       ///
+       ParConstIterator() {}
+       ///
+       ParConstIterator(Paragraph * par) {
+               positions.push(ParPosition(par));
+       }
+       ///
+       ParConstIterator & operator++();
+       ///
+       Paragraph const * operator*() {
+               return positions.top().par;
+       }
+       ///
+       PosHolder::size_type size() const
+               { return positions.size(); }
+       ///
+       friend
+       bool operator==(ParConstIterator const & iter1,
+                       ParConstIterator const & iter2);
+private:
+       ///
+       PosHolder positions;
+};
+
+
+///
+inline
+bool operator==(ParConstIterator const & iter1, ParConstIterator const & iter2) {
+       return iter1.positions == iter2.positions;
+}
+
+///
+inline
+bool operator!=(ParConstIterator const & iter1, ParConstIterator const & iter2) {
+       return !(iter1 == iter2);
+}
+
 #endif