]> git.lyx.org Git - lyx.git/blobdiff - src/PosIterator.h
more cursor dispatch
[lyx.git] / src / PosIterator.h
index 2fb5e4706a1892e34a5ea467c42e20f385afafc9..cc6107e368e169bc6c7be8163dc35fde92aebc1a 100644 (file)
 
 #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,
@@ -38,31 +35,41 @@ struct PosIteratorItem
 };
 
 
-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 &);
 
-#endif
 
+inline
+bool operator!=(PosIterator const & lhs, PosIterator const & rhs)
+{
+       return !(lhs == rhs);
+}
+
+#endif