#include "support/types.h"
-#include <stack>
+#include <vector>
class BufferView;
-struct PosIteratorItem
-{
- PosIteratorItem(ParagraphList * pl): pl(pl), pit(pl->begin()),
- pos(0), index(0) {};
+struct PosIteratorItem {
PosIteratorItem(ParagraphList * pl,
ParagraphList::iterator pit,
lyx::pos_type pos,
};
-class PosIterator
-{
+class PosIterator : public std::iterator<
+ std::bidirectional_iterator_tag,
+ ParagraphList::value_type> {
public:
+ // Creates a singular.
+ PosIterator() {};
+
PosIterator(BufferView & bv);
- PosIterator(ParIterator & par, lyx::pos_type pos);
- PosIterator(ParagraphList * pl);
PosIterator(ParagraphList * pl, ParagraphList::iterator pit,
lyx::pos_type pos);
- PosIterator(ParIterator const & parit, lyx::pos_type p);
+ PosIterator(ParIterator const & par, lyx::pos_type pos);
PosIterator & operator++();
PosIterator & operator--();
friend bool operator==(PosIterator const &, PosIterator const &);
- ParagraphList::iterator pit() const { return stack_.top().pit; }
- lyx::pos_type pos() const { return stack_.top().pos; }
+ ParagraphList::iterator pit() const { return stack_.back().pit; }
+ lyx::pos_type pos() const { return stack_.back().pos; }
bool at_end() const;
- friend PosIterator ParIterator::asPosIterator(lyx::pos_type) const;
-
+ InsetBase * inset() const;
+ friend ParIterator::ParIterator(PosIterator const &);
private:
- PosIterator() {};
- std::stack<PosIteratorItem> stack_;
+ void setFrom(ParIterator const & par, lyx::pos_type pos);
+ // This is conceptually a stack,
+ // but we need random access sometimes.
+ std::vector<PosIteratorItem> stack_;
};
-bool operator!=(PosIterator const &, PosIterator const &);
+
bool operator==(PosIterator const &, PosIterator const &);
-int distance(PosIterator const &, PosIterator const &);
-void advance(PosIterator &, int);
-#endif
+inline
+bool operator!=(PosIterator const & lhs, PosIterator const & rhs)
+{
+ return !(lhs == rhs);
+}
+#endif