Ok, this is what I am going to commit. I am not really happy with the fact that RandomListIterator really is a std::list<>::iterator. I'd like it to be a real random_access_iterator. We should probably create our own. (And no; I don't agree that we should only work with offsets and indices, iterators are nice and we should use them.)
This works for me. [[ * output_latex.h: * buffer.h: * CutAndPaste.h: * pariterator.h: * paragraph_funcs.h: * output_linuxdoc.h: * output_docbook.h: * insets/insettext.h: get forward declaration of ParagraphList * output_plaintext.C: * bufferlist.C: * undo.C: * lyxtext.h: * undo.h: * buffer_funcs.C: * insets/insetbibitem.C: get proper ParagraphList decls * output_linuxdoc.C (linuxdocParagraphs): * output_latex.C (TeXOnePar): * insets/insettext.C (appendParagraphs): * insets/insetcharstyle.C (docbook): use std::distance * CutAndPaste.C (pasteSelectionHelper, copySelectionHelper): * paragraph_funcs.C (breakParagraph, breakParagraphConservative, mergeParagraph): * text.C (acceptChange, rejectChange): * text2.C (deleteEmptyParagraphMechanism): use boost::next * output_docbook.C (several places): use boost::next and std::distance * ParagraphList_fwd.h: modify to provid a forward declaratoin of the new ParagraphList. * RandomAccessList.h: New container for Paragraphs from Abdelrazak Younes * ParagraphList.h: new file, setup user of RandomAccessList * paragraph.C: remove ParagraphList constructor from this file ]]
Index: src/insets/insettext.h =================================================================== --- src/insets/insettext.h (revision 13423) +++ src/insets/insettext.h (working copy) @@ -16,6 +16,7 @@ #include "RowList_fwd.h" #include "lyxfont.h" #include "lyxtext.h" +#include "ParagraphList_fwd.h" #include "support/types.h" @@ -27,7 +28,6 @@ class CursorSlice; class Dimension; class LColor_color; -class ParagraphList; /** Index: src/insets/insetbibitem.C =================================================================== --- src/insets/insetbibitem.C (revision 13423) +++ src/insets/insetbibitem.C (working copy) @@ -19,7 +19,7 @@ #include "lyxfont.h" #include "lyxlex.h" #include "paragraph.h" -#include "ParagraphList_fwd.h" +#include "ParagraphList.h" #include "frontends/font_metrics.h" Index: src/insets/insetcharstyle.C =================================================================== --- src/insets/insetcharstyle.C (revision 13423) +++ src/insets/insetcharstyle.C (working copy) @@ -289,6 +289,7 @@ int InsetCharStyle::docbook(Buffer const & buf, ostream & os, OutputParams const & runparams) const { + ParagraphList::const_iterator beg = paragraphs().begin(); ParagraphList::const_iterator par = paragraphs().begin(); ParagraphList::const_iterator end = paragraphs().end(); @@ -298,7 +299,7 @@ for (; par != end; ++par) { par->simpleDocBookOnePar(buf, os, runparams, - outerFont(par - paragraphs().begin(), + outerFont(std::distance(beg, par), paragraphs())); } Index: src/insets/insettext.C =================================================================== --- src/insets/insettext.C (revision 13423) +++ src/insets/insettext.C (working copy) @@ -422,7 +422,8 @@ ParagraphList::iterator pit = plist.begin(); ParagraphList::iterator ins = pl.insert(pl.end(), *pit); ++pit; - mergeParagraph(buffer->params(), pl, ins - pl.begin() - 1); + mergeParagraph(buffer->params(), pl, + std::distance(pl.begin(), ins) - 1); for_each(pit, plist.end(), bind(&ParagraphList::push_back, ref(pl), _1)); Index: src/output_plaintext.C =================================================================== --- src/output_plaintext.C (revision 13423) +++ src/output_plaintext.C (working copy) @@ -19,7 +19,7 @@ #include "output.h" #include "outputparams.h" #include "paragraph.h" -#include "ParagraphList_fwd.h" +#include "ParagraphList.h" #include "ParagraphParameters.h" #include "support/lstrings.h" Index: src/output_latex.h =================================================================== --- src/output_latex.h (revision 13423) +++ src/output_latex.h (working copy) @@ -12,11 +12,12 @@ #ifndef OUTPUT_LATEX_H #define OUTPUT_LATEX_H +#include "ParagraphList_fwd.h" + #include <string> class Buffer; class OutputParams; -class ParagraphList; class TexRow; /// Just a wrapper for the method below, first creating the ofstream. Index: src/bufferlist.C =================================================================== --- src/bufferlist.C (revision 13423) +++ src/bufferlist.C (working copy) @@ -22,7 +22,7 @@ #include "lyx_main.h" #include "output_latex.h" #include "paragraph.h" -#include "ParagraphList_fwd.h" +#include "ParagraphList.h" #include "frontends/Alert.h" Index: src/undo.C =================================================================== --- src/undo.C (revision 13423) +++ src/undo.C (working copy) @@ -22,6 +22,7 @@ #include "BufferView.h" #include "lyxtext.h" #include "paragraph.h" +#include "ParagraphList.h" #include "mathed/math_support.h" #include "insets/inset.h" Index: src/text2.C =================================================================== --- src/text2.C (revision 13423) +++ src/text2.C (working copy) @@ -1258,7 +1258,7 @@ max(old.pit() - 1, pit_type(0)), min(old.pit() + 1, old.lastpit())); ParagraphList & plist = old.text()->paragraphs(); - plist.erase(plist.begin() + old.pit()); + plist.erase(boost::next(plist.begin(), old.pit())); // see #warning above if (cur.depth() >= old.depth()) { Index: src/ParagraphList_fwd.h =================================================================== --- src/ParagraphList_fwd.h (revision 13423) +++ src/ParagraphList_fwd.h (working copy) @@ -12,22 +12,11 @@ #ifndef PARAGRAPH_LIST_FWD_H #define PARAGRAPH_LIST_FWD_H -#include "paragraph.h" +template <class T> +class RandomAccessList; -#include <vector> +class Paragraph; -class ParagraphList : public std::vector<Paragraph> -{ -public: - /// - typedef std::vector<Paragraph> BaseType; - /// - ParagraphList(); - /// - template <class Iter> - ParagraphList(Iter beg, Iter end) - : BaseType(beg, end) - {} -}; +typedef RandomAccessList<Paragraph> ParagraphList; #endif Index: src/CutAndPaste.C =================================================================== --- src/CutAndPaste.C (revision 13423) +++ src/CutAndPaste.C (working copy) @@ -214,14 +214,16 @@ // Paste it! if (empty) { - pars.insert(pars.begin() + pit, insertion.begin(), + pars.insert(boost::next(pars.begin(), pit), + insertion.begin(), insertion.end()); // merge the empty par with the last par of the insertion mergeParagraph(buffer.params(), pars, pit + insertion.size() - 1); } else { - pars.insert(pars.begin() + pit + 1, insertion.begin(), + pars.insert(boost::next(pars.begin(), pit + 1), + insertion.begin(), insertion.end()); // merge the first par of the insertion with the current par @@ -314,7 +316,8 @@ BOOST_ASSERT(startpit != endpit || start <= end); // Clone the paragraphs within the selection. - ParagraphList paragraphs(pars.begin() + startpit, pars.begin() + endpit + 1); + ParagraphList paragraphs(boost::next(pars.begin(), startpit), + boost::next(pars.begin(), endpit + 1)); for_each(paragraphs.begin(), paragraphs.end(), resetOwnerAndChanges()); Index: src/lyxtext.h =================================================================== --- src/lyxtext.h (revision 13423) +++ src/lyxtext.h (working copy) @@ -21,7 +21,7 @@ #include "lyxfont.h" #include "layout.h" #include "lyxlayout_ptr_fwd.h" -#include "ParagraphList_fwd.h" +#include "ParagraphList.h" #include <iosfwd> Index: src/undo.h =================================================================== --- src/undo.h (revision 13423) +++ src/undo.h (working copy) @@ -17,7 +17,7 @@ #define UNDO_H #include "dociterator.h" -#include "ParagraphList_fwd.h" +#include "ParagraphList.h" #include "bufferparams.h" #include "support/types.h" Index: src/buffer.h =================================================================== --- src/buffer.h (revision 13423) +++ src/buffer.h (working copy) @@ -15,6 +15,7 @@ #include "InsetList.h" #include "dociterator.h" +#include "ParagraphList_fwd.h" #include "support/limited_stack.h" #include "support/types.h" @@ -42,7 +43,6 @@ class Language; class MacroData; class OutputParams; -class ParagraphList; class ParConstIterator; class ParIterator; class TeXErrors; Index: src/CutAndPaste.h =================================================================== --- src/CutAndPaste.h (revision 13423) +++ src/CutAndPaste.h (working copy) @@ -14,6 +14,8 @@ #ifndef CUTANDPASTE_H #define CUTANDPASTE_H +#include "ParagraphList_fwd.h" + #include "support/types.h" #include <string> @@ -23,7 +25,6 @@ class ErrorList; class LyXTextClass; class LCursor; -class ParagraphList; /// namespace lyx { Index: src/support/RandomAccessList.h =================================================================== --- src/support/RandomAccessList.h (revision 0) +++ src/support/RandomAccessList.h (revision 0) @@ -0,0 +1,279 @@ +// -*- C++ -*- +/** + * \file RandomAccessList.h + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. + * + * \author Abdelrazak Younes + * + * Full author contact details are available in file CREDITS. + * + */ + +#ifndef RANDOM_ACESS_LIST_H +#define RANDOM_ACESS_LIST_H + +//#include "debug.h" + +#include <boost/utility.hpp> + +#include <vector> +#include <list> +#include <algorithm> + +#define USE_OLD_ITERATOR 1 + +/// Random Access List. +/** +This templatized class provide a std::vector like interface to a +standard std::list underneath. An important property is that it +keeps the std::list::iterator interface. A typical use would be: + + typedef RandomAccessList<some_class> MyContainer; + +Then you can use MyContainer as if it was a standard +std::vector<some_class> for operator[] access and as if it was a +standard std::list for iterator access. The main difference with +std::vector is that insertion of elements is much less costly. Compared +to a standard list alone, there is of course a small overhead because +the class always keeps its internal vector of iterator (it_vector_) up +to date. +*/ +template <class T> +class RandomAccessList { +public: + // types + typedef std::list<T> Container; + typedef typename Container::reference reference; + typedef typename Container::const_reference const_reference; +#if USE_OLD_ITERATOR + // iterator (below) + typedef typename Container::iterator iterator; + // const_iterator (below) + typedef typename Container::const_iterator const_iterator; +#else + // wip +#endif + typedef typename Container::size_type size_type; + typedef typename Container::difference_type difference_type; + typedef typename Container::value_type value_type; + typedef typename Container::allocator_type allocator_type; + typedef typename Container::pointer pointer; + typedef typename Container::const_pointer const_pointer; + // reverse_iterator + // const_reverse_iterator + + typedef std::vector<typename Container::iterator> IterCont; + + // construct/copy/destroy + + RandomAccessList() + {} + + // RandomAccessList(size_type n T const & value = T()) + + template<class InputIterator> + RandomAccessList(InputIterator first, InputIterator last) + { + assign(first, last); + } + + + + RandomAccessList(RandomAccessList const & x) + { + assign(x.begin(), x.end()); + } + + // ~RandomAccessList() + + /// + RandomAccessList & operator=(RandomAccessList const & x) + { + assign(x.begin(), x.end()); + return *this; + } + + template<class InputIterator> + void assign(InputIterator first, InputIterator last) + { + container_.assign(first, last); + recreateVector(); + } + + + // void assign(size_type n, T const & u); + + // iterators + + iterator begin() + { + return container_.begin(); + } + + const_iterator begin() const + { + return container_.begin(); + } + + iterator end() + { + return container_.end(); + } + + const_iterator end() const + { + return container_.end(); + } + + // reverse_iterator rbegin(); + // const_reverse_iterator rbegin() const; + // reverse_iterator rend(); + // const_reverse_iterator rend() const; + + // capacity + size_type size() const + { + return iterCont_.size(); + } + + size_type max_size() const + { + return iterCont_.max_size(); + } + + // void resize(size_type sz, T c = T()); + + size_type capacity() const + { + return iterCont_.capacity(); + } + + bool empty() const + { + return container_.empty(); + } + + // void reserve(size_type n); + + // element access + + reference operator[](size_type pos) + { + return *iterCont_[pos]; + } + + /// + const_reference operator[](size_type pos) const + { + return *iterCont_[pos]; + } + + reference at(size_type pos) + { + return *iterCont_.at(pos); + } + + const_reference at(size_type pos) const + { + return *iterCont_.at(pos); + } + + reference front() + { + return container_.front(); + } + + const_reference front() const + { + return container_.front(); + } + + reference back() + { + return container_.back(); + } + + const_reference back() const + { + return container_.back(); + } + + // modifiers + + void push_back(T const & x) + { + typename Container::iterator it = + container_.insert(container_.end(), x); + iterCont_.push_back(it); + } + + void pop_back() + { + container_.pop_back(); + iterCont_.pop_back(); + } + + iterator insert(iterator position, T const & x) + { + typename Container::iterator it = + container_.insert(position, x); + recreateVector(); + return it; + } + + // void insert(iterator position, size_type n, T const & x); + + template<class InputIterator> + void insert(iterator position, + InputIterator first, InputIterator last) + { + container_.insert(position, first, last); + recreateVector(); + } + + iterator erase(iterator position) + { + typename Container::iterator it = + container_.erase(position); + recreateVector(); + return it; + } + + iterator erase(iterator first, iterator last) + { + typename Container::iterator it = + container_.erase(first, last); + recreateVector(); + return it; + } + + void swap(RandomAccessList & x) + { + std::swap(container_, x.container_); + std::swap(iterCont_, x.iterCont_); + } + + void clear() + { + container_.clear(); + iterCont_.clear(); + } + +private: + void recreateVector() + { + iterCont_.clear(); + typename Container::iterator beg = container_.begin(); + typename Container::iterator end = container_.end(); + for (; beg != end; ++beg) + iterCont_.push_back(beg); + } + + /// Our container. + Container container_; + /// Our container of iterators. + IterCont iterCont_; +}; + +#endif Index: src/paragraph_funcs.C =================================================================== --- src/paragraph_funcs.C (revision 13423) +++ src/paragraph_funcs.C (working copy) @@ -96,7 +96,8 @@ { // create a new paragraph, and insert into the list ParagraphList::iterator tmp = - pars.insert(pars.begin() + par_offset + 1, Paragraph()); + pars.insert(boost::next(pars.begin(), par_offset + 1), + Paragraph()); Paragraph & par = pars[par_offset]; @@ -193,7 +194,8 @@ ParagraphList & pars, pit_type par_offset, pos_type pos) { // create a new paragraph - Paragraph & tmp = *pars.insert(pars.begin() + par_offset + 1, Paragraph()); + Paragraph & tmp = *pars.insert(boost::next(pars.begin(), par_offset + 1), + Paragraph()); Paragraph & par = pars[par_offset]; if (bparams.tracking_changes) @@ -259,7 +261,7 @@ // Move the change status of "carriage return" over par.setChange(par.size(), cr); - pars.erase(pars.begin() + par_offset + 1); + pars.erase(boost::next(pars.begin(), par_offset + 1)); } Index: src/pariterator.h =================================================================== --- src/pariterator.h (revision 13423) +++ src/pariterator.h (working copy) @@ -13,6 +13,7 @@ #define PARITERATOR_H #include "dociterator.h" +#include "ParagraphList_fwd.h" #include "support/types.h" @@ -24,7 +25,6 @@ class InsetBase; class LyXText; -class ParagraphList; class ParIterator : public std::iterator<std::forward_iterator_tag, Paragraph>, Index: src/output_linuxdoc.C =================================================================== --- src/output_linuxdoc.C (revision 13423) +++ src/output_linuxdoc.C (working copy) @@ -17,7 +17,7 @@ #include "bufferparams.h" #include "paragraph.h" #include "paragraph_funcs.h" -#include "ParagraphList_fwd.h" +#include "ParagraphList.h" #include "ParagraphParameters.h" #include "sgml.h" @@ -133,7 +133,7 @@ } pit->simpleLinuxDocOnePar(buf, os, - outerFont(pit - paragraphs.begin(), paragraphs), + outerFont(std::distance(paragraphs.begin(), pit), paragraphs), runparams, depth); os << "\n"; Index: src/ParagraphList.h =================================================================== --- src/ParagraphList.h (revision 0) +++ src/ParagraphList.h (revision 0) @@ -0,0 +1,22 @@ +// -*- C++ -*- +/** + * \file ParagraphList_fwd.h + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. + * + * \author Angus Leeming + * + * Full author contact details are available in file CREDITS. + */ + +#ifndef PARAGRAPH_LIST_H +#define PARAGRAPH_LIST_H + +#include "paragraph.h" + +#include "support/RandomAccessList.h" + +/// Container for all kind of Paragraphs used in Lyx. +typedef RandomAccessList<Paragraph> ParagraphList; + +#endif Index: src/paragraph_funcs.h =================================================================== --- src/paragraph_funcs.h (revision 13423) +++ src/paragraph_funcs.h (working copy) @@ -12,6 +12,8 @@ #ifndef PARAGRAPH_FUNCS_H #define PARAGRAPH_FUNCS_H +#include "ParagraphList_fwd.h" + #include "support/types.h" class Buffer; @@ -19,7 +21,6 @@ class InsetBase; class LyXFont; class Paragraph; -class ParagraphList; /** * This breaks a paragraph at the specified position. Index: src/output_docbook.C =================================================================== --- src/output_docbook.C (revision 13423) +++ src/output_docbook.C (working copy) @@ -20,7 +20,7 @@ #include "debug.h" #include "paragraph.h" #include "paragraph_funcs.h" -#include "ParagraphList_fwd.h" +#include "ParagraphList.h" #include "ParagraphParameters.h" #include "sgml.h" @@ -47,7 +47,7 @@ ParagraphList::const_iterator searchParagraph(ParagraphList::const_iterator const & par, ParagraphList::const_iterator const & pend) { - ParagraphList::const_iterator p = par + 1; + ParagraphList::const_iterator p = boost::next(par); for( ; p != pend && p->layout()->latextype == LATEX_PARAGRAPH; ++p); @@ -59,7 +59,7 @@ ParagraphList::const_iterator const & pend) { LyXLayout_ptr const & bstyle = par->layout(); - ParagraphList::const_iterator p = par + 1; + ParagraphList::const_iterator p = boost::next(par); for( ; p != pend; ++p) { LyXLayout_ptr const & style = p->layout(); @@ -74,7 +74,7 @@ ParagraphList::const_iterator const & pend) { LyXLayout_ptr const & bstyle = par->layout(); - ParagraphList::const_iterator p = par + 1; + ParagraphList::const_iterator p = boost::next(par); for( ; p != pend; ++p) { LyXLayout_ptr const & style = p->layout(); if( style->latextype == LATEX_COMMAND) @@ -108,10 +108,10 @@ if (par != pbegin) os << '\n'; if (par->layout() == defaultstyle && par->emptyTag()) { - par->simpleDocBookOnePar(buf, os, runparams, outerFont(par - paragraphs.begin(), paragraphs)); + par->simpleDocBookOnePar(buf, os, runparams, outerFont(std::distance(paragraphs.begin(), par), paragraphs)); } else { sgml::openTag(buf, os, runparams, *par); - par->simpleDocBookOnePar(buf, os, runparams, outerFont(par - paragraphs.begin(), paragraphs)); + par->simpleDocBookOnePar(buf, os, runparams, outerFont(std::distance(paragraphs.begin(), par), paragraphs)); sgml::closeTag(os, *par); } } @@ -170,7 +170,7 @@ case LATEX_ITEM_ENVIRONMENT: { if(par->params().depth() == pbegin->params().depth()) { sgml::openTag(os, wrapper); - par->simpleDocBookOnePar(buf, os, runparams, outerFont(par - paragraphs.begin(), paragraphs), sep); + par->simpleDocBookOnePar(buf, os, runparams, outerFont(std::distance(paragraphs.begin(), par), paragraphs), sep); sgml::closeTag(os, wrapper); ++par; } @@ -239,7 +239,7 @@ // Opend inner tag and close inner tags sgml::openTag(os, bstyle->innertag()); - par->simpleDocBookOnePar(buf, os, runparams, outerFont(par - paragraphs.begin(), paragraphs)); + par->simpleDocBookOnePar(buf, os, runparams, outerFont(std::distance(paragraphs.begin(), par), paragraphs)); sgml::closeTag(os, bstyle->innertag()); os << '\n'; Index: src/output_linuxdoc.h =================================================================== --- src/output_linuxdoc.h (revision 13423) +++ src/output_linuxdoc.h (working copy) @@ -13,10 +13,11 @@ #ifndef OUTPUT_LINUXDOC_H #define OUTPUT_LINUXDOC_H +#include "ParagraphList_fwd.h" + #include <iosfwd> class Buffer; -class ParagraphList; class OutputParams; /// Index: src/output_docbook.h =================================================================== --- src/output_docbook.h (revision 13423) +++ src/output_docbook.h (working copy) @@ -13,11 +13,12 @@ #ifndef OUTPUT_DOCBOOK_H #define OUTPUT_DOCBOOK_H +#include "ParagraphList_fwd.h" + #include <iosfwd> class Buffer; class OutputParams; -class ParagraphList; /// void docbookParagraphs(ParagraphList const & subset, Index: src/paragraph.C =================================================================== --- src/paragraph.C (revision 13423) +++ src/paragraph.C (working copy) @@ -66,10 +66,6 @@ using std::ostringstream; -ParagraphList::ParagraphList() -{} - - Paragraph::Paragraph() : begin_of_body_(0), pimpl_(new Paragraph::Pimpl(this)) { Index: src/buffer_funcs.C =================================================================== --- src/buffer_funcs.C (revision 13423) +++ src/buffer_funcs.C (working copy) @@ -27,7 +27,7 @@ #include "lyxtextclass.h" #include "paragraph.h" #include "paragraph_funcs.h" -#include "ParagraphList_fwd.h" +#include "ParagraphList.h" #include "ParagraphParameters.h" #include "pariterator.h" #include "lyxvc.h" Index: src/text.C =================================================================== --- src/text.C (revision 13423) +++ src/text.C (working copy) @@ -1414,8 +1414,8 @@ if (type == Change::DELETED) { ParagraphList & plist = paragraphs(); if (it.pit() + 1 < et.pit()) - pars_.erase(plist.begin() + it.pit() + 1, - plist.begin() + et.pit()); + pars_.erase(boost::next(plist.begin(), it.pit() + 1), + boost::next(plist.begin(), et.pit())); // Paragraph merge if appropriate: if (pars_[it.pit()].lookupChange(pars_[it.pit()].size()) @@ -1451,8 +1451,8 @@ if (type == Change::INSERTED) { ParagraphList & plist = paragraphs(); if (it.pit() + 1 < et.pit()) - pars_.erase(plist.begin() + it.pit() + 1, - plist.begin() + et.pit()); + pars_.erase(boost::next(plist.begin(), it.pit() + 1), + boost::next(plist.begin(), et.pit())); // Paragraph merge if appropriate: if (pars_[it.pit()].lookupChange(pars_[it.pit()].size()) == Change::INSERTED) { Index: src/output_latex.C =================================================================== --- src/output_latex.C (revision 13423) +++ src/output_latex.C (working copy) @@ -333,7 +333,7 @@ os << everypar; bool need_par = pit->simpleTeXOnePar(buf, bparams, - outerFont(pit - paragraphs.begin(), paragraphs), + outerFont(std::distance(paragraphs.begin(), pit), paragraphs), os, texrow, runparams); // Make sure that \\par is done with the font of the last @@ -346,8 +346,8 @@ // We do not need to use to change the font for the last paragraph // or for a command. LyXFont const outerfont = - outerFont(pit - paragraphs.begin(), -paragraphs); + outerFont(std::distance(paragraphs.begin(), pit), + paragraphs); LyXFont const font = (pit->empty()
-- Lgb