Forked from
Core Modules / dune-common
4175 commits behind, 90 commits ahead of the upstream repository.
-
Martin Nolte authored
When using DUNE_EXPORT, you need to include visibility.hh. This was omitted when adding this flag to the Singleton class in singleton.hh. This patch adds the missing include.
Martin Nolte authoredWhen using DUNE_EXPORT, you need to include visibility.hh. This was omitted when adding this flag to the Singleton class in singleton.hh. This patch adds the missing include.
singleton.hh 1.93 KiB
// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
// vi: set et ts=4 sw=2 sts=2:
#ifndef DUNE_SINGLETON_HH
#define DUNE_SINGLETON_HH
#include <memory>
#include <dune/common/visibility.hh>
/**
* @file
* @brief Useful wrapper for creating singletons.
*
* Inspired by the article
* <a href="http://www.codeguru.com/cpp/cpp/cpp_mfc/singletons/article.php/c755/">CodeGuru: A Leak-Free Singleton class</a>
*/
namespace Dune
{
/**
* @brief An adapter to turn a class into a singleton.
*
* The class represented by the template parameter T must
* have a parameterless constructor.
*
* Class T can be publicly derived from Singleton<T>:
*
* \code
* #include<dune/common/singleton.hh>
* class Foo : public Dune::Singleton<Foo>
* {
* public:
* Foo()
* {
* bytes = new char[1000];
* }
*
* ~Foo()
* {
* delete[] bytes;
* }
* private:
* char* bytes;
* };
* \endcode
*
* Or one can construct a Singleton of an existing class. Say Foo1 is a class
* with parameterless constructor then
* \code
* typedef Dune::Singleton<Foo1> FooSingleton;
* Foo1 instance& = FooSingleton::instance();
* \endcode
* Creates a singleton of that class and accesses its instance.
*/
template<class T>
class Singleton
{
protected:
/* @brief Private constructor. */
Singleton(){}
/** @brief Private copy constructor. */
Singleton(const Singleton&){}
/** @brief Private assignment operator. */
Singleton& operator=(const Singleton&){}
public:
/**
* @brief Get the instance of the singleton.
* @return The instance of the singleton.
*/
DUNE_EXPORT static T& instance()
{
/* Smartpointer to the instance. */
static std::unique_ptr<T> instance_;
if(instance_.get() == 0)
instance_ = std::unique_ptr<T>(new T());
return *instance_;
}
};
} // namespace Dune
#endif