// -*- C++ -*-
-/* This file is part of
- * =================================================
- *
- * LyX, The Document Processor
- * Copyright 1995 Matthias Ettrich.
- * Copyright 1995-2001 The LyX Team.
+/**
+ * \file GraphicsCache.h
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
*
- * This file Copyright 2000 Baruch Even
- * ================================================= */
+ * \author Baruch Even
+ * \author Angus Leeming
+ *
+ * Full author contact details are available in file CREDITS
+ *
+ * grfx::Cache is the manager of the image cache.
+ * It is responsible for creating the grfx::CacheItem's and maintaining them.
+ *
+ * grfx::Cache is a singleton class. It is possible to have only one
+ * instance of it at any moment.
+ */
#ifndef GRAPHICSCACHE_H
#define GRAPHICSCACHE_H
-#ifdef __GNUG__
-#pragma interface
-#endif
-
-#include <map>
-
#include "LString.h"
-#include "GraphicsCacheItem.h"
+#include <vector>
#include <boost/utility.hpp>
-#include <boost/smart_ptr.hpp>
+#include <boost/scoped_ptr.hpp>
+#include <boost/shared_ptr.hpp>
+
-class GraphicsCacheItem;
+namespace grfx {
-/** GraphicsCache is the manager of the image cache.
- It is responsible of create the GraphicsCacheItem's and maintain them.
-
- GraphicsCache is a singleton class, there should be only one instance of
- it at any moment.
-*/
-class GraphicsCache : boost::noncopyable {
+class CacheItem;
+
+class Cache : boost::noncopyable {
public:
- /// Get the instance of the class.
- static GraphicsCache & getInstance();
- /// Public destructor due to compiler warnings.
- ~GraphicsCache();
- typedef boost::shared_ptr<GraphicsCacheItem> shared_ptr_item;
+ /// This is a singleton class. Get the instance.
+ static Cache & get();
- /// Add a file to the cache.
- shared_ptr_item addFile(string const & filename);
+ /** Which graphics formats can be loaded directly by the image loader.
+ * Other formats can be loaded if a converter to a loadable format
+ * can be defined.
+ */
+ std::vector<string> loadableFormats() const;
-private:
- /// Remove a cache item if it's count has gone to zero.
- void removeFile(string const & filename);
-
- /// Private c-tor so we can control how many objects are instantiated.
- GraphicsCache() {}
-
+ /// Add a graphics file to the cache.
+ void add(string const & file) const;
+
+ /// Remove a file from the cache.
+ void remove(string const & file) const;
+
+ /// Returns \c true if the file is in the cache.
+ bool inCache(string const & file) const;
+
+ /** Get the cache item associated with file.
+ * Returns an empty container if there is no such item.
+ *
+ * IMPORTANT: whatever uses an image must make a local copy of this
+ * ItemPtr. The boost::shared_ptr<>::use_count() function is
+ * used to ascertain whether or not to remove the item from the cache
+ * when remove(file) is called.
+ *
+ * You have been warned!
+ */
+ typedef boost::shared_ptr<CacheItem> ItemPtr;
///
- typedef std::map<string, shared_ptr_item> CacheType;
+ ItemPtr const item(string const & file) const;
+
+private:
+ /** Make the c-tor, d-tor private so we can control how many objects
+ * are instantiated.
+ */
+ Cache();
///
- CacheType cache;
-
- /** We need this so that an Item can tell the cache that it should be
- deleted. (to call removeFile).
- It also helps removing a warning gcc emits. */
- friend class GraphicsCacheItem;
+ ~Cache();
+
+ /// Use the Pimpl idiom to hide the internals.
+ class Impl;
+ /// The pointer never changes although *pimpl_'s contents may.
+ boost::scoped_ptr<Impl> const pimpl_;
};
-#endif
+
+} // namespace grfx
+
+#endif // GRAPHICSCACHE_H