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

Reply via email to