// -*- 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 <stack>
+#include "ParagraphList.h"
-#include "paragraph.h"
+#include <boost/scoped_ptr.hpp>
-class ParPosition {
+class ParIterator {
public:
- ParPosition(Paragraph * p)
- : par(p), it(p->insetlist.begin()), index(-1) {}
///
- Paragraph * par;
+ ParIterator(ParagraphList::iterator pit, ParagraphList const & pl);
///
- InsetList::iterator it;
+ ~ParIterator();
///
- 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 {
-public:
+ ParIterator(ParIterator const &);
///
- typedef std::stack<ParPosition> PosHolder;
+ void operator=(ParIterator const &);
///
- ParIterator() {}
+ ParIterator & operator++();
///
- ParIterator(Paragraph * par) {
- positions.push(ParPosition(par));
- }
+ Paragraph & operator*() const;
///
- ParIterator & operator++();
+ ParagraphList::iterator operator->() const;
+ /// This gives us the top-most parent paragraph
+ ParagraphList::iterator outerPar() const;
///
- Paragraph * operator*() {
- return positions.top().par;
- }
+ ParagraphList::iterator pit() const;
///
- PosHolder::size_type size() const
- { return positions.size(); }
+ ParagraphList & plist() const;
+ ///
+ size_t size() const;
///
friend
bool operator==(ParIterator const & iter1, ParIterator const & iter2);
private:
- ///
- PosHolder positions;
+ struct Pimpl;
+ boost::scoped_ptr<Pimpl> pimpl_;
};
-
///
-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);
-}
+bool operator!=(ParIterator const & iter1, ParIterator const & iter2);
class ParConstIterator {
public:
///
- typedef std::stack<ParPosition> PosHolder;
+ ParConstIterator(ParagraphList::iterator pit, ParagraphList const & pl);
///
- ParConstIterator() {}
+ ~ParConstIterator();
///
- ParConstIterator(Paragraph * par) {
- positions.push(ParPosition(par));
- }
+ ParConstIterator(ParConstIterator const &);
///
ParConstIterator & operator++();
///
- Paragraph const * operator*() {
- return positions.top().par;
- }
+ ParagraphList::const_iterator pit() const;
+ ///
+ Paragraph const & operator*() const;
///
- PosHolder::size_type size() const
- { return positions.size(); }
+ ParagraphList::const_iterator operator->() const;
+
+ /// depth of nesting
+ size_t size() const;
///
friend
bool operator==(ParConstIterator const & iter1,
ParConstIterator const & iter2);
private:
- ///
- PosHolder positions;
+ struct Pimpl;
+ boost::scoped_ptr<Pimpl> pimpl_;
};
+bool operator==(ParConstIterator const & iter1,
+ ParConstIterator const & iter2);
-///
-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);
-}
+bool operator!=(ParConstIterator const & iter1,
+ ParConstIterator const & iter2);
#endif