Please review this and comment.

? build
Index: src/BufferView2.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/BufferView2.C,v
retrieving revision 1.139
diff -u -p -r1.139 BufferView2.C
--- src/BufferView2.C	10 Aug 2002 15:20:56 -0000	1.139
+++ src/BufferView2.C	10 Aug 2002 17:48:27 -0000
@@ -191,19 +191,20 @@ bool BufferView::removeAutoInsets()
 			}
 		}
 
-		Paragraph::inset_iterator pit = par->inset_iterator_begin();
-		Paragraph::inset_iterator pend = par->inset_iterator_end();
+		InsetList::iterator pit = par->insetlist.begin();
+		InsetList::iterator pend = par->insetlist.end();
+
 		while (pit != pend) {
-			if (pit->autoDelete()) {
+			if (pit.getInset()->autoDelete()) {
 				removed = true;
 				pos_type const pos = pit.getPos();
 
 				par->erase(pos);
 				// We just invalidated par's inset iterators so
 				// we get the next valid iterator position
-				pit = par->InsetIterator(pos);
+				pit = par->insetlist.insetIterator(pos);
 				// and ensure we have a valid end iterator.
-				pend = par->inset_iterator_end();
+				pend = par->insetlist.end();
 
 				if (cursor_par == par) {
 					// update the saved cursor position
@@ -523,20 +524,20 @@ bool BufferView::lockInset(UpdatableInse
 		// Then do a deep look of the inset and lock the right one
 		Paragraph * par = buffer()->paragraph;
 		int const id = inset->id();
-		while(par) {
-			Paragraph::inset_iterator it =
-				par->inset_iterator_begin();
-			Paragraph::inset_iterator const end =
-				par->inset_iterator_end();
+		while (par) {
+			InsetList::iterator it =
+				par->insetlist.begin();
+			InsetList::iterator const end =
+				par->insetlist.end();
 			for (; it != end; ++it) {
-				if ((*it) == inset) {
+				if (it.getInset() == inset) {
 					text->setCursorIntern(this, par, it.getPos());
 					theLockingInset(inset);
 					return true;
 				}
-				if ((*it)->getInsetFromID(id)) {
+				if (it.getInset()->getInsetFromID(id)) {
 					text->setCursorIntern(this, par, it.getPos());
-					(*it)->edit(this);
+					it.getInset()->edit(this);
 					return theLockingInset()->lockInsetInInset(this, inset);
 				}
 			}
@@ -656,10 +657,10 @@ bool BufferView::ChangeInsets(Inset::Cod
 	     it != end; ++it) {
 		Paragraph * par = *it;
 		bool changed_inset = false;
-		for (Paragraph::inset_iterator it2 = par->inset_iterator_begin();
-		     it2 != par->inset_iterator_end(); ++it2) {
-			if ((*it2)->lyxCode() == code) {
-				InsetCommand * inset = static_cast<InsetCommand *>(*it2);
+		for (InsetList::iterator it2 = par->insetlist.begin();
+		     it2 != par->insetlist.end(); ++it2) {
+			if (it2.getInset()->lyxCode() == code) {
+				InsetCommand * inset = static_cast<InsetCommand *>(it2.getInset());
 				if (inset->getContents() == from) {
 					inset->setContents(to);
 					changed_inset = true;
Index: src/ChangeLog
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/ChangeLog,v
retrieving revision 1.872
diff -u -p -r1.872 ChangeLog
--- src/ChangeLog	10 Aug 2002 15:20:57 -0000	1.872
+++ src/ChangeLog	10 Aug 2002 17:48:32 -0000
@@ -5,7 +5,7 @@
 	* paragraph.[Ch] (empty): new function
 
 	* other files: use the new Paragraph::empty function
-	
+
 2002-08-09  John Levon  <[EMAIL PROTECTED]>
 
 	* lyxtext.h: remove unused refresh_height
Index: src/InsetList.C
===================================================================
RCS file: src/InsetList.C
diff -N src/InsetList.C
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ src/InsetList.C	10 Aug 2002 17:48:32 -0000
@@ -0,0 +1,230 @@
+#include <config.h>
+
+#include "InsetList.h"
+#include "debug.h"
+
+#include "insets/inset.h"
+
+#include <algorithm>
+
+using lyx::pos_type;
+
+using std::lower_bound;
+using std::upper_bound;
+using std::endl;
+
+namespace {
+
+struct MatchIt {
+	/// used by lower_bound and upper_bound
+	inline
+	int operator()(InsetList::InsetTable const & a,
+		       InsetList::InsetTable const & b) const {
+		return a.pos < b.pos;
+	}
+};
+
+}
+
+
+InsetList::iterator::iterator(InsetList::List::iterator const & iter)
+	: it(iter)
+{}
+
+
+InsetList::iterator & InsetList::iterator::operator++()
+{
+	++it;
+	return *this;
+}
+
+
+InsetList::iterator InsetList::iterator::operator++(int)
+{
+	iterator tmp = *this;
+	++*this;
+	return tmp;
+}
+
+
+pos_type InsetList::iterator::getPos() const
+{
+	return it->pos;
+}
+
+
+Inset * InsetList::iterator::getInset() const
+{
+	return it->inset;
+}
+
+
+void InsetList::iterator::setInset(Inset * inset)
+{
+	it->inset = inset;
+}
+
+
+InsetList::iterator InsetList::begin()
+{
+	return iterator(list.begin());
+}
+
+
+InsetList::iterator InsetList::end()
+{
+	return iterator(list.end());
+}
+
+
+InsetList::iterator InsetList::begin() const
+{
+	return iterator(const_cast<InsetList*>(this)->list.begin());
+}
+
+
+InsetList::iterator InsetList::end() const
+{
+	return iterator(const_cast<InsetList*>(this)->list.end());
+}
+
+
+InsetList::iterator
+InsetList::insetIterator(pos_type pos)
+{
+	InsetTable search_elem(pos, 0);
+	List::iterator it = lower_bound(list.begin(),
+					list.end(),
+					search_elem, MatchIt());
+	return iterator(it);
+}
+
+
+void InsetList::insert(Inset * inset, lyx::pos_type pos)
+{
+	InsetTable search_elem(pos, 0);
+	List::iterator it = lower_bound(list.begin(),
+					list.end(),
+					search_elem, MatchIt());
+	if (it != list.end() && it->pos == pos) {
+		lyxerr << "ERROR (InsetList::insert): "
+		       << "There is an inset in position: " << pos << endl;
+	} else {
+		list.insert(it, InsetTable(pos, inset));
+	}
+}
+
+
+void InsetList::erase(pos_type pos)
+{
+	InsetTable search_elem(pos, 0);
+	List::iterator it =
+		lower_bound(list.begin(),
+			    list.end(),
+			    search_elem, MatchIt());
+	if (it != list.end() && it->pos == pos) {
+		delete it->inset;
+		list.erase(it);
+	}
+}
+
+
+Inset * InsetList::release(pos_type pos)
+{
+	InsetTable search_elem(pos, 0);
+	List::iterator it =
+		lower_bound(list.begin(),
+			    list.end(),
+			    search_elem, MatchIt());
+	if (it != list.end() && it->pos == pos) {
+		Inset * tmp = it->inset;
+		it->inset = 0;
+		return tmp;
+	}
+	return 0;
+}
+
+	
+Inset * InsetList::get(pos_type pos) const
+{
+	InsetTable search_elem(pos, 0);
+	List::iterator it =
+		lower_bound(const_cast<InsetList*>(this)->list.begin(),
+			    const_cast<InsetList*>(this)->list.end(),
+			    search_elem, MatchIt());
+	if (it != const_cast<InsetList*>(this)->list.end() && it->pos == pos)
+		return it->inset;
+	return 0;
+}
+
+
+void InsetList::increasePosAfterPos(pos_type pos)
+{
+	InsetTable search_elem(pos, 0);
+	List::iterator it = lower_bound(list.begin(),
+					list.end(),
+					search_elem, MatchIt());
+	List::iterator end = list.end();
+	for (; it != end; ++it) {
+		++it->pos;
+	}
+}
+
+
+void InsetList::decreasePosAfterPos(pos_type pos)
+{
+	InsetTable search_elem(pos, 0);
+	List::iterator end = list.end();
+	List::iterator it = upper_bound(list.begin(),
+					end,
+					search_elem, MatchIt());
+	for (; it != end; ++it) {
+		--it->pos;
+	}
+}
+
+
+void InsetList::deleteInsetsLyXText(BufferView * bv)
+{
+	List::iterator it = list.begin();
+	List::iterator end = list.end();
+	for (; it != end; ++it) {
+		if (it->inset) {
+			if (it->inset->isTextInset()) {
+				static_cast<UpdatableInset*>
+					(it->inset)->deleteLyXText(bv, true);
+			}
+		}
+	}
+}
+
+
+void InsetList::resizeInsetsLyXText(BufferView * bv)
+{
+	List::iterator it = list.begin();
+	List::iterator end = list.end();
+	for (; it != end; ++it) {
+		if (it->inset) {
+			if (it->inset->isTextInset()) {
+				static_cast<UpdatableInset*>
+					(it->inset)->resizeLyXText(bv, true);
+			}
+		}
+	}
+}
+
+
+
+bool operator==(InsetList::iterator const & i1,
+		InsetList::iterator const & i2)
+{
+	return i1.it == i2.it;
+	
+}
+	
+
+bool operator!=(InsetList::iterator const & i1,
+		InsetList::iterator const & i2)
+{
+	return !(i1 == i2);
+}
Index: src/InsetList.h
===================================================================
RCS file: src/InsetList.h
diff -N src/InsetList.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ src/InsetList.h	10 Aug 2002 17:48:32 -0000
@@ -0,0 +1,89 @@
+// -*- C++ -*-
+
+#ifndef INSET_LIST_H
+#define INSET_LIST_H
+
+#include "support/types.h"
+
+
+class Inset;
+class BufferView;
+
+
+///
+class InsetList {
+public:
+	///
+	struct InsetTable {
+		///
+		lyx::pos_type pos;
+		///
+		Inset * inset;
+		///
+		InsetTable(lyx::pos_type p, Inset * i) : pos(p), inset(i) {}
+	};
+	///
+	typedef std::vector<InsetTable> List;
+
+	///
+	class iterator {
+	public:
+		///
+		iterator() {}
+		//
+		iterator(List::iterator const & iter);
+		///
+		iterator & operator++();
+		///
+		iterator operator++(int);
+		///
+		lyx::pos_type getPos() const;
+		///
+		Inset * getInset() const;
+		///
+		void setInset(Inset * inset);
+		///
+		friend bool operator==(iterator const &, iterator const &);
+	private:
+		///
+		List::iterator it;
+	};
+	///
+	iterator begin();
+	///
+	iterator end();
+	///
+	iterator begin() const;
+	///
+	iterator end() const;
+	///
+	iterator insetIterator(lyx::pos_type pos);
+	///
+	void insert(Inset * inset, lyx::pos_type pos);
+	///
+	void erase(lyx::pos_type pos);
+	///
+	Inset * release(lyx::pos_type);
+	///
+	Inset * get(lyx::pos_type pos) const;
+	///
+	void increasePosAfterPos(lyx::pos_type pos);
+	///
+	void decreasePosAfterPos(lyx::pos_type pos);
+	///
+	void deleteInsetsLyXText(BufferView * bv);
+	///
+	void resizeInsetsLyXText(BufferView * bv);
+private:
+	///
+	List list;
+};
+
+///
+bool operator==(InsetList::iterator const & i1,
+		InsetList::iterator const & i2);
+///
+bool operator!=(InsetList::iterator const & i1,
+		InsetList::iterator const & i2);
+
+#endif
Index: src/Makefile.am
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/Makefile.am,v
retrieving revision 1.137
diff -u -p -r1.137 Makefile.am
--- src/Makefile.am	9 Aug 2002 00:42:10 -0000	1.137
+++ src/Makefile.am	10 Aug 2002 17:48:32 -0000
@@ -65,6 +65,8 @@ lyx_SOURCES = \
 	Floating.h \
 	FuncStatus.C \
 	FuncStatus.h \
+	InsetList.C \
+	InsetList.h \
 	LColor.C \
 	LColor.h \
 	LString.h \
Index: src/buffer.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/buffer.C,v
retrieving revision 1.365
diff -u -p -r1.365 buffer.C
--- src/buffer.C	10 Aug 2002 15:20:57 -0000	1.365
+++ src/buffer.C	10 Aug 2002 17:48:34 -0000
@@ -3871,8 +3871,8 @@ bool Buffer::isMultiLingual()
 Buffer::inset_iterator::inset_iterator(Paragraph * paragraph, pos_type pos)
 	: par(paragraph)
 {
-	it = par->InsetIterator(pos);
-	if (it == par->inset_iterator_end()) {
+	it = par->insetlist.insetIterator(pos);
+	if (it == par->insetlist.end()) {
 		par = par->next();
 		setParagraph();
 	}
@@ -3882,8 +3882,8 @@ Buffer::inset_iterator::inset_iterator(P
 void Buffer::inset_iterator::setParagraph()
 {
 	while (par) {
-		it = par->inset_iterator_begin();
-		if (it != par->inset_iterator_end())
+		it = par->insetlist.begin();
+		if (it != par->insetlist.end())
 			return;
 		par = par->next();
 	}
Index: src/buffer.h
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/buffer.h,v
retrieving revision 1.105
diff -u -p -r1.105 buffer.h
--- src/buffer.h	4 Aug 2002 23:11:47 -0000	1.105
+++ src/buffer.h	10 Aug 2002 17:48:34 -0000
@@ -372,7 +372,7 @@ public:
 		inset_iterator & operator++() { // prefix ++
 			if (par) {
 				++it;
-				if (it == par->inset_iterator_end()) {
+				if (it == par->insetlist.end()) {
 					par = par->next();
 					setParagraph();
 				}
@@ -384,7 +384,7 @@ public:
 			inset_iterator tmp(par, it.getPos());
 			if (par) {
 				++it;
-				if (it == par->inset_iterator_end()) {
+				if (it == par->insetlist.end()) {
 					par = par->next();
 					setParagraph();
 				}
@@ -393,7 +393,7 @@ public:
 		}
 
 		///
-		Inset * operator*() { return *it; }
+		Inset * operator*() { return it.getInset(); }
 
 		///
 		Paragraph * getPar() { return par; }
@@ -409,7 +409,7 @@ public:
 		///
 		Paragraph * par;
 		///
-		Paragraph::inset_iterator it;
+		InsetList::iterator it;
 	};
 
 	///
Index: src/iterators.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/iterators.C,v
retrieving revision 1.3
diff -u -p -r1.3 iterators.C
--- src/iterators.C	16 Feb 2002 15:59:37 -0000	1.3
+++ src/iterators.C	10 Aug 2002 17:48:34 -0000
@@ -10,7 +10,7 @@ ParIterator & ParIterator::operator++()
 		// Does the current inset contain more "cells" ?
 		if (p.index >= 0) {
 			++p.index;
-			Paragraph * par = (*p.it)->getFirstParagraph(p.index);
+			Paragraph * par = p.it.getInset()->getFirstParagraph(p.index);
 			if (par) {
 				positions.push(ParPosition(par));
 				return *this;
@@ -20,12 +20,12 @@ ParIterator & ParIterator::operator++()
 			// The following line is needed because the value of
 			// p.it may be invalid if inset was added/removed to
 			// the paragraph pointed by the iterator
-			p.it = p.par->inset_iterator_begin();
+			p.it = p.par->insetlist.begin();
 
 		// Try to find the next inset that contains paragraphs
-		Paragraph::inset_iterator end = p.par->inset_iterator_end();
+		InsetList::iterator end = p.par->insetlist.end();
 		for (; p.it != end; ++p.it) {
-			Paragraph * par = (*p.it)->getFirstParagraph(0);
+			Paragraph * par = p.it.getInset()->getFirstParagraph(0);
 			if (par) {
 				p.index = 0;
 				positions.push(ParPosition(par));
Index: src/iterators.h
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/iterators.h,v
retrieving revision 1.4
diff -u -p -r1.4 iterators.h
--- src/iterators.h	21 Mar 2002 17:25:09 -0000	1.4
+++ src/iterators.h	10 Aug 2002 17:48:34 -0000
@@ -10,11 +10,11 @@
 class ParPosition {
 public:
 	ParPosition(Paragraph * p)
-		: par(p), it(p->inset_iterator_begin()), index(-1) {}
+		: par(p), it(p->insetlist.begin()), index(-1) {}
 	///
 	Paragraph * par;
 	///
-	Paragraph::inset_iterator it;
+	InsetList::iterator it;
 	///
 	int index;
 };
Index: src/paragraph.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/paragraph.C,v
retrieving revision 1.216
diff -u -p -r1.216 paragraph.C
--- src/paragraph.C	10 Aug 2002 15:21:01 -0000	1.216
+++ src/paragraph.C	10 Aug 2002 17:48:35 -0000
@@ -130,9 +130,9 @@ Paragraph::Paragraph(Paragraph const & l
 	for (InsetList::iterator it = insetlist.begin();
 	     it != insetlist.end(); ++it)
 	{
-		it->inset = it->inset->clone(*current_view->buffer(), same_ids);
+		it.setInset(it.getInset()->clone(*current_view->buffer(), same_ids));
 		// tell the new inset who is the boss now
-		it->inset->parOwner(this);
+		it.getInset()->parOwner(this);
 	}
 }
 
@@ -147,7 +147,7 @@ Paragraph::~Paragraph()
 
 	for (InsetList::iterator it = insetlist.begin();
 	     it != insetlist.end(); ++it) {
-		delete it->inset;
+		delete it.getInset();
 	}
 
 	// ale970302
@@ -362,12 +362,12 @@ void Paragraph::cutIntoMinibuffer(Buffer
 			InsetList::iterator it = insetlist.begin();
 			InsetList::iterator end = insetlist.end();
 			for (; it != end; ++it) {
-				if (it->pos == pos)
+				if (it.getPos() == pos)
 					break;
 			}
 
-			if (it != end && it->pos == pos)
-				it->inset = 0;
+			if (it != end && it.getPos() == pos)
+				it.setInset(0);
 			// the inset is not in a paragraph anymore
 			minibuffer_inset->parOwner(0);
 		} else {
@@ -461,12 +461,12 @@ Inset * Paragraph::getInset(pos_type pos
 	InsetList::iterator it = insetlist.begin();
 	InsetList::iterator end = insetlist.end();
 	for (; it != end; ++it) {
-		if (it->pos == pos)
+		if (it.getPos() == pos)
 			break;
 	}
 
-	if (it != end && it->pos == pos)
-		return it->inset;
+	if (it != end && it.getPos() == pos)
+		return it.getInset();
 
 	lyxerr << "ERROR (Paragraph::getInset): "
 	       << "Inset does not exist: " << pos << endl;
@@ -485,26 +485,7 @@ Inset const * Paragraph::getInset(pos_ty
 {
 	lyx::Assert(pos < size());
 
-	// Find the inset.
-	InsetList::const_iterator cit = insetlist.begin();
-	InsetList::const_iterator end = insetlist.end();
-	for (; cit != end; ++cit) {
-		if (cit->pos == pos)
-			break;
-	}
-
-	if (cit != end && cit->pos == pos)
-		return cit->inset;
-
-	lyxerr << "ERROR (Paragraph::getInset): "
-	       << "Inset does not exist: " << pos << endl;
-	//::raise(SIGSTOP);
-	//text[pos] = ' '; // WHY!!! does this set the pos to ' '????
-	// Did this commenting out introduce a bug? So far I have not
-	// see any, please enlighten me. (Lgb)
-	// My guess is that since the inset does not exist, we might
-	// as well replace it with a space to prevent craches. (Asger)
-	return 0;
+	return insetlist.get(pos);
 }
 
 
@@ -1127,29 +1108,15 @@ Paragraph const * Paragraph::outerHook()
 }
 
 
-Paragraph::inset_iterator
-Paragraph::InsetIterator(pos_type pos)
-{
-	InsetList::iterator it = insetlist.begin();
-	InsetList::iterator end = insetlist.end();
-	for (; it != end; ++it) {
-		if (it->pos >= pos)
-			break;
-	}
-
-	return inset_iterator(it);
-}
-
-
 // returns -1 if inset not found
 int Paragraph::getPositionOfInset(Inset const * inset) const
 {
 	// Find the entry.
-	InsetList::const_iterator cit = insetlist.begin();
-	InsetList::const_iterator end = insetlist.end();
-	for (; cit != end; ++cit) {
-		if (cit->inset == inset) {
-			return cit->pos;
+	InsetList::iterator it = insetlist.begin();
+	InsetList::iterator end = insetlist.end();
+	for (; it != end; ++it) {
+		if (it.getInset() == inset) {
+			return it.getPos();
 		}
 	}
 	if (inset == bibkey)
@@ -1982,11 +1949,11 @@ string const Paragraph::asString(Buffer 
 void Paragraph::setInsetOwner(Inset * i)
 {
 	pimpl_->inset_owner = i;
-	InsetList::const_iterator cit = insetlist.begin();
-	InsetList::const_iterator end = insetlist.end();
-	for (; cit != end; ++cit) {
-		if (cit->inset)
-			cit->inset->setOwner(i);
+	InsetList::iterator it = insetlist.begin();
+	InsetList::iterator end = insetlist.end();
+	for (; it != end; ++it) {
+		if (it.getInset())
+			it.getInset()->setOwner(i);
 	}
 }
 
@@ -1994,30 +1961,14 @@ void Paragraph::setInsetOwner(Inset * i)
 void Paragraph::deleteInsetsLyXText(BufferView * bv)
 {
 	// then the insets
-	InsetList::const_iterator cit = insetlist.begin();
-	InsetList::const_iterator end = insetlist.end();
-	for (; cit != end; ++cit) {
-		if (cit->inset && cit->inset->isTextInset()) {
-			static_cast<UpdatableInset *>
-				(cit->inset)->deleteLyXText(bv, true);
-		}
-	}
+	insetlist.deleteInsetsLyXText(bv);
 }
 
 
 void Paragraph::resizeInsetsLyXText(BufferView * bv)
 {
 	// then the insets
-	InsetList::const_iterator cit = insetlist.begin();
-	InsetList::const_iterator end = insetlist.end();
-	for (; cit != end; ++cit) {
-		if (cit->inset) {
-			if (cit->inset->isTextInset()) {
-				static_cast<UpdatableInset *>
-					(cit->inset)->resizeLyXText(bv, true);
-			}
-		}
-	}
+	insetlist.resizeInsetsLyXText(bv);
 }
 
 
@@ -2086,23 +2037,6 @@ void Paragraph::clearContents()
 void Paragraph::setChar(pos_type pos, value_type c)
 {
 	pimpl_->setChar(pos, c);
-}
-
-
-Paragraph::inset_iterator::inset_iterator(Paragraph::InsetList::iterator const & iter)
- : it(iter)
-{}
-
-
-Paragraph::inset_iterator Paragraph::inset_iterator_begin()
-{
-	return inset_iterator(insetlist.begin());
-}
-
-
-Paragraph::inset_iterator Paragraph::inset_iterator_end()
-{
-	return inset_iterator(insetlist.end());
 }
 
 
Index: src/paragraph.h
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/paragraph.h,v
retrieving revision 1.41
diff -u -p -r1.41 paragraph.h
--- src/paragraph.h	10 Aug 2002 15:21:02 -0000	1.41
+++ src/paragraph.h	10 Aug 2002 17:48:35 -0000
@@ -15,6 +15,7 @@
 
 #include "lyxlayout_ptr_fwd.h"
 #include "lyxfont.h" // Just for LyXFont::FONT_SIZE
+#include "InsetList.h"
 
 #include "insets/inset.h" // Just for Inset::Code
 
@@ -37,8 +38,7 @@ class TexRow;
 #define NO_PEXTRA_REALLY 1
 
 // Define this if you want to try out the new storage container for
-// paragraphs. std::container instead of obfuscated homegrown
-// linked list. (Lgb)
+// paragraphs. (Lgb)
 // This is non working and far from finished.
 // #define NO_NEXT 1
 
@@ -258,9 +258,10 @@ public:
 	/// pos <= size() (there is a dummy font change at the end of each par)
 	void setFont(lyx::pos_type pos, LyXFont const & font);
 	/// Returns the height of the highest font in range
-	LyXFont::FONT_SIZE highestFontInRange(lyx::pos_type startpos,
-					      lyx::pos_type endpos,
-					      LyXFont::FONT_SIZE const def_size) const;
+	LyXFont::FONT_SIZE
+	highestFontInRange(lyx::pos_type startpos,
+			   lyx::pos_type endpos,
+			   LyXFont::FONT_SIZE const def_size) const;
 	///
 	void insertChar(lyx::pos_type pos, value_type c);
 	///
@@ -329,76 +330,18 @@ public:
 	///
 	bool isFreeSpacing() const;
 
-	ParagraphParameters & params();
-	ParagraphParameters const & params() const;
-private:
 	///
-	LyXLayout_ptr layout_;
-public:
-	/** Both these definitions must be made public to keep Compaq cxx 6.5
-	 *  happy.
-	 */
-	///
-	struct InsetTable {
-		///
-		lyx::pos_type pos;
-		///
-		Inset * inset;
-		///
-		InsetTable(lyx::pos_type p, Inset * i) : pos(p), inset(i) {}
-	};
-
+	ParagraphParameters & params();
 	///
-	typedef std::vector<InsetTable> InsetList;
-private:
+	ParagraphParameters const & params() const;
 	///
 	InsetList insetlist;
-public:
-	///
-	class inset_iterator {
-	public:
-		///
-		inset_iterator() {}
-		//
-		inset_iterator(InsetList::iterator const & iter);
-		///
-		inset_iterator & operator++() {
-			++it;
-			return *this;
-		}
-		///
-		Inset * operator*() { return it->inset; }
-		///
-		Inset * operator->() { return it->inset; }
-
-		///
-		lyx::pos_type getPos() const { return it->pos; }
-		///
-		bool operator==(inset_iterator const & iter) const {
-			return it == iter.it;
-		}
-		///
-		bool operator!=(inset_iterator const & iter) const {
-			return it != iter.it;
-		}
-	private:
-		///
-		InsetList::iterator it;
-	};
-	///
-	friend class inset_iterator;
-
-	///
-	inset_iterator inset_iterator_begin();
-	///
-	inset_iterator inset_iterator_end();
-	/// returns inset iterator of the first inset at or after pos.
-	inset_iterator InsetIterator(lyx::pos_type pos);
-
 	///
 	Counters & counters();
 
 private:
+	///
+	LyXLayout_ptr layout_;
 	/// if anything uses this we don't want it to.
 	Paragraph(Paragraph const &);
 	///
Index: src/paragraph_pimpl.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/paragraph_pimpl.C,v
retrieving revision 1.41
diff -u -p -r1.41 paragraph_pimpl.C
--- src/paragraph_pimpl.C	10 Aug 2002 15:21:02 -0000	1.41
+++ src/paragraph_pimpl.C	10 Aug 2002 17:48:36 -0000
@@ -139,15 +139,9 @@ void Paragraph::Pimpl::insertChar(pos_ty
 		it->pos(it->pos() + 1);
 	}
 
-	// Update the inset table.
-	InsetTable search_inset(pos, 0);
-	for (InsetList::iterator it = lower_bound(owner_->insetlist.begin(),
-						       owner_->insetlist.end(),
-						       search_inset, matchIT());
-	     it != owner_->insetlist.end(); ++it)
-	{
-		++it->pos;
-	}
+	// Update the insets
+	owner_->insetlist.increasePosAfterPos(pos);
+	
 	owner_->setFont(pos, font);
 }
 
@@ -161,19 +155,10 @@ void Paragraph::Pimpl::insertInset(pos_t
 	insertChar(pos, META_INSET, font);
 	lyx::Assert(text[pos] == META_INSET);
 
-	// Add a new entry in the inset table.
-	InsetTable search_inset(pos, 0);
-	InsetList::iterator it = lower_bound(owner_->insetlist.begin(),
-						  owner_->insetlist.end(),
-						  search_inset, matchIT());
-	if (it != owner_->insetlist.end() && it->pos == pos) {
-		lyxerr << "ERROR (Paragraph::InsertInset): "
-			"there is an inset in position: " << pos << endl;
-	} else {
-		owner_->insetlist.insert(it, InsetTable(pos, inset));
-		inset->parOwner(owner_);
-	}
-
+	// Add a new entry in the insetlist.
+	owner_->insetlist.insert(inset, pos);
+	inset->parOwner(owner_);
+	
 	if (inset_owner)
 		inset->setOwner(inset_owner);
 }
@@ -184,16 +169,7 @@ void Paragraph::Pimpl::erase(pos_type po
 	lyx::Assert(pos < size());
 	// if it is an inset, delete the inset entry
 	if (text[pos] == Paragraph::META_INSET) {
-		// find the entry
-		InsetTable search_inset(pos, 0);
-		InsetList::iterator it =
-			lower_bound(owner_->insetlist.begin(),
-					 owner_->insetlist.end(),
-					 search_inset, matchIT());
-		if (it != owner_->insetlist.end() && it->pos == pos) {
-			delete it->inset;
-			owner_->insetlist.erase(it);
-		}
+		owner_->insetlist.erase(pos);
 	}
 
 	text.erase(text.begin() + pos);
@@ -228,15 +204,8 @@ void Paragraph::Pimpl::erase(pos_type po
 	for (; it != fend; ++it)
 		it->pos(it->pos() - 1);
 
-	// Update the inset table.
-	InsetTable search_inset(pos, 0);
-	InsetList::iterator lend = owner_->insetlist.end();
-	for (InsetList::iterator it =
-		     upper_bound(owner_->insetlist.begin(),
-				      lend,
-				      search_inset, matchIT());
-	     it != lend; ++it)
-		--it->pos;
+	// Update the insetlist.
+	owner_->insetlist.decreasePosAfterPos(pos);
 }
 
 
@@ -637,13 +606,13 @@ void Paragraph::Pimpl::validate(LaTeXFea
 		features.require("ParagraphLeftIndent");
 
 	// then the insets
-	InsetList::const_iterator icit = owner_->insetlist.begin();
-	InsetList::const_iterator iend = owner_->insetlist.end();
+	InsetList::iterator icit = owner_->insetlist.begin();
+	InsetList::iterator iend = owner_->insetlist.end();
 	for (; icit != iend; ++icit) {
-		if (icit->inset) {
-			icit->inset->validate(features);
+		if (icit.getInset()) {
+			icit.getInset()->validate(features);
 			if (layout.needprotect &&
-			    icit->inset->lyxCode() == Inset::FOOT_CODE)
+			    icit.getInset()->lyxCode() == Inset::FOOT_CODE)
 				features.require("NeedLyXFootnoteCode");
 		}
 	}
@@ -663,11 +632,11 @@ void Paragraph::Pimpl::validate(LaTeXFea
 
 Paragraph * Paragraph::Pimpl::getParFromID(int id) const
 {
-	InsetList::const_iterator cit = owner_->insetlist.begin();
-	InsetList::const_iterator lend = owner_->insetlist.end();
+	InsetList::iterator cit = owner_->insetlist.begin();
+	InsetList::iterator lend = owner_->insetlist.end();
 	Paragraph * result;
 	for (; cit != lend; ++cit) {
-		if ((result = cit->inset->getParFromID(id)))
+		if ((result = cit.getInset()->getParFromID(id)))
 			return result;
 	}
 	return 0;
Index: src/paragraph_pimpl.h
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/paragraph_pimpl.h,v
retrieving revision 1.14
diff -u -p -r1.14 paragraph_pimpl.h
--- src/paragraph_pimpl.h	10 Aug 2002 15:21:02 -0000	1.14
+++ src/paragraph_pimpl.h	10 Aug 2002 17:48:36 -0000
@@ -62,16 +62,6 @@ struct Paragraph::Pimpl {
 	///
 	boost::array<int, 10> counter_;
 
-	///
-	friend struct matchIT;
-	///
-	struct matchIT {
-		/// used by lower_bound and upper_bound
-		inline
-		int operator()(InsetTable const & a, InsetTable const & b) const {
-			return a.pos < b.pos;
-		}
-	};
 	/** A font entry covers a range of positions. Notice that the
 	    entries in the list are inserted in random order.
 	    I don't think it's worth the effort to implement a more effective
Index: src/toc.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/toc.C,v
retrieving revision 1.7
diff -u -p -r1.7 toc.C
--- src/toc.C	8 Aug 2002 22:03:29 -0000	1.7
+++ src/toc.C	10 Aug 2002 17:48:36 -0000
@@ -93,12 +93,12 @@ TocList const getTocList(Buffer const * 
 
 		// For each paragraph, traverse its insets and look for
 		// FLOAT_CODE
-		Paragraph::inset_iterator it = par->inset_iterator_begin();
-		Paragraph::inset_iterator end =	par->inset_iterator_end();
+		InsetList::iterator it = par->insetlist.begin();
+		InsetList::iterator end = par->insetlist.end();
 		for (; it != end; ++it) {
-			if ((*it)->lyxCode() == Inset::FLOAT_CODE) {
+			if (it.getInset()->lyxCode() == Inset::FLOAT_CODE) {
 				InsetFloat * il =
-					static_cast<InsetFloat*>(*it);
+					static_cast<InsetFloat*>(it.getInset());
 				il->addToToc(toclist, buf);
 			}
 		}
Index: src/graphics/GraphicsSupport.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/graphics/GraphicsSupport.C,v
retrieving revision 1.1
diff -u -p -r1.1 GraphicsSupport.C
--- src/graphics/GraphicsSupport.C	15 Jul 2002 11:08:45 -0000	1.1
+++ src/graphics/GraphicsSupport.C	10 Aug 2002 17:48:37 -0000
@@ -65,16 +65,16 @@ struct InsetVisibleInParagraph {
 	bool operator()(VisibleParagraph const & vp)
 	{
 		Paragraph * par = vp.par;
-		Paragraph::inset_iterator it  = par->inset_iterator_begin();
-		Paragraph::inset_iterator end = par->inset_iterator_end();
+		InsetList::iterator it  = par->insetlist.begin();
+		InsetList::iterator end = par->insetlist.end();
 
 		// Can't refactor this as a functor because we rely on the
 		// inset_iterator member function getPos().
 		for (; it != end; ++it) {
 			lyx::pos_type const pos = it.getPos();
 			if (pos >= vp.start && pos <= vp.end) {
-				if (*it == &inset_ ||
-				    it->getInsetFromID(inset_.id()) != 0)
+				if (it.getInset() == &inset_ ||
+				    it.getInset()->getInsetFromID(inset_.id()) != 0)
 					return true;
 			}
 		}
Index: src/insets/insettext.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/insets/insettext.C,v
retrieving revision 1.314
diff -u -p -r1.314 insettext.C
--- src/insets/insettext.C	10 Aug 2002 15:21:06 -0000	1.314
+++ src/insets/insettext.C	10 Aug 2002 17:48:38 -0000
@@ -878,19 +878,19 @@ bool InsetText::lockInsetInInset(BufferV
 		Paragraph * p = par;
 		int const id = inset->id();
 		while(p) {
-			Paragraph::inset_iterator it =
-				p->inset_iterator_begin();
-			Paragraph::inset_iterator const end =
-				p->inset_iterator_end();
+			InsetList::iterator it =
+				p->insetlist.begin();
+			InsetList::iterator const end =
+				p->insetlist.end();
 			for (; it != end; ++it) {
-				if ((*it) == inset) {
+				if (it.getInset() == inset) {
 					getLyXText(bv)->setCursorIntern(bv, p, it.getPos());
 					lockInset(bv, inset);
 					return true;
 				}
-				if ((*it)->getInsetFromID(id)) {
+				if (it.getInset()->getInsetFromID(id)) {
 					getLyXText(bv)->setCursorIntern(bv, p, it.getPos());
-					(*it)->edit(bv);
+					it.getInset()->edit(bv);
 					return the_locking_inset->lockInsetInInset(bv, inset);
 				}
 			}
@@ -1968,10 +1968,10 @@ vector<string> const InsetText::getLabel
 
 	Paragraph * tpar = par;
 	while (tpar) {
-		Paragraph::inset_iterator beg = tpar->inset_iterator_begin();
-		Paragraph::inset_iterator end = tpar->inset_iterator_end();
+		InsetList::iterator beg = tpar->insetlist.begin();
+		InsetList::iterator end = tpar->insetlist.end();
 		for (; beg != end; ++beg) {
-			vector<string> const l = (*beg)->getLabelList();
+			vector<string> const l = beg.getInset()->getLabelList();
 			label_list.insert(label_list.end(), l.begin(), l.end());
 		}
 		tpar = tpar->next();
@@ -2560,13 +2560,13 @@ Inset * InsetText::getInsetFromID(int id
 	Paragraph * lp = par;
 
 	while (lp) {
-		for (Paragraph::inset_iterator it = lp->inset_iterator_begin(),
-			 en = lp->inset_iterator_end();
+		for (InsetList::iterator it = lp->insetlist.begin(),
+			 en = lp->insetlist.end();
 			 it != en; ++it)
 		{
-			if ((*it)->id() == id_arg)
-				return *it;
-			Inset * in = (*it)->getInsetFromID(id_arg);
+			if (it.getInset()->id() == id_arg)
+				return it.getInset();
+			Inset * in = it.getInset()->getInsetFromID(id_arg);
 			if (in)
 				return in;
 		}
@@ -2798,10 +2798,10 @@ void InsetText::addPreview(grfx::Preview
 {
 	Paragraph * par = getFirstParagraph(0);
 	while (par) {
-		Paragraph::inset_iterator it  = par->inset_iterator_begin();
-		Paragraph::inset_iterator end = par->inset_iterator_end();
+		InsetList::iterator it  = par->insetlist.begin();
+		InsetList::iterator end = par->insetlist.end();
 		for (; it != end; ++it) {
-			it->addPreview(loader);
+			it.getInset()->addPreview(loader);
 		}
 
 		par = par->next();

-- 
        Lgb

Reply via email to