]> git.lyx.org Git - lyx.git/blobdiff - src/iterators.h
fix mathed crash
[lyx.git] / src / iterators.h
index 712e3aed5c2a807bacca41348241902d42c0dfda..a68f7ff12d565886c7c732b4332edd0d79a214b0 100644 (file)
 // -*- C++ -*-
+/* \file iterators.h
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author unknown
+ * \author Lars Gullik Bjønnes
+ *
+ * Full author contact details are available in file CREDITS.
+ */
 
 #ifndef ITERATORS_H
 #define ITERATORS_H
 
+#include "ParagraphList_fwd.h"
+#include "InsetList.h"
+
+#include "support/types.h"
+
+#include <boost/optional.hpp>
+
 #include <vector>
 
-#include "paragraph.h"
+class LyXText;
+class InsetBase;
+class Cursor;
+class Buffer;
+class PosIterator;
+
 
 class ParPosition {
 public:
-       ParPosition(Paragraph * p)
-               : par(p), it(p->inset_iterator_begin()), index(-1) {}
        ///
-       Paragraph * par;
+       ParPosition(ParagraphList::iterator p, ParagraphList const & pl);
+       ///
+       ParagraphList::iterator pit;
        ///
-       Paragraph::inset_iterator it;
+       ParagraphList const * plist;
        ///
-       int index;
+       boost::optional<InsetList::iterator> it;
+       ///
+       boost::optional<int> index;
 };
 
 
-inline
-bool operator==(ParPosition const & pos1, ParPosition const & pos2) {
-       return pos1.par == pos2.par &&
-               pos1.it == pos2.it &&
-               pos1.index == pos2.index;
-}
-
-inline
-bool operator!=(ParPosition const & pos1, ParPosition const & pos2) {
-       return !(pos1 == pos2);
-}
-
-
-class ParIterator {
+class ParIterator  : public std::iterator<
+       std::forward_iterator_tag,
+       ParagraphList::value_type> {
 public:
        ///
-       ParIterator() {}
-       //
-       ParIterator(Paragraph * par) 
-               : positions(1, ParPosition(par)) {}
+       ParIterator(ParagraphList::iterator pit, ParagraphList const & pl);
+       ///
+       ~ParIterator();
+       ///
+       ParIterator(ParIterator const &);
+       ///
+       ParIterator(PosIterator const &);
+       ///
+       void operator=(ParIterator const &);
        ///
        ParIterator & operator++();
        ///
-       Paragraph * operator*() { return positions.back().par; }
+       Paragraph & operator*() const;
        ///
-       std::vector<ParPosition>::size_type size() const 
-               { return positions.size(); }
+       ParagraphList::iterator operator->() const;
+       /// This gives us the top-most parent paragraph
+       ParagraphList::iterator outerPar() const;
        ///
-       friend
-       bool operator==(ParIterator const & iter1, ParIterator const & iter2);
-private:
+       ParagraphList::iterator pit() const;
+       ///
+       ParagraphList & plist() const;
+       /// returns 'innermost' LyXText
+       LyXText * text(Buffer &) const;
+       /// returns innermost inset
+       InsetBase * inset() const;
+       /// returns index of cell in innermost inset
+       int index() const;
        ///
-       std::vector<ParPosition> positions;
+       size_t size() const;
+
+       typedef std::vector<ParPosition> PosHolder;
+       PosHolder const & positions() const
+       {
+               return positions_;
+       }
+private:
+       PosHolder positions_;
 };
 
+///
+bool operator==(ParIterator const & iter1, ParIterator const & iter2);
 
 ///
-inline
-bool operator==(ParIterator const & iter1, ParIterator const & iter2) {
-       return iter1.positions == iter2.positions;
-}
+bool operator!=(ParIterator const & iter1, ParIterator const & iter2);
 
 
-///
-inline
-bool operator!=(ParIterator const & iter1, ParIterator const & iter2) {
-       return !(iter1 == iter2);
-}
+class ParConstIterator : public std::iterator<
+       std::forward_iterator_tag,
+       ParagraphList::value_type> {
+public:
+       ///
+       ParConstIterator(ParagraphList::iterator pit, ParagraphList const & pl);
+       ///
+       ~ParConstIterator();
+       ///
+       ParConstIterator(ParConstIterator const &);
+       ///
+       ParConstIterator & operator++();
+       ///
+       ParagraphList::const_iterator pit() const;
+       ///
+       Paragraph const & operator*() const;
+       ///
+       ParagraphList::const_iterator operator->() const;
+       ///
+       ParagraphList const & plist() const;
+
+       /// depth of nesting
+       size_t size() const;
+       typedef std::vector<ParPosition> PosHolder;
+       PosHolder const & positions() const
+       {
+               return positions_;
+       }
+private:
+       PosHolder positions_;
+};
+
+bool operator==(ParConstIterator const & iter1,
+               ParConstIterator const & iter2);
+
+bool operator!=(ParConstIterator const & iter1,
+               ParConstIterator const & iter2);
 
 #endif