]> git.lyx.org Git - features.git/blob - src/graphics/GraphicsCache.cpp
Use range-based loops
[features.git] / src / graphics / GraphicsCache.cpp
1 /**
2  * \file GraphicsCache.cpp
3  * This file is part of LyX, the document processor.
4  * Licence details can be found in the file COPYING.
5  *
6  * \author Baruch Even
7  * \author Angus Leeming
8  *
9  * Full author contact details are available in file CREDITS.
10  */
11
12 #include <config.h>
13
14 #include "GraphicsCache.h"
15 #include "GraphicsCacheItem.h"
16 #include "GraphicsImage.h"
17
18 #include "Format.h"
19
20 #include "frontends/Application.h"
21
22 #include "support/debug.h"
23 #include "support/FileName.h"
24 #include "support/filetools.h"
25
26 #include <map>
27
28 using namespace std;
29 using namespace lyx::support;
30
31 namespace lyx {
32
33 namespace graphics {
34
35 /** The cache contains one item per file, so use a map to find the
36  *  cache item quickly by filename.
37  */
38 typedef map<FileName, Cache::ItemPtr> CacheType;
39
40 class Cache::Impl {
41 public:
42         ///
43         CacheType cache;
44 };
45
46
47 Cache & Cache::get()
48 {
49         // Now return the cache
50         static Cache singleton;
51         return singleton;
52 }
53
54
55 Cache::Cache()
56         : pimpl_(new Impl)
57 {}
58
59
60 Cache::~Cache()
61 {
62         delete pimpl_;
63 }
64
65
66 vector<string> const & Cache::loadableFormats() const
67 {
68         static vector<string> fmts;
69
70         if (!fmts.empty())
71                 return fmts;
72
73         for (string const & native_extension : frontend::loadableImageFormats()) {
74                 for (Format const & format : theFormats()) {
75                         if (format.extension() == native_extension) {
76                                 fmts.push_back(format.name());
77                                 break;
78                         }
79                 }
80         }
81
82         if (lyxerr.debugging()) {
83                 LYXERR(Debug::GRAPHICS, "LyX recognises the following image formats:");
84                 for (string const & format : fmts) {
85                         LYXERR(Debug::GRAPHICS, format << ',');
86                 }
87         }
88
89         return fmts;
90 }
91
92
93 void Cache::add(FileName const & file, FileName const & doc_file) const
94 {
95         // Is the file in the cache already?
96         if (inCache(file)) {
97                 LYXERR(Debug::GRAPHICS, "Cache::add(" << file << "):\n"
98                                         << "The file is already in the cache.");
99                 return;
100         }
101
102         pimpl_->cache[file] = ItemPtr(new CacheItem(file, doc_file));
103 }
104
105
106 void Cache::remove(FileName const & file) const
107 {
108         CacheType::iterator it = pimpl_->cache.find(file);
109         if (it == pimpl_->cache.end())
110                 return;
111
112         ItemPtr & item = it->second;
113
114         if (item.use_count() == 1) {
115                 // The graphics file is in the cache, but nothing else
116                 // references it.
117                 pimpl_->cache.erase(it);
118         }
119 }
120
121
122 bool Cache::inCache(FileName const & file) const
123 {
124         return pimpl_->cache.find(file) != pimpl_->cache.end();
125 }
126
127
128 Cache::ItemPtr const Cache::item(FileName const & file) const
129 {
130         CacheType::const_iterator it = pimpl_->cache.find(file);
131         if (it == pimpl_->cache.end())
132                 return ItemPtr();
133
134         return it->second;
135 }
136
137 } // namespace graphics
138 } // namespace lyx