Alfredo Braunstein wrote: > Is this ok (attached)?
oops wrong patch (I sent the same old one). Hmmmm... retry. > a > > PosIterator ParIterator::asPosIterator(lyx::pos_type) > > member, made friend in class PosIterator Alfredo
? PosIterator.C-save ? PosIterator.h-save ? all.diff ? bfs.cpp ? files ? save ? frontends/screen.C-save Index: Makefile.am =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/Makefile.am,v retrieving revision 1.197 diff -u -p -u -r1.197 Makefile.am --- Makefile.am 29 Oct 2003 10:47:12 -0000 1.197 +++ Makefile.am 2 Nov 2003 16:44:35 -0000 @@ -228,6 +228,8 @@ lyx_SOURCES = \ paragraph.h \ paragraph_pimpl.C \ paragraph_pimpl.h \ + PosIterator.h \ + PosIterator.C \ SpellBase.h \ ispell.C \ ispell.h \ Index: PosIterator.C =================================================================== RCS file: PosIterator.C diff -N PosIterator.C --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ PosIterator.C 2 Nov 2003 16:44:35 -0000 @@ -0,0 +1,149 @@ +/* \file PosIterator.C + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. + * + * \author Alfredo Braunstein + * + * Full author contact details are available in file CREDITS. + */ + + +#include <config.h> + +#include "PosIterator.h" + +#include "buffer.h" +#include "BufferView.h" +#include "iterators.h" +#include "lyxtext.h" +#include "paragraph.h" + +#include "insets/insettext.h" +#include "insets/updatableinset.h" +#include "insets/inset.h" + +#include <boost/next_prior.hpp> + +using boost::prior; + +PosIterator & PosIterator::operator++() +{ + BOOST_ASSERT(!stack_.empty()); + while (true) { + PosIteratorItem & p = stack_.top(); + + if (p.pos < p.pit->size()) { + InsetOld * inset = p.pit->getInset(p.pos); + if (inset) { + ParagraphList * pl = inset->getParagraphs(p.index); + if (pl) { + p.index++; + stack_.push(PosIteratorItem(pl)); + return *this; + } + } + p.index = 0; + ++p.pos; + } else { + ++p.pit; + p.pos = 0; + } + + if (p.pit != p.pl->end() || stack_.size() == 1) + return *this; + + stack_.pop(); + } + return *this; +} + + +PosIterator & PosIterator::operator--() +{ + BOOST_ASSERT(!stack_.empty()); + + // try to go one position backwards: if on the start of the + // ParagraphList, pops an item + PosIteratorItem & p = stack_.top(); + if (p.pos > 0) { + --p.pos; + InsetOld * inset = p.pit->getInset(p.pos); + if (inset) + p.index = inset->numParagraphs(); + } else { + if (p.pit == p.pl->begin()) { + if (stack_.size() == 1) + return *this; + stack_.pop(); + --stack_.top().index; + } else { + --p.pit; + p.pos = p.pit->size(); + } + } + // try to push an item if there is some left unexplored + PosIteratorItem & q = stack_.top(); + if (q.pos < q.pit->size()) { + InsetOld * inset = q.pit->getInset(q.pos); + if (inset && q.index > 0) { + ParagraphList * + pl = inset->getParagraphs(q.index - 1); + BOOST_ASSERT(pl); + stack_.push(PosIteratorItem(pl, prior(pl->end()), pl->back().size())); + } + } + return *this; +} + + +bool PosIterator::operator!=(PosIterator const & a) const +{ + return !operator==(a); +} + + +bool PosIterator::operator==(PosIterator const & a) const +{ + + PosIteratorItem const & pa = a.stack_.top(); + PosIteratorItem const & p = stack_.top(); + + return (pa.pl == p.pl && pa.pit == p.pit && + (p.pit == p.pl->end() || pa.pos == p.pos)); +} + + +bool PosIterator::at_end() const +{ + return pos() == pit()->size(); +} + + +PosIterator::PosIterator(ParagraphList * pl, ParagraphList::iterator pit, + lyx::pos_type pos) +{ + stack_.push(PosIteratorItem(pl, pit, pos)); +} + + +PosIterator::PosIterator(ParagraphList * pl) +{ + stack_.push(PosIteratorItem(pl, pl->begin(), 0)); +} + + +PosIterator::PosIterator(BufferView & bv) +{ + LyXText * text = bv.getLyXText(); + lyx::pos_type pos = text->cursor.pos(); + ParagraphList::iterator pit = text->cursorPar(); + + ParIterator par = bv.buffer()->par_iterator_begin(); + ParIterator end = bv.buffer()->par_iterator_end(); + for ( ; par != end; ++par) { + if (par.pit() == pit) + break; + } + + operator=(par.asPosIterator(pos)); +} Index: PosIterator.h =================================================================== RCS file: PosIterator.h diff -N PosIterator.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ PosIterator.h 2 Nov 2003 16:44:35 -0000 @@ -0,0 +1,67 @@ +// -*- C++ -*- +/* \file PosIterator.h + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. + * + * \author Alfredo Braunstein + * + * Full author contact details are available in file CREDITS. + */ + +#ifndef POSITERATOR_H +#define POSITERATOR_H + +#include "ParagraphList_fwd.h" + +#include "iterators.h" + +#include "support/types.h" + +#include <stack> + + +class BufferView; + +struct PosIteratorItem +{ + PosIteratorItem(ParagraphList * pl): pl(pl), pit(pl->begin()), + pos(0), index(0) {}; + PosIteratorItem(ParagraphList * pl, + ParagraphList::iterator pit, + lyx::pos_type pos, + int index = 0) + : pl(pl), pit(pit), pos(pos), index(index) {}; + ParagraphList * pl; + ParagraphList::iterator pit; + lyx::pos_type pos; + int index; +}; + + +class PosIterator +{ +public: + 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 & operator++(); + PosIterator & operator--(); + bool operator!=(PosIterator const &) const; + bool operator==(PosIterator const &) const; + + ParagraphList::iterator pit() const { return stack_.top().pit; } + lyx::pos_type pos() const { return stack_.top().pos; } + bool at_end() const; + friend PosIterator ParIterator::asPosIterator(lyx::pos_type); + +private: + PosIterator() {}; + std::stack<PosIteratorItem> stack_; +}; + + +#endif + Index: buffer.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/buffer.C,v retrieving revision 1.538 diff -u -p -u -r1.538 buffer.C --- buffer.C 31 Oct 2003 18:45:34 -0000 1.538 +++ buffer.C 2 Nov 2003 16:44:37 -0000 @@ -36,6 +36,7 @@ #include "paragraph.h" #include "paragraph_funcs.h" #include "ParagraphParameters.h" +#include "PosIterator.h" #include "sgml.h" #include "texrow.h" #include "undo.h" @@ -1469,6 +1470,18 @@ bool Buffer::hasParWithID(int id) const return true; return false; +} + + +PosIterator Buffer::pos_iterator_begin() +{ + return PosIterator(¶graphs(), paragraphs().begin(), 0); +} + + +PosIterator Buffer::pos_iterator_end() +{ + return PosIterator(¶graphs(), paragraphs().end(), 0); } Index: buffer.h =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/buffer.h,v retrieving revision 1.170 diff -u -p -u -r1.170 buffer.h --- buffer.h 31 Oct 2003 18:45:34 -0000 1.170 +++ buffer.h 2 Nov 2003 16:44:38 -0000 @@ -40,6 +40,7 @@ class LatexRunParams; class Language; class Messages; class ParIterator; +class PosIterator; class ParConstIterator; class TeXErrors; class TexRow; @@ -345,6 +346,10 @@ public: /// return the const end of all *top-level* insets in the buffer inset_iterator inset_const_iterator_end() const; + /// + PosIterator pos_iterator_begin(); + /// + PosIterator pos_iterator_end(); /// ParIterator par_iterator_begin(); /// Index: iterators.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/iterators.C,v retrieving revision 1.23 diff -u -p -u -r1.23 iterators.C --- iterators.C 29 Oct 2003 12:18:06 -0000 1.23 +++ iterators.C 2 Nov 2003 16:44:38 -0000 @@ -13,8 +13,10 @@ #include "iterators.h" #include "paragraph.h" +#include "PosIterator.h" #include "cursor.h" + #include "insets/inset.h" #include <boost/next_prior.hpp> @@ -355,4 +357,21 @@ bool operator==(ParConstIterator const & bool operator!=(ParConstIterator const & iter1, ParConstIterator const & iter2) { return !(iter1 == iter2); +} + + +PosIterator ParIterator::asPosIterator(lyx::pos_type pos) +{ + PosIterator p; + + int const last = size() - 1; + for (int i = 0; i < last; ++i) { + ParPosition & pp = pimpl_->positions[i]; + p.stack_.push(PosIteratorItem(const_cast<ParagraphList *>(pp.plist), + pp.pit, (*pp.it)->pos, *pp.index + 1)); + } + ParPosition const & pp = pimpl_->positions[last]; + p.stack_.push(PosIteratorItem(const_cast<ParagraphList *>(pp.plist), + pp.pit, pos, 0)); + return p; } Index: iterators.h =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/iterators.h,v retrieving revision 1.19 diff -u -p -u -r1.19 iterators.h --- iterators.h 29 Oct 2003 12:18:06 -0000 1.19 +++ iterators.h 2 Nov 2003 16:44:39 -0000 @@ -13,12 +13,15 @@ #define ITERATORS_H #include "ParagraphList_fwd.h" +#include "support/types.h" #include <boost/scoped_ptr.hpp> class LyXText; class InsetOld; class Cursor; +class PosIterator; + class ParIterator { public: @@ -56,6 +59,9 @@ public: /// friend bool operator==(ParIterator const & iter1, ParIterator const & iter2); + + /// + PosIterator asPosIterator(lyx::pos_type); private: struct Pimpl; boost::scoped_ptr<Pimpl> pimpl_; @@ -93,6 +99,7 @@ public: friend bool operator==(ParConstIterator const & iter1, ParConstIterator const & iter2); + private: struct Pimpl; boost::scoped_ptr<Pimpl> pimpl_;