I have this patch... IMHO cleans up a bit. Objections?
? Config ? advdist.diff ? positer.diff Index: src/PosIterator.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/PosIterator.C,v retrieving revision 1.10 diff -u -p -b -r1.10 PosIterator.C --- src/PosIterator.C 26 Jan 2004 17:00:09 -0000 1.10 +++ src/PosIterator.C 27 Jan 2004 11:15:20 -0000 @@ -25,9 +25,58 @@ #include <boost/next_prior.hpp> + using boost::prior; +PosIterator::PosIterator(ParagraphList * pl, ParagraphList::iterator pit, + lyx::pos_type pos) +{ + stack_.push_back(PosIteratorItem(pl, pit, pos)); +} + + +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; + } + setFrom(par, pos); +} + + +PosIterator::PosIterator(ParIterator const & par, lyx::pos_type pos) +{ + setFrom(par, pos); +} + + +void PosIterator::setFrom(ParIterator const & par, lyx::pos_type pos) +{ + BOOST_ASSERT(par.size() > 0); + + ParIterator::PosHolder const & ph = par.positions(); + + int const last = par.size() - 1; + for (int i = 0; i < last; ++i) { + ParPosition const & pp = ph[i]; + stack_.push_back( + PosIteratorItem(const_cast<ParagraphList *>(pp.plist), + pp.pit, (*pp.it)->pos, *pp.index + 1)); + } + ParPosition const & pp = ph[last]; + stack_.push_back( + PosIteratorItem(const_cast<ParagraphList *>(pp.plist), pp.pit, pos, 0)); +} + + PosIterator & PosIterator::operator++() { BOOST_ASSERT(!stack_.empty()); @@ -97,15 +146,8 @@ PosIterator & PosIterator::operator--() } -bool operator!=(PosIterator const & lhs, PosIterator const & rhs) -{ - return !(lhs == rhs); -} - - bool operator==(PosIterator const & lhs, PosIterator const & rhs) { - PosIteratorItem const & li = lhs.stack_.back(); PosIteratorItem const & ri = rhs.stack_.back(); @@ -117,30 +159,6 @@ bool operator==(PosIterator const & lhs, bool PosIterator::at_end() const { return pos() == pit()->size(); -} - - -PosIterator::PosIterator(ParagraphList * pl, ParagraphList::iterator pit, - lyx::pos_type pos) -{ - stack_.push_back(PosIteratorItem(pl, pit, pos)); -} - - -PosIterator::PosIterator(BufferView & bv) -{ - LyXText * text = bv.getLyXText(); - lyx::pos_type pos = bv.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: src/PosIterator.h =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/PosIterator.h,v retrieving revision 1.7 diff -u -p -b -r1.7 PosIterator.h --- src/PosIterator.h 26 Jan 2004 17:00:09 -0000 1.7 +++ src/PosIterator.h 27 Jan 2004 11:15:20 -0000 @@ -39,11 +39,13 @@ 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, 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 &); @@ -52,17 +54,22 @@ public: lyx::pos_type pos() const { return stack_.back().pos; } bool at_end() const; InsetBase * inset() const; - friend PosIterator ParIterator::asPosIterator(lyx::pos_type) const; friend ParIterator::ParIterator(PosIterator const &); - private: - PosIterator() {}; - //this is conceptually a stack, but we need random access sometimes + 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 &); + + +inline +bool operator!=(PosIterator const & lhs, PosIterator const & rhs) +{ + return !(lhs == rhs); +} #endif Index: src/iterators.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/iterators.C,v retrieving revision 1.40 diff -u -p -b -r1.40 iterators.C --- src/iterators.C 26 Jan 2004 10:13:08 -0000 1.40 +++ src/iterators.C 27 Jan 2004 11:15:20 -0000 @@ -24,30 +24,13 @@ #include "insets/insettext.h" #include <boost/next_prior.hpp> -#include <boost/optional.hpp> using boost::next; -using boost::optional; -using std::vector; /// /// ParPosition /// -class ParPosition { -public: - /// - ParPosition(ParagraphList::iterator p, ParagraphList const & pl); - /// - ParagraphList::iterator pit; - /// - ParagraphList const * plist; - /// - optional<InsetList::iterator> it; - /// - optional<int> index; -}; - ParPosition::ParPosition(ParagraphList::iterator p, ParagraphList const & pl) : pit(p), plist(&pl) @@ -74,15 +57,9 @@ bool operator!=(ParPosition const & pos1 /// ParIterator /// -struct ParIterator::Pimpl { - typedef vector<ParPosition> PosHolder; - PosHolder positions; -}; - ParIterator::ParIterator(ParagraphList::iterator pit, ParagraphList const & pl) - : pimpl_(new Pimpl) { - pimpl_->positions.push_back(ParPosition(pit, pl)); + positions_.push_back(ParPosition(pit, pl)); } @@ -91,21 +68,21 @@ ParIterator::~ParIterator() ParIterator::ParIterator(ParIterator const & pi) - : pimpl_(new Pimpl(*pi.pimpl_)) + : positions_(pi.positions_) {} void ParIterator::operator=(ParIterator const & pi) { ParIterator tmp(pi); - pimpl_.swap(tmp.pimpl_); + swap(positions_ , tmp.positions_); } ParIterator & ParIterator::operator++() { - while (!pimpl_->positions.empty()) { - ParPosition & p = pimpl_->positions.back(); + while (!positions_.empty()) { + ParPosition & p = positions_.back(); // Does the current inset contain more "cells" ? if (p.index) { @@ -113,7 +90,7 @@ ParIterator & ParIterator::operator++() if (LyXText * text = (*p.it)->inset->getText(*p.index)) { ParagraphList & plist = text->paragraphs(); if (!plist.empty()) { - pimpl_->positions.push_back(ParPosition(plist.begin(), plist)); + positions_.push_back(ParPosition(plist.begin(), plist)); return *this; } } @@ -132,7 +109,7 @@ ParIterator & ParIterator::operator++() ParagraphList & plist = text->paragraphs(); if (!plist.empty()) { p.index.reset(0); - pimpl_->positions.push_back(ParPosition(plist.begin(), plist)); + positions_.push_back(ParPosition(plist.begin(), plist)); return *this; } } @@ -140,7 +117,7 @@ ParIterator & ParIterator::operator++() // Try to go to the next paragarph if (next(p.pit) != const_cast<ParagraphList*>(p.plist)->end() - || pimpl_->positions.size() == 1) { + || positions_.size() == 1) { ++p.pit; p.index.reset(); p.it.reset(); @@ -149,7 +126,7 @@ ParIterator & ParIterator::operator++() } // Drop end and move up in the stack. - pimpl_->positions.pop_back(); + positions_.pop_back(); } return *this; } @@ -157,74 +134,107 @@ ParIterator & ParIterator::operator++() LyXText * ParIterator::text(Buffer & buf) const { - //lyxerr << "positions.size: " << pimpl_->positions.size() << std::endl; - if (pimpl_->positions.size() <= 1) + //lyxerr << "positions.size: " << positions.size() << std::endl; + if (positions_.size() <= 1) return &buf.text(); - ParPosition const & pos = pimpl_->positions[pimpl_->positions.size() - 2]; + ParPosition const & pos = positions_[positions_.size() - 2]; return (*pos.it)->inset->getText(*pos.index); } InsetBase * ParIterator::inset() const { - //lyxerr << "positions.size: " << pimpl_->positions.size() << std::endl; - if (pimpl_->positions.size() <= 1) + //lyxerr << "positions.size: " << positions.size() << std::endl; + if (positions_.size() <= 1) return 0; - ParPosition const & pos = pimpl_->positions[pimpl_->positions.size() - 2]; + ParPosition const & pos = positions_[positions_.size() - 2]; return (*pos.it)->inset; } int ParIterator::index() const { - if (pimpl_->positions.size() <= 1) + if (positions_.size() <= 1) return 0; - return *(pimpl_->positions[pimpl_->positions.size() - 2].index); + return *(positions_[positions_.size() - 2].index); } Paragraph & ParIterator::operator*() const { - return *pimpl_->positions.back().pit; + return *positions_.back().pit; } ParagraphList::iterator ParIterator::pit() const { - return pimpl_->positions.back().pit; + return positions_.back().pit; } ParagraphList::iterator ParIterator::operator->() const { - return pimpl_->positions.back().pit; + return positions_.back().pit; } ParagraphList::iterator ParIterator::outerPar() const { - return pimpl_->positions[0].pit; + return positions_[0].pit; } size_t ParIterator::size() const { - return pimpl_->positions.size(); + return positions_.size(); } ParagraphList & ParIterator::plist() const { - return *const_cast<ParagraphList*>(pimpl_->positions.back().plist); + return *const_cast<ParagraphList*>(positions_.back().plist); +} + + +ParIterator::ParIterator(PosIterator const & pos) +{ + int const size = pos.stack_.size(); + + for (int i = 0; i < size; ++i) { + PosIteratorItem const & it = pos.stack_[i]; + ParPosition pp(it.pit, *it.pl); + if (i < size - 1) { + InsetBase * inset = it.pit->getInset(it.pos); + BOOST_ASSERT(inset); + InsetList::iterator beg = it.pit->insetlist.begin(); + InsetList::iterator end = it.pit->insetlist.end(); + for ( ; beg != end && beg->inset != inset; ++beg) + ; + pp.it.reset(beg); + pp.index.reset(it.index - 1); + } + positions_.push_back(pp); + } +} + + +void ParIterator::lockPath(BufferView * bv) const +{ + LCursor & cur = bv->cursor(); + cur.cursor_.clear(); + int const last = size() - 1; + for (int i = 0; i < last; ++i) + (*positions_[i].it)->inset->edit(cur, true); + cur.resetAnchor(); } bool operator==(ParIterator const & iter1, ParIterator const & iter2) { - return iter1.pimpl_->positions == iter2.pimpl_->positions; + return iter1.positions() == iter2.positions(); } @@ -239,17 +249,10 @@ bool operator!=(ParIterator const & iter /// -struct ParConstIterator::Pimpl { - typedef vector<ParPosition> PosHolder; - PosHolder positions; -}; - - ParConstIterator::ParConstIterator(ParagraphList::iterator pit, ParagraphList const & pl) - : pimpl_(new Pimpl) { - pimpl_->positions.push_back(ParPosition(pit, pl)); + positions_.push_back(ParPosition(pit, pl)); } @@ -258,14 +261,14 @@ ParConstIterator::~ParConstIterator() ParConstIterator::ParConstIterator(ParConstIterator const & pi) - : pimpl_(new Pimpl(*pi.pimpl_)) + : positions_(pi.positions_) {} ParConstIterator & ParConstIterator::operator++() { - while (!pimpl_->positions.empty()) { - ParPosition & p = pimpl_->positions.back(); + while (!positions_.empty()) { + ParPosition & p = positions_.back(); // Does the current inset contain more "cells" ? if (p.index) { @@ -273,7 +276,7 @@ ParConstIterator & ParConstIterator::ope if (LyXText * text = (*p.it)->inset->getText(*p.index)) { ParagraphList & plist = text->paragraphs(); if (!plist.empty()) { - pimpl_->positions.push_back(ParPosition(plist.begin(), plist)); + positions_.push_back(ParPosition(plist.begin(), plist)); return *this; } } @@ -292,7 +295,7 @@ ParConstIterator & ParConstIterator::ope ParagraphList & plist = text->paragraphs(); if (!plist.empty()) { p.index.reset(0); - pimpl_->positions.push_back(ParPosition(plist.begin(), plist)); + positions_.push_back(ParPosition(plist.begin(), plist)); return *this; } } @@ -300,7 +303,7 @@ ParConstIterator & ParConstIterator::ope // Try to go to the next paragarph if (next(p.pit) != const_cast<ParagraphList*>(p.plist)->end() - || pimpl_->positions.size() == 1) { + || positions_.size() == 1) { ++p.pit; p.index.reset(); p.it.reset(); @@ -309,7 +312,7 @@ ParConstIterator & ParConstIterator::ope } // Drop end and move up in the stack. - pimpl_->positions.pop_back(); + positions_.pop_back(); } return *this; @@ -318,92 +321,41 @@ ParConstIterator & ParConstIterator::ope Paragraph const & ParConstIterator::operator*() const { - return *pimpl_->positions.back().pit; + return *positions_.back().pit; } ParagraphList::const_iterator ParConstIterator::pit() const { - return pimpl_->positions.back().pit; + return positions_.back().pit; } ParagraphList::const_iterator ParConstIterator::operator->() const { - return pimpl_->positions.back().pit; + return positions_.back().pit; } ParagraphList const & ParConstIterator::plist() const { - return *pimpl_->positions.back().plist; + return *positions_.back().plist; } size_t ParConstIterator::size() const { - return pimpl_->positions.size(); + return positions_.size(); } bool operator==(ParConstIterator const & iter1, ParConstIterator const & iter2) { - return iter1.pimpl_->positions == iter2.pimpl_->positions; + return iter1.positions() == iter2.positions(); } bool operator!=(ParConstIterator const & iter1, ParConstIterator const & iter2) { return !(iter1 == iter2); -} - - -PosIterator ParIterator::asPosIterator(lyx::pos_type pos) const -{ - PosIterator p; - - int const last = size() - 1; - for (int i = 0; i < last; ++i) { - ParPosition & pp = pimpl_->positions[i]; - p.stack_.push_back( - PosIteratorItem(const_cast<ParagraphList *>(pp.plist), - pp.pit, (*pp.it)->pos, *pp.index + 1)); - } - ParPosition const & pp = pimpl_->positions[last]; - p.stack_.push_back( - PosIteratorItem(const_cast<ParagraphList *>(pp.plist), pp.pit, pos, 0)); - return p; -} - - -ParIterator::ParIterator(PosIterator const & pos) - : pimpl_(new Pimpl) -{ - int const size = pos.stack_.size(); - - for (int i = 0; i < size; ++i) { - PosIteratorItem const & it = pos.stack_[i]; - ParPosition pp(it.pit, *it.pl); - if (i < size - 1) { - InsetBase * inset = it.pit->getInset(it.pos); - BOOST_ASSERT(inset); - InsetList::iterator beg = it.pit->insetlist.begin(); - InsetList::iterator end = it.pit->insetlist.end(); - for ( ; beg != end && beg->inset != inset; ++beg) - ; - pp.it.reset(beg); - pp.index.reset(it.index - 1); - } - pimpl_->positions.push_back(pp); - } -} - - -void ParIterator::lockPath(BufferView * bv) const -{ - LCursor & cur = bv->cursor(); - cur.cursor_.clear(); - for (int i = 0, last = size() - 1; i < last; ++i) - (*pimpl_->positions[i].it)->inset->edit(cur, true); - cur.resetAnchor(); } Index: src/iterators.h =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/iterators.h,v retrieving revision 1.27 diff -u -p -b -r1.27 iterators.h --- src/iterators.h 26 Jan 2004 17:00:09 -0000 1.27 +++ src/iterators.h 27 Jan 2004 11:15:20 -0000 @@ -13,9 +13,13 @@ #define ITERATORS_H #include "ParagraphList_fwd.h" +#include "InsetList.h" + #include "support/types.h" -#include <boost/scoped_ptr.hpp> +#include <boost/optional.hpp> + +#include <vector> class LyXText; class InsetBase; @@ -25,6 +29,21 @@ class BufferView; class PosIterator; +class ParPosition { +public: + /// + ParPosition(ParagraphList::iterator p, ParagraphList const & pl); + /// + ParagraphList::iterator pit; + /// + ParagraphList const * plist; + /// + boost::optional<InsetList::iterator> it; + /// + boost::optional<int> index; +}; + + class ParIterator : public std::iterator< std::forward_iterator_tag, ParagraphList::value_type> { @@ -60,16 +79,15 @@ public: /// size_t size() const; /// - friend - bool operator==(ParIterator const & iter1, ParIterator const & iter2); - /// void lockPath(BufferView *) const; - /// - PosIterator asPosIterator(lyx::pos_type) const; + typedef std::vector<ParPosition> PosHolder; + PosHolder const & positions() const + { + return positions_; + } private: - struct Pimpl; - boost::scoped_ptr<Pimpl> pimpl_; + PosHolder positions_; }; /// @@ -102,14 +120,13 @@ public: /// depth of nesting size_t size() const; - /// - friend - bool operator==(ParConstIterator const & iter1, - ParConstIterator const & iter2); - + typedef std::vector<ParPosition> PosHolder; + PosHolder const & positions() const + { + return positions_; + } private: - struct Pimpl; - boost::scoped_ptr<Pimpl> pimpl_; + PosHolder positions_; }; bool operator==(ParConstIterator const & iter1, Index: src/frontends/controllers/ControlErrorList.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/controllers/ControlErrorList.C,v retrieving revision 1.17 diff -u -p -b -r1.17 ControlErrorList.C --- src/frontends/controllers/ControlErrorList.C 14 Jan 2004 17:21:38 -0000 1.17 +++ src/frontends/controllers/ControlErrorList.C 27 Jan 2004 11:15:20 -0000 @@ -73,6 +73,6 @@ void ControlErrorList::goTo(int item) int const range = end - start; // Now make the selection. - PosIterator const pos = pit.asPosIterator(start); + PosIterator const pos(pit, start); kernel().bufferview()->putSelectionAt(pos, range, false); }
-- Lgb