* 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



git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@13467 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Lars Gullik Bjønnes 2006-03-23 20:11:06 +00:00
parent 399e6e788c
commit 9d6cad3fe6
29 changed files with 409 additions and 59 deletions

View File

@ -35,8 +35,10 @@ src/frontends/controllers/character.C
src/frontends/controllers/frnt_lang.C src/frontends/controllers/frnt_lang.C
src/frontends/controllers/helper_funcs.C src/frontends/controllers/helper_funcs.C
src/frontends/gtk/Dialogs.C src/frontends/gtk/Dialogs.C
src/frontends/gtk/GAboutlyx.C
src/frontends/gtk/GBC.h src/frontends/gtk/GBC.h
src/frontends/gtk/GBibItem.C src/frontends/gtk/GBibItem.C
src/frontends/gtk/GBibtex.C
src/frontends/gtk/GBox.C src/frontends/gtk/GBox.C
src/frontends/gtk/GBranch.C src/frontends/gtk/GBranch.C
src/frontends/gtk/GChanges.C src/frontends/gtk/GChanges.C
@ -54,6 +56,7 @@ src/frontends/gtk/GMathPanel.C
src/frontends/gtk/GMathsMatrix.C src/frontends/gtk/GMathsMatrix.C
src/frontends/gtk/GNote.C src/frontends/gtk/GNote.C
src/frontends/gtk/GParagraph.C src/frontends/gtk/GParagraph.C
src/frontends/gtk/GPreferences.C
src/frontends/gtk/GRef.C src/frontends/gtk/GRef.C
src/frontends/gtk/GSearch.C src/frontends/gtk/GSearch.C
src/frontends/gtk/GSendto.C src/frontends/gtk/GSendto.C
@ -114,6 +117,54 @@ src/frontends/qt2/Qt2BC.h
src/frontends/qt2/QtView.C src/frontends/qt2/QtView.C
src/frontends/qt2/floatplacement.C src/frontends/qt2/floatplacement.C
src/frontends/qt2/validators.C src/frontends/qt2/validators.C
src/frontends/qt4/Alert_pimpl.C
src/frontends/qt4/BulletsModule.C
src/frontends/qt4/Dialogs.C
src/frontends/qt4/FileDialog.C
src/frontends/qt4/QAbout.C
src/frontends/qt4/QBibitem.C
src/frontends/qt4/QBibtex.C
src/frontends/qt4/QBox.C
src/frontends/qt4/QBoxDialog.C
src/frontends/qt4/QBranch.C
src/frontends/qt4/QBranches.C
src/frontends/qt4/QChanges.C
src/frontends/qt4/QCharacter.C
src/frontends/qt4/QCitation.C
src/frontends/qt4/QCommandBuffer.C
src/frontends/qt4/QDelimiterDialog.C
src/frontends/qt4/QDocument.C
src/frontends/qt4/QDocumentDialog.C
src/frontends/qt4/QERT.C
src/frontends/qt4/QExternal.C
src/frontends/qt4/QFloat.C
src/frontends/qt4/QGraphics.C
src/frontends/qt4/QInclude.C
src/frontends/qt4/QMath.C
src/frontends/qt4/QMathDialog.C
src/frontends/qt4/QMathMatrixDialog.C
src/frontends/qt4/QNote.C
src/frontends/qt4/QParagraph.C
src/frontends/qt4/QPrefs.C
src/frontends/qt4/QPrefsDialog.C
src/frontends/qt4/QPrint.C
src/frontends/qt4/QRef.C
src/frontends/qt4/QSearch.C
src/frontends/qt4/QSendto.C
src/frontends/qt4/QShowFile.C
src/frontends/qt4/QSpellchecker.C
src/frontends/qt4/QTabular.C
src/frontends/qt4/QTabularCreate.C
src/frontends/qt4/QTexinfo.C
src/frontends/qt4/QThesaurus.C
src/frontends/qt4/QToc.C
src/frontends/qt4/QURL.C
src/frontends/qt4/QVSpace.C
src/frontends/qt4/QWrap.C
src/frontends/qt4/Qt2BC.h
src/frontends/qt4/QtView.C
src/frontends/qt4/floatplacement.C
src/frontends/qt4/validators.C
src/frontends/xforms/Alert_pimpl.C src/frontends/xforms/Alert_pimpl.C
src/frontends/xforms/ColorHandler.C src/frontends/xforms/ColorHandler.C
src/frontends/xforms/Dialogs.C src/frontends/xforms/Dialogs.C

