From: Abdelrazak Younes Date: Sat, 18 Dec 2010 08:23:14 +0000 (+0000) Subject: latexParagraphs(): cleanup a bit and switch to a 'for' loop. Hopefully this should... X-Git-Tag: 2.0.0~1333 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=f48f0ad0bff5470338718a54de48874d803cd376;p=lyx.git latexParagraphs(): cleanup a bit and switch to a 'for' loop. Hopefully this should fix the performance problem when exporting very big document to latex. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@36932 a592a061-630c-0410-9148-cb99ea01b6c8 --- diff --git a/src/output_latex.cpp b/src/output_latex.cpp index cc56d6b672..a46af021bc 100644 --- a/src/output_latex.cpp +++ b/src/output_latex.cpp @@ -930,19 +930,6 @@ void latexParagraphs(Buffer const & buf, BufferParams const & bparams = buf.params(); DocumentClass const & tclass = bparams.documentClass(); ParagraphList const & paragraphs = text.paragraphs(); - ParagraphList::const_iterator par = paragraphs.begin(); - ParagraphList::const_iterator endpar = paragraphs.end(); - - LASSERT(runparams.par_begin <= runparams.par_end, /**/); - // if only part of the paragraphs will be outputed - if (runparams.par_begin != runparams.par_end) { - par = boost::next(paragraphs.begin(), runparams.par_begin); - endpar = boost::next(paragraphs.begin(), runparams.par_end); - // runparams will be passed to nested paragraphs, so - // we have to reset the range parameters. - const_cast(runparams).par_begin = 0; - const_cast(runparams).par_end = 0; - } bool const maintext = text.isMainText(); bool const is_child = buf.masterBuffer() != &buf; @@ -980,10 +967,28 @@ void latexParagraphs(Buffer const & buf, texrow.newline(); } - ParagraphList::const_iterator lastpar; + LASSERT(runparams.par_begin <= runparams.par_end, /**/); + // if only part of the paragraphs will be outputed + bool const partial_export = (runparams.par_begin != runparams.par_end); + pit_type const par_begin = partial_export ? runparams.par_begin : 0; + pit_type const par_end = partial_export ? runparams.par_end : paragraphs.size(); + + if (partial_export) { + // runparams will be passed to nested paragraphs, so + // we have to reset the range parameters. + const_cast(runparams).par_begin = 0; + const_cast(runparams).par_end = 0; + } + + pit_type pit = par_begin; + // lastpit is for the language check after the loop. + pit_type lastpit; + ParagraphList::const_iterator par; // if only_body - while (par != endpar) { - lastpar = par; + for (; pit < par_end; ++pit) { + lastpit = pit; + par = paragraphs.constIterator(pit); + // FIXME This check should not be needed. We should // perhaps issue an error if it is. Layout const & layout = text.inset().forcePlainLayout() ? @@ -1017,19 +1022,19 @@ void latexParagraphs(Buffer const & buf, was_title = false; } - if (layout.isEnvironment() || - !par->params().leftIndent().zero()) { - TeXEnvironementData const data = prepareEnvironement(buf, text, - par, os, texrow, runparams); - par = TeXEnvironment(buf, text, par, os, texrow, runparams); - finishEnvironement(os, texrow, runparams, data); - } else { + if (!layout.isEnvironment() && par->params().leftIndent().zero()) { + // Standard top level paragraph. TeXOnePar(buf, text, par, os, texrow, runparams, everypar); - if (par != paragraphs.end()) - par++; + continue; } - if (distance(lastpar, par) >= distance(lastpar, endpar)) - break; + + TeXEnvironementData const data = prepareEnvironement(buf, text, par, + os, texrow, runparams); + par = TeXEnvironment(buf, text, par, os, texrow, runparams); + finishEnvironement(os, texrow, runparams, data); + pit = paragraphs.position(par); + //FIXME: TeXEnvironment() advances one par too much. + pit--; } // It might be that we only have a title in this document @@ -1050,7 +1055,7 @@ void latexParagraphs(Buffer const & buf, string const lang_end_command = runparams.use_polyglossia ? "\\end{$$lang}" : lyxrc.language_command_end; if (maintext && !lyxrc.language_auto_end && !mainlang.empty() && - lastpar->getParLanguage(bparams)->encoding()->package() != Encoding::CJK) { + paragraphs.at(lastpit).getParLanguage(bparams)->encoding()->package() != Encoding::CJK) { os << from_utf8(subst(lang_end_command, "$$lang", mainlang)) diff --git a/src/support/RandomAccessList.h b/src/support/RandomAccessList.h index 4c48b36db2..2565d62513 100644 --- a/src/support/RandomAccessList.h +++ b/src/support/RandomAccessList.h @@ -293,6 +293,12 @@ public: return s; } + + const_iterator constIterator(size_t i) const + { + return iterCont_[i]; + } + private: void recreateVector() {