// -*- 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