]> git.lyx.org Git - features.git/commitdiff
Small tidy up of preview code, part II.
authorAngus Leeming <leeming@lyx.org>
Tue, 16 Jul 2002 18:10:51 +0000 (18:10 +0000)
committerAngus Leeming <leeming@lyx.org>
Tue, 16 Jul 2002 18:10:51 +0000 (18:10 +0000)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@4655 a592a061-630c-0410-9148-cb99ea01b6c8

src/graphics/ChangeLog
src/graphics/PreviewLoader.C
src/graphics/Previews.C
src/graphics/Previews.h

index 6c0cfd02be1a5aa9f3a9ff8aaf0e2bd7e5b00a63..cf8d110466747a826a5980db1038e06964ed9706 100644 (file)
@@ -1,3 +1,11 @@
+2002-07-16  Angus Leeming  <leeming@lyx.org>
+
+       * 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  <moz@compsoc.man.ac.uk>
 
        * GraphicsImage.h: remove getPixmap/X, add isDrawable()
index 887b7ccb92218f7ec32fcff2d46761c10b256e95..9344e69e79e917271e10adaf2fff4e63c73c8b0b 100644 (file)
@@ -64,9 +64,11 @@ namespace {
 
 typedef pair<string, string> StrPair;
 
-typedef list<string> PendingStore;
+// A list of alll snippets to be converted to previews
+typedef list<string> PendingSnippets;
 
-typedef vector<StrPair> InProgressStore;
+// Each item in the vector is a pair<snippet, image file name>.
+typedef vector<StrPair> 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<snippet, image file name>.
-       InProgressStore snippets;
+       ///
+       BitmapFile snippets;
 };
 
+typedef map<string, InProgress>  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<string, InProgress> 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<PreviewImagePtr> 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"
index b5418a521474403279750a0ae8375a04232aabc8..4121f3e1f3d3b6c246c1f3b4360317338486de48 100644 (file)
@@ -43,7 +43,7 @@ struct Previews::Impl {
        ///
        typedef boost::shared_ptr<PreviewLoader> PreviewLoaderPtr;
        ///
-       typedef std::map<Buffer *, PreviewLoaderPtr> CacheType;
+       typedef std::map<Buffer const *, PreviewLoaderPtr> 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) {
index 50fd7423f5948e090c108c32b7d0fa3456588566..72b6c0d7c6090aa88e6b4ee0e37b06e3fd93a7b4 100644 (file)
@@ -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