Merge Abdel's ParagraphList from trunk

* 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/branches/BRANCH_1_4_X@13487 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Georg Baum 2006-03-24 17:37:15 +00:00
parent 3f2c546936
commit 5822df009a
30 changed files with 361 additions and 64 deletions

View File

@ -35,8 +35,3 @@ they have not yet been applied because of incomplete testing.
making latex.
http://bugzilla.lyx.org/show_bug.cgi?id=1973
- Bookmarks and links to LaTeX errors are broken after paragraph
deletion/insertion.
http://bugzilla.lyx.org/show_bug.cgi?id=2284
http://bugzilla.lyx.org/show_bug.cgi?id=2242

View File

@ -214,14 +214,16 @@ pasteSelectionHelper(Buffer const & buffer,
// 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 @@ void copySelectionHelper(ParagraphList & pars,
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());

View File

@ -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 Buffer;
class ErrorList;
class LyXTextClass;
class LCursor;
class ParagraphList;
///
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
#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

View File

@ -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 LaTeXFeatures;
class Language;
class MacroData;
class OutputParams;
class ParagraphList;
class ParConstIterator;
class ParIterator;
class TeXErrors;

View File

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

View File

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

View File

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

View File

@ -289,6 +289,7 @@ int InsetCharStyle::linuxdoc(Buffer const & buf, ostream & os,
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 @@ int InsetCharStyle::docbook(Buffer const & buf, ostream & os,
for (; par != end; ++par) {
par->simpleDocBookOnePar(buf, os, runparams,
outerFont(par - paragraphs().begin(),
outerFont(std::distance(beg, par),
paragraphs()));
}

View File

@ -412,7 +412,8 @@ void InsetText::appendParagraphs(Buffer * buffer, ParagraphList & plist)
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));

View File

@ -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 BufferView;
class CursorSlice;
class Dimension;
class LColor_color;
class ParagraphList;
/**

View File

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

View File

@ -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 @@ namespace {
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 searchCommand(ParagraphList::const_iterator const
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 searchEnvironment(ParagraphList::const_iterator co
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 @@ ParagraphList::const_iterator makeParagraph(Buffer const & buf,
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 @@ ParagraphList::const_iterator makeEnvironment(Buffer const & buf,
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 @@ ParagraphList::const_iterator makeCommand(Buffer const & buf,
// 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';

View File

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

View File

@ -333,7 +333,7 @@ TeXOnePar(Buffer const & buf,
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 @@ TeXOnePar(Buffer const & buf,
// 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()

View File

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

View File

@ -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 @@ void linuxdocParagraphs(Buffer const & buf,
}
pit->simpleLinuxDocOnePar(buf, os,
outerFont(pit - paragraphs.begin(), paragraphs),
outerFont(std::distance(paragraphs.begin(), pit), paragraphs),
runparams, depth);
os << "\n";

View File

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

View File

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

View File

@ -66,10 +66,6 @@ using std::ostream;
using std::ostringstream;
ParagraphList::ParagraphList()
{}
Paragraph::Paragraph()
: 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
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 @@ void breakParagraphConservative(BufferParams const & bparams,
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 @@ void mergeParagraph(BufferParams const & bparams,
// 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));
}

View File

@ -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 BufferParams;
class InsetBase;
class LyXFont;
class Paragraph;
class ParagraphList;
/**
* This breaks a paragraph at the specified position.

View File

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

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) {
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 @@ void LyXText::rejectChange(LCursor & cur)
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) {

View File

@ -1258,7 +1258,7 @@ bool LyXText::deleteEmptyParagraphMechanism(LCursor & cur, LCursor & old)
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()) {

View File

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

View File

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

View File

@ -107,3 +107,6 @@ What's new
- Compilation fix (gtk frontend) for gcc 4.1.
- Bookmarks and links to LaTeX errors are broken after paragraph
deletion/insertion (bugs 2284 and 2242).