View File

@ -214,14 +214,16 @@ pasteSelectionHelper(Buffer const & buffer,
// Paste it! // Paste it!
if (empty) { if (empty) {
pars.insert(pars.begin() + pit, insertion.begin(), pars.insert(boost::next(pars.begin(), pit),
insertion.begin(),
insertion.end()); insertion.end());
// merge the empty par with the last par of the insertion // merge the empty par with the last par of the insertion
mergeParagraph(buffer.params(), pars, mergeParagraph(buffer.params(), pars,
pit + insertion.size() - 1); pit + insertion.size() - 1);
} else { } else {
pars.insert(pars.begin() + pit + 1, insertion.begin(), pars.insert(boost::next(pars.begin(), pit + 1),
insertion.begin(),
insertion.end()); insertion.end());
// merge the first par of the insertion with the current par // merge the first par of the insertion with the current par
@ -314,7 +316,8 @@ void copySelectionHelper(ParagraphList & pars,
BOOST_ASSERT(startpit != endpit || start <= end); BOOST_ASSERT(startpit != endpit || start <= end);
// Clone the paragraphs within the selection. // 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()); for_each(paragraphs.begin(), paragraphs.end(), resetOwnerAndChanges());

View File

@ -14,6 +14,8 @@
#ifndef CUTANDPASTE_H #ifndef CUTANDPASTE_H
#define CUTANDPASTE_H #define CUTANDPASTE_H
#include "ParagraphList_fwd.h"
#include "support/types.h" #include "support/types.h"
#include <string> #include <string>
@ -23,7 +25,6 @@ class Buffer;
class ErrorList; class ErrorList;
class LyXTextClass; class LyXTextClass;
class LCursor; class LCursor;
class ParagraphList;
/// ///
namespace lyx { namespace lyx {

22
src/ParagraphList.h Normal file
View File

@ -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

View File

@ -12,22 +12,11 @@
#ifndef PARAGRAPH_LIST_FWD_H #ifndef PARAGRAPH_LIST_FWD_H
#define 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> typedef RandomAccessList<Paragraph> ParagraphList;
{
public:
///
typedef std::vector<Paragraph> BaseType;
///
ParagraphList();
///
template <class Iter>
ParagraphList(Iter beg, Iter end)
: BaseType(beg, end)
{}
};
#endif #endif

View File

@ -15,6 +15,7 @@
#include "InsetList.h" #include "InsetList.h"
#include "dociterator.h" #include "dociterator.h"
#include "ParagraphList_fwd.h"
#include "support/limited_stack.h" #include "support/limited_stack.h"
#include "support/types.h" #include "support/types.h"
@ -42,7 +43,6 @@ class LaTeXFeatures;
class Language; class Language;
class MacroData; class MacroData;
class OutputParams; class OutputParams;
class ParagraphList;
class ParConstIterator; class ParConstIterator;
class ParIterator; class ParIterator;
class TeXErrors; class TeXErrors;

View File

@ -27,7 +27,7 @@
#include "lyxtextclass.h" #include "lyxtextclass.h"
#include "paragraph.h" #include "paragraph.h"
#include "paragraph_funcs.h" #include "paragraph_funcs.h"
#include "ParagraphList_fwd.h" #include "ParagraphList.h"
#include "ParagraphParameters.h" #include "ParagraphParameters.h"
#include "pariterator.h" #include "pariterator.h"
#include "lyxvc.h" #include "lyxvc.h"

View File

@ -22,7 +22,7 @@
#include "lyx_main.h" #include "lyx_main.h"
#include "output_latex.h" #include "output_latex.h"
#include "paragraph.h" #include "paragraph.h"
#include "ParagraphList_fwd.h" #include "ParagraphList.h"
#include "frontends/Alert.h" #include "frontends/Alert.h"

View File

@ -19,7 +19,7 @@
#include "lyxfont.h" #include "lyxfont.h"
#include "lyxlex.h" #include "lyxlex.h"
#include "paragraph.h" #include "paragraph.h"
#include "ParagraphList_fwd.h" #include "ParagraphList.h"
#include "frontends/font_metrics.h" #include "frontends/font_metrics.h"

View File

@ -289,6 +289,7 @@ int InsetCharStyle::linuxdoc(Buffer const & buf, ostream & os,
int InsetCharStyle::docbook(Buffer const & buf, ostream & os, int InsetCharStyle::docbook(Buffer const & buf, ostream & os,
OutputParams const & runparams) const OutputParams const & runparams) const
{ {
ParagraphList::const_iterator beg = paragraphs().begin();
ParagraphList::const_iterator par = paragraphs().begin(); ParagraphList::const_iterator par = paragraphs().begin();
ParagraphList::const_iterator end = paragraphs().end(); ParagraphList::const_iterator end = paragraphs().end();
@ -298,7 +299,7 @@ int InsetCharStyle::docbook(Buffer const & buf, ostream & os,
for (; par != end; ++par) { for (; par != end; ++par) {
par->simpleDocBookOnePar(buf, os, runparams, par->simpleDocBookOnePar(buf, os, runparams,
outerFont(par - paragraphs().begin(), outerFont(std::distance(beg, par),
paragraphs())); paragraphs()));
} }

View File

@ -422,7 +422,8 @@ void InsetText::appendParagraphs(Buffer * buffer, ParagraphList & plist)
ParagraphList::iterator pit = plist.begin(); ParagraphList::iterator pit = plist.begin();
ParagraphList::iterator ins = pl.insert(pl.end(), *pit); ParagraphList::iterator ins = pl.insert(pl.end(), *pit);
++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(), for_each(pit, plist.end(),
bind(&ParagraphList::push_back, ref(pl), _1)); bind(&ParagraphList::push_back, ref(pl), _1));

View File

@ -16,6 +16,7 @@
#include "RowList_fwd.h" #include "RowList_fwd.h"
#include "lyxfont.h" #include "lyxfont.h"
#include "lyxtext.h" #include "lyxtext.h"
#include "ParagraphList_fwd.h"
#include "support/types.h" #include "support/types.h"
@ -27,7 +28,6 @@ class BufferView;
class CursorSlice; class CursorSlice;
class Dimension; class Dimension;
class LColor_color; class LColor_color;
class ParagraphList;
/** /**

View File

@ -21,7 +21,7 @@
#include "lyxfont.h" #include "lyxfont.h"
#include "layout.h" #include "layout.h"
#include "lyxlayout_ptr_fwd.h" #include "lyxlayout_ptr_fwd.h"
#include "ParagraphList_fwd.h" #include "ParagraphList.h"
#include <iosfwd> #include <iosfwd>

View File

@ -20,7 +20,7 @@
#include "debug.h" #include "debug.h"
#include "paragraph.h" #include "paragraph.h"
#include "paragraph_funcs.h" #include "paragraph_funcs.h"
#include "ParagraphList_fwd.h" #include "ParagraphList.h"
#include "ParagraphParameters.h" #include "ParagraphParameters.h"
#include "sgml.h" #include "sgml.h"
@ -47,7 +47,7 @@ namespace {
ParagraphList::const_iterator searchParagraph(ParagraphList::const_iterator const & par, ParagraphList::const_iterator searchParagraph(ParagraphList::const_iterator const & par,
ParagraphList::const_iterator const & pend) 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); for( ; p != pend && p->layout()->latextype == LATEX_PARAGRAPH; ++p);
@ -59,7 +59,7 @@ ParagraphList::const_iterator searchCommand(ParagraphList::const_iterator const
ParagraphList::const_iterator const & pend) ParagraphList::const_iterator const & pend)
{ {
LyXLayout_ptr const & bstyle = par->layout(); LyXLayout_ptr const & bstyle = par->layout();
ParagraphList::const_iterator p = par + 1; ParagraphList::const_iterator p = boost::next(par);
for( ; p != pend; ++p) { for( ; p != pend; ++p) {
LyXLayout_ptr const & style = p->layout(); LyXLayout_ptr const & style = p->layout();
@ -74,7 +74,7 @@ ParagraphList::const_iterator searchEnvironment(ParagraphList::const_iterator co
ParagraphList::const_iterator const & pend) ParagraphList::const_iterator const & pend)
{ {
LyXLayout_ptr const & bstyle = par->layout(); LyXLayout_ptr const & bstyle = par->layout();
ParagraphList::const_iterator p = par + 1; ParagraphList::const_iterator p = boost::next(par);
for( ; p != pend; ++p) { for( ; p != pend; ++p) {
LyXLayout_ptr const & style = p->layout(); LyXLayout_ptr const & style = p->layout();
if( style->latextype == LATEX_COMMAND) if( style->latextype == LATEX_COMMAND)
@ -108,10 +108,10 @@ ParagraphList::const_iterator makeParagraph(Buffer const & buf,
if (par != pbegin) if (par != pbegin)
os << '\n'; os << '\n';
if (par->layout() == defaultstyle && par->emptyTag()) { 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 { } else {
sgml::openTag(buf, os, runparams, *par); 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); sgml::closeTag(os, *par);
} }
} }
@ -170,7 +170,7 @@ ParagraphList::const_iterator makeEnvironment(Buffer const & buf,
case LATEX_ITEM_ENVIRONMENT: { case LATEX_ITEM_ENVIRONMENT: {
if(par->params().depth() == pbegin->params().depth()) { if(par->params().depth() == pbegin->params().depth()) {
sgml::openTag(os, wrapper); 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); sgml::closeTag(os, wrapper);
++par; ++par;
} }
@ -239,7 +239,7 @@ ParagraphList::const_iterator makeCommand(Buffer const & buf,
// Opend inner tag and close inner tags // Opend inner tag and close inner tags
sgml::openTag(os, bstyle->innertag()); 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()); sgml::closeTag(os, bstyle->innertag());
os << '\n'; os << '\n';

View File

@ -13,11 +13,12 @@
#ifndef OUTPUT_DOCBOOK_H #ifndef OUTPUT_DOCBOOK_H
#define OUTPUT_DOCBOOK_H #define OUTPUT_DOCBOOK_H
#include "ParagraphList_fwd.h"
#include <iosfwd> #include <iosfwd>
class Buffer; class Buffer;
class OutputParams; class OutputParams;
class ParagraphList;
/// ///
void docbookParagraphs(ParagraphList const & subset, void docbookParagraphs(ParagraphList const & subset,

View File

@ -333,7 +333,7 @@ TeXOnePar(Buffer const & buf,
os << everypar; os << everypar;
bool need_par = pit->simpleTeXOnePar(buf, bparams, bool need_par = pit->simpleTeXOnePar(buf, bparams,
outerFont(pit - paragraphs.begin(), paragraphs), outerFont(std::distance(paragraphs.begin(), pit), paragraphs),
os, texrow, runparams); os, texrow, runparams);
// Make sure that \\par is done with the font of the last // Make sure that \\par is done with the font of the last
@ -346,8 +346,8 @@ TeXOnePar(Buffer const & buf,
// We do not need to use to change the font for the last paragraph // We do not need to use to change the font for the last paragraph
// or for a command. // or for a command.
LyXFont const outerfont = LyXFont const outerfont =
outerFont(pit - paragraphs.begin(), outerFont(std::distance(paragraphs.begin(), pit),
paragraphs); paragraphs);
LyXFont const font = LyXFont const font =
(pit->empty() (pit->empty()

View File

@ -12,11 +12,12 @@
#ifndef OUTPUT_LATEX_H #ifndef OUTPUT_LATEX_H
#define OUTPUT_LATEX_H #define OUTPUT_LATEX_H
#include "ParagraphList_fwd.h"
#include <string> #include <string>
class Buffer; class Buffer;
class OutputParams; class OutputParams;
class ParagraphList;
class TexRow; class TexRow;
/// Just a wrapper for the method below, first creating the ofstream. /// Just a wrapper for the method below, first creating the ofstream.

View File

@ -17,7 +17,7 @@
#include "bufferparams.h" #include "bufferparams.h"
#include "paragraph.h" #include "paragraph.h"
#include "paragraph_funcs.h" #include "paragraph_funcs.h"
#include "ParagraphList_fwd.h" #include "ParagraphList.h"
#include "ParagraphParameters.h" #include "ParagraphParameters.h"
#include "sgml.h" #include "sgml.h"
@ -133,7 +133,7 @@ void linuxdocParagraphs(Buffer const & buf,
} }
pit->simpleLinuxDocOnePar(buf, os, pit->simpleLinuxDocOnePar(buf, os,
outerFont(pit - paragraphs.begin(), paragraphs), outerFont(std::distance(paragraphs.begin(), pit), paragraphs),
runparams, depth); runparams, depth);
os << "\n"; os << "\n";

View File

@ -13,10 +13,11 @@
#ifndef OUTPUT_LINUXDOC_H #ifndef OUTPUT_LINUXDOC_H
#define OUTPUT_LINUXDOC_H #define OUTPUT_LINUXDOC_H
#include "ParagraphList_fwd.h"
#include <iosfwd> #include <iosfwd>
class Buffer; class Buffer;
class ParagraphList;
class OutputParams; class OutputParams;
/// ///

View File

@ -19,7 +19,7 @@
#include "output.h" #include "output.h"
#include "outputparams.h" #include "outputparams.h"
#include "paragraph.h" #include "paragraph.h"
#include "ParagraphList_fwd.h" #include "ParagraphList.h"
#include "ParagraphParameters.h" #include "ParagraphParameters.h"
#include "support/lstrings.h" #include "support/lstrings.h"

View File

@ -66,10 +66,6 @@ using std::ostream;
using std::ostringstream; using std::ostringstream;
ParagraphList::ParagraphList()
{}
Paragraph::Paragraph() Paragraph::Paragraph()
: begin_of_body_(0), pimpl_(new Paragraph::Pimpl(this)) : begin_of_body_(0), pimpl_(new Paragraph::Pimpl(this))
{ {

View File

@ -96,7 +96,8 @@ void breakParagraph(BufferParams const & bparams,
{ {
// create a new paragraph, and insert into the list // create a new paragraph, and insert into the list
ParagraphList::iterator tmp = 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]; Paragraph & par = pars[par_offset];
@ -193,7 +194,8 @@ void breakParagraphConservative(BufferParams const & bparams,
ParagraphList & pars, pit_type par_offset, pos_type pos) ParagraphList & pars, pit_type par_offset, pos_type pos)
{ {
// create a new paragraph // 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]; Paragraph & par = pars[par_offset];
if (bparams.tracking_changes) if (bparams.tracking_changes)
@ -259,7 +261,7 @@ void mergeParagraph(BufferParams const & bparams,
// Move the change status of "carriage return" over // Move the change status of "carriage return" over
par.setChange(par.size(), cr); par.setChange(par.size(), cr);
pars.erase(pars.begin() + par_offset + 1); pars.erase(boost::next(pars.begin(), par_offset + 1));
} }

View File

@ -12,6 +12,8 @@
#ifndef PARAGRAPH_FUNCS_H #ifndef PARAGRAPH_FUNCS_H
#define PARAGRAPH_FUNCS_H #define PARAGRAPH_FUNCS_H
#include "ParagraphList_fwd.h"
#include "support/types.h" #include "support/types.h"
class Buffer; class Buffer;
@ -19,7 +21,6 @@ class BufferParams;
class InsetBase; class InsetBase;
class LyXFont; class LyXFont;
class Paragraph; class Paragraph;
class ParagraphList;
/** /**
* This breaks a paragraph at the specified position. * This breaks a paragraph at the specified position.

View File

@ -13,6 +13,7 @@
#define PARITERATOR_H #define PARITERATOR_H
#include "dociterator.h" #include "dociterator.h"
#include "ParagraphList_fwd.h"
#include "support/types.h" #include "support/types.h"
@ -24,7 +25,6 @@
class InsetBase; class InsetBase;
class LyXText; class LyXText;
class ParagraphList;
class ParIterator : public std::iterator<std::forward_iterator_tag, Paragraph>, class ParIterator : public std::iterator<std::forward_iterator_tag, Paragraph>,

View File

@ -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

View File

@ -1414,8 +1414,8 @@ void LyXText::acceptChange(LCursor & cur)
if (type == Change::DELETED) { if (type == Change::DELETED) {
ParagraphList & plist = paragraphs(); ParagraphList & plist = paragraphs();
if (it.pit() + 1 < et.pit()) if (it.pit() + 1 < et.pit())
pars_.erase(plist.begin() + it.pit() + 1, pars_.erase(boost::next(plist.begin(), it.pit() + 1),
plist.begin() + et.pit()); boost::next(plist.begin(), et.pit()));
// Paragraph merge if appropriate: // Paragraph merge if appropriate:
if (pars_[it.pit()].lookupChange(pars_[it.pit()].size()) if (pars_[it.pit()].lookupChange(pars_[it.pit()].size())
@ -1451,8 +1451,8 @@ void LyXText::rejectChange(LCursor & cur)
if (type == Change::INSERTED) { if (type == Change::INSERTED) {
ParagraphList & plist = paragraphs(); ParagraphList & plist = paragraphs();
if (it.pit() + 1 < et.pit()) if (it.pit() + 1 < et.pit())
pars_.erase(plist.begin() + it.pit() + 1, pars_.erase(boost::next(plist.begin(), it.pit() + 1),
plist.begin() + et.pit()); boost::next(plist.begin(), et.pit()));
// Paragraph merge if appropriate: // Paragraph merge if appropriate:
if (pars_[it.pit()].lookupChange(pars_[it.pit()].size()) if (pars_[it.pit()].lookupChange(pars_[it.pit()].size())
== Change::INSERTED) { == Change::INSERTED) {

View File

@ -1258,7 +1258,7 @@ bool LyXText::deleteEmptyParagraphMechanism(LCursor & cur, LCursor & old)
max(old.pit() - 1, pit_type(0)), max(old.pit() - 1, pit_type(0)),
min(old.pit() + 1, old.lastpit())); min(old.pit() + 1, old.lastpit()));
ParagraphList & plist = old.text()->paragraphs(); ParagraphList & plist = old.text()->paragraphs();
plist.erase(plist.begin() + old.pit()); plist.erase(boost::next(plist.begin(), old.pit()));
// see #warning above // see #warning above
if (cur.depth() >= old.depth()) { if (cur.depth() >= old.depth()) {

View File

@ -22,6 +22,7 @@
#include "BufferView.h" #include "BufferView.h"
#include "lyxtext.h" #include "lyxtext.h"
#include "paragraph.h" #include "paragraph.h"
#include "ParagraphList.h"
#include "mathed/math_support.h" #include "mathed/math_support.h"
#include "insets/inset.h" #include "insets/inset.h"

View File

@ -17,7 +17,7 @@
#define UNDO_H #define UNDO_H
#include "dociterator.h" #include "dociterator.h"
#include "ParagraphList_fwd.h" #include "ParagraphList.h"
#include "bufferparams.h" #include "bufferparams.h"
#include "support/types.h" #include "support/types.h"