From b676c4e77dece2a0642c898e27d76a726a0855f7 Mon Sep 17 00:00:00 2001 From: Angus Leeming Date: Tue, 16 Jul 2002 18:10:51 +0000 Subject: [PATCH] Small tidy up of preview code, part II. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@4655 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/graphics/ChangeLog | 8 ++ src/graphics/PreviewLoader.C | 181 ++++++++++++++++++++++------------- src/graphics/Previews.C | 19 ++-- src/graphics/Previews.h | 6 +- 4 files changed, 131 insertions(+), 83 deletions(-) diff --git a/src/graphics/ChangeLog b/src/graphics/ChangeLog index 6c0cfd02be..cf8d110466 100644 --- a/src/graphics/ChangeLog +++ b/src/graphics/ChangeLog @@ -1,3 +1,11 @@ +2002-07-16 Angus Leeming + + * PreviewLoader.C: greater use of STL algorithms. + + * Previews.[Ch]: use const in more places. + (generateBufferPreviews): now takes a Buffer const & argument, not a + pointer. + 2002-07-15 John Levon * GraphicsImage.h: remove getPixmap/X, add isDrawable() diff --git a/src/graphics/PreviewLoader.C b/src/graphics/PreviewLoader.C index 887b7ccb92..9344e69e79 100644 --- a/src/graphics/PreviewLoader.C +++ b/src/graphics/PreviewLoader.C @@ -64,9 +64,11 @@ namespace { typedef pair StrPair; -typedef list PendingStore; +// A list of alll snippets to be converted to previews +typedef list PendingSnippets; -typedef vector InProgressStore; +// Each item in the vector is a pair. +typedef vector BitmapFile; double setFontScalingFactor(Buffer &); @@ -95,7 +97,7 @@ struct InProgress { InProgress() : pid(0) {} /// InProgress(string const & filename_base, - PendingStore const & pending, + PendingSnippets const & pending, string const & to_format); /// Remove any files left lying around and kill the forked process. void stop() const; @@ -104,10 +106,13 @@ struct InProgress { pid_t pid; /// string metrics_file; - /// Each item in the vector is a pair. - InProgressStore snippets; + /// + BitmapFile snippets; }; +typedef map InProgressProcesses; + +typedef InProgressProcesses::value_type InProgressProcess; } // namespace anon @@ -136,7 +141,7 @@ private: /// void dumpPreamble(ostream &) const; /// - void dumpData(ostream &, InProgressStore const &) const; + void dumpData(ostream &, BitmapFile const &) const; /** cache_ allows easy retrieval of already-generated images * using the LaTeX snippet as the identifier. @@ -150,15 +155,13 @@ private: /** pending_ stores the LaTeX snippets in anticipation of them being * sent to the converter. */ - PendingStore pending_; + PendingSnippets pending_; /** in_progress_ stores all forked processes so that we can proceed * thereafter. The map uses the conversion commands as its identifiers. */ - typedef map InProgressMap; - /// - InProgressMap in_progress_; + InProgressProcesses in_progress_; /// PreviewLoader & parent_; @@ -223,27 +226,44 @@ void PreviewLoader::startLoading() namespace { +struct IncrementedFileName { + IncrementedFileName(string const & to_format, + string const & filename_base) + : to_format_(to_format), base_(filename_base), counter_(1) + {} + + StrPair const operator()(string const & snippet) + { + ostringstream os; + os << base_ + << setfill('0') << setw(3) << counter_++ + << "." << to_format_; + + string const file = os.str().c_str(); + + return make_pair(snippet, file); + } + +private: + string const & to_format_; + string const & base_; + int counter_; +}; + + InProgress::InProgress(string const & filename_base, - PendingStore const & pending, + PendingSnippets const & pending, string const & to_format) : pid(0), metrics_file(filename_base + ".metrics"), snippets(pending.size()) { - InProgressStore::iterator sit = snippets.begin(); - PendingStore::const_iterator pit = pending.begin(); - PendingStore::const_iterator pend = pending.end(); + PendingSnippets::const_iterator pit = pending.begin(); + PendingSnippets::const_iterator pend = pending.end(); + BitmapFile::iterator sit = snippets.begin(); - int counter = 1; // file numbers start at 1 - for (; pit != pend; ++pit, ++sit, ++counter) { - ostringstream os; - os << filename_base - << setfill('0') << setw(3) << counter - << "." << to_format; - string const file = os.str().c_str(); - - *sit = make_pair(*pit, file); - } + std::transform(pit, pend, sit, + IncrementedFileName(to_format, filename_base)); } @@ -255,8 +275,8 @@ void InProgress::stop() const if (!metrics_file.empty()) lyx::unlink(metrics_file); - InProgressStore::const_iterator vit = snippets.begin(); - InProgressStore::const_iterator vend = snippets.end(); + BitmapFile::const_iterator vit = snippets.begin(); + BitmapFile::const_iterator vend = snippets.end(); for (; vit != vend; ++vit) { if (!vit->second.empty()) lyx::unlink(vit->second); @@ -283,8 +303,8 @@ PreviewLoader::Impl::Impl(PreviewLoader & p, Buffer const & b) PreviewLoader::Impl::~Impl() { - InProgressMap::iterator ipit = in_progress_.begin(); - InProgressMap::iterator ipend = in_progress_.end(); + InProgressProcesses::iterator ipit = in_progress_.begin(); + InProgressProcesses::iterator ipend = in_progress_.end(); for (; ipit != ipend; ++ipit) { ipit->second.stop(); @@ -300,6 +320,25 @@ PreviewLoader::Impl::preview(string const & latex_snippet) const } +namespace { + +struct FindSnippet { + FindSnippet(string const & s) : snippet_(s) {} + bool operator()(InProgressProcess const & process) + { + BitmapFile const & snippets = process.second.snippets; + BitmapFile::const_iterator it = snippets.begin(); + BitmapFile::const_iterator end = snippets.end(); + it = find_if(it, end, FindFirst(snippet_)); + return it != end; + } + +private: + string const & snippet_; +}; + +} // namespace anon + PreviewLoader::Status PreviewLoader::Impl::status(string const & latex_snippet) const { @@ -307,25 +346,19 @@ PreviewLoader::Impl::status(string const & latex_snippet) const if (cit != cache_.end()) return Ready; - PendingStore::const_iterator pit = pending_.begin(); - PendingStore::const_iterator pend = pending_.end(); - pit = find(pit, pend, latex_snippet); + PendingSnippets::const_iterator pit = pending_.begin(); + PendingSnippets::const_iterator pend = pending_.end(); + pit = find(pit, pend, latex_snippet); if (pit != pend) return InQueue; - InProgressMap::const_iterator ipit = in_progress_.begin(); - InProgressMap::const_iterator ipend = in_progress_.end(); + InProgressProcesses::const_iterator ipit = in_progress_.begin(); + InProgressProcesses::const_iterator ipend = in_progress_.end(); - for (; ipit != ipend; ++ipit) { - InProgressStore const & snippets = ipit->second.snippets; - InProgressStore::const_iterator sit = snippets.begin(); - InProgressStore::const_iterator send = snippets.end(); - sit = find_if(sit, send, FindFirst(latex_snippet)); - - if (sit != send) - return Processing; - } + ipit = find_if(ipit, ipend, FindSnippet(latex_snippet)); + if (ipit != ipend) + return Processing; return NotFound; } @@ -340,37 +373,47 @@ void PreviewLoader::Impl::add(string const & latex_snippet) } +namespace { + +struct EraseSnippet { + EraseSnippet(string const & s) : snippet_(s) {} + void operator()(InProgressProcess & process) + { + BitmapFile & snippets = process.second.snippets; + BitmapFile::iterator it = snippets.begin(); + BitmapFile::iterator end = snippets.end(); + + it = find_if(it, end, FindFirst(snippet_)); + if (it != end) + snippets.erase(it, it+1); + } + +private: + string const & snippet_; +}; + +} // namespace anon + + void PreviewLoader::Impl::remove(string const & latex_snippet) { Cache::iterator cit = cache_.find(latex_snippet); if (cit != cache_.end()) cache_.erase(cit); - PendingStore::iterator pit = pending_.begin(); - PendingStore::iterator pend = pending_.end(); - pit = find(pit, pend, latex_snippet); - - if (pit != pend) { - PendingStore::iterator first = pit++; - pending_.erase(first, pit); - } - - InProgressMap::iterator ipit = in_progress_.begin(); - InProgressMap::iterator ipend = in_progress_.end(); + PendingSnippets::iterator pit = pending_.begin(); + PendingSnippets::iterator pend = pending_.end(); - while (ipit != ipend) { - InProgressMap::iterator curr = ipit; - ++ipit; + pending_.erase(std::remove(pit, pend, latex_snippet), pend); - InProgressStore & snippets = curr->second.snippets; - InProgressStore::iterator sit = snippets.begin(); - InProgressStore::iterator send = snippets.end(); - sit = find_if(sit, send, FindFirst(latex_snippet)); + InProgressProcesses::iterator ipit = in_progress_.begin(); + InProgressProcesses::iterator ipend = in_progress_.end(); - if (sit != send) - snippets.erase(sit, sit+1); + std::for_each(ipit, ipend, EraseSnippet(latex_snippet)); - if (snippets.empty()) + for (; ipit != ipend; ++ipit) { + InProgressProcesses::iterator curr = ipit++; + if (curr->second.snippets.empty()) in_progress_.erase(curr); } } @@ -445,7 +488,7 @@ void PreviewLoader::Impl::finishedGenerating(string const & command, return; // Paranoia check! - InProgressMap::iterator git = in_progress_.find(command); + InProgressProcesses::iterator git = in_progress_.find(command); if (git == in_progress_.end()) { lyxerr << "PreviewLoader::finishedGenerating(): unable to find " "data for\n" @@ -459,8 +502,8 @@ void PreviewLoader::Impl::finishedGenerating(string const & command, // Add these newly generated bitmap files to the cache and // start loading them into LyX. - InProgressStore::const_iterator it = git->second.snippets.begin(); - InProgressStore::const_iterator end = git->second.snippets.end(); + BitmapFile::const_iterator it = git->second.snippets.begin(); + BitmapFile::const_iterator end = git->second.snippets.end(); std::list newimages; @@ -532,13 +575,13 @@ void PreviewLoader::Impl::dumpPreamble(ostream & os) const void PreviewLoader::Impl::dumpData(ostream & os, - InProgressStore const & vec) const + BitmapFile const & vec) const { if (vec.empty()) return; - InProgressStore::const_iterator it = vec.begin(); - InProgressStore::const_iterator end = vec.end(); + BitmapFile::const_iterator it = vec.begin(); + BitmapFile::const_iterator end = vec.end(); for (; it != end; ++it) { os << "\\begin{preview}\n" diff --git a/src/graphics/Previews.C b/src/graphics/Previews.C index b5418a5214..4121f3e1f3 100644 --- a/src/graphics/Previews.C +++ b/src/graphics/Previews.C @@ -43,7 +43,7 @@ struct Previews::Impl { /// typedef boost::shared_ptr PreviewLoaderPtr; /// - typedef std::map CacheType; + typedef std::map CacheType; /// CacheType cache; }; @@ -58,7 +58,7 @@ Previews::~Previews() {} -PreviewLoader & Previews::loader(Buffer * buffer) +PreviewLoader & Previews::loader(Buffer const * buffer) { lyx::Assert(buffer); @@ -69,12 +69,12 @@ PreviewLoader & Previews::loader(Buffer * buffer) pimpl_->cache[buffer] = ptr; return *ptr.get(); } - + return *it->second.get(); } -void Previews::removeLoader(Buffer * buffer) +void Previews::removeLoader(Buffer const * buffer) { if (!buffer) return; @@ -86,15 +86,12 @@ void Previews::removeLoader(Buffer * buffer) } -void Previews::generateBufferPreviews(Buffer * buffer) +void Previews::generateBufferPreviews(Buffer const & buffer) { - if (!buffer || !lyxrc.preview) - return; - - PreviewLoader & ploader = loader(buffer); + PreviewLoader & ploader = loader(&buffer); - Buffer::inset_iterator it = buffer->inset_const_iterator_begin(); - Buffer::inset_iterator end = buffer->inset_const_iterator_end(); + Buffer::inset_iterator it = buffer.inset_const_iterator_begin(); + Buffer::inset_iterator end = buffer.inset_const_iterator_end(); for (; it != end; ++it) { if ((*it)->lyxCode() == Inset::MATH_CODE) { diff --git a/src/graphics/Previews.h b/src/graphics/Previews.h index 50fd7423f5..72b6c0d7c6 100644 --- a/src/graphics/Previews.h +++ b/src/graphics/Previews.h @@ -40,19 +40,19 @@ public: * We assert that (buffer != 0) but do not pass a Buffer & * so that insets do not need to #include buffer.h */ - PreviewLoader & loader(Buffer * buffer); + PreviewLoader & loader(Buffer const * buffer); /** Called from the Buffer d-tor. * If (buffer == 0), does nothing. */ - void removeLoader(Buffer * buffer); + void removeLoader(Buffer const * buffer); /** For a particular buffer, initiate the generation of previews * for each and every snippetof LaTeX that's of interest with * a single forked process. * If (buffer == 0), does nothing. */ - void generateBufferPreviews(Buffer * buffer); + void generateBufferPreviews(Buffer const & buffer); private: /** Make the c-tor, d-tor private so we can control how many objects -- 2.39.2