Skip to content
Snippets Groups Projects
Commit 58265147 authored by Martin Nolte's avatar Martin Nolte
Browse files

remove Singleton; it is used nowhere in the core modules

[[Imported from SVN: r6930]]
parent 3f3e2103
No related branches found
No related tags found
No related merge requests found
......@@ -63,7 +63,6 @@ commoninclude_HEADERS = \
propertymap.hh \
reservedvector.hh \
shared_ptr.hh \
singleton.hh \
smallobject.hh \
smartptr.hh \
static_assert.hh \
......
// -*- 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>
/**
* @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
{
/** @brief Smartpointer to the instance. */
static std::auto_ptr<T> instance_;
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.
*/
static T& instance()
{
if(instance_.get() == 0)
instance_ = std::auto_ptr<T>(new T());
return *instance_;
}
};
template<class T>
typename std::auto_ptr<T> Singleton<T>::instance_;
} // namespace Dune
#endif
......@@ -25,7 +25,6 @@ timing_xpr
timing_old
timing_flt
bigunsignedinttest
singletontest
utilitytest
testfassign_fail1
testfassign_fail2
......
......@@ -21,7 +21,6 @@ TESTPROGS = \
poolallocatortest \
shared_ptrtest_config \
shared_ptrtest_dune \
singletontest \
static_assert_test \
streamtest \
testfassign1 \
......@@ -151,8 +150,6 @@ enumsettest_SOURCES=enumsettest.cc
gcdlcmtest_SOURCES = gcdlcmtest.cc
singletontest_SOURCES = singletontest.cc
utilitytest_SOURCES = utilitytest.cc
testfassign1_SOURCES = testfassign.cc testfassign2.cc
......
// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
// vi: set et ts=4 sw=2 sts=2:
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <dune/common/singleton.hh>
#include <iostream>
class Foo : public Dune::Singleton<Foo>
{
public:
Foo()
{
bytes = new char[1000];
}
~Foo()
{
delete[] bytes;
}
private:
char* bytes;
};
class Foo1
{
public:
Foo1()
{
bytes = new char[1000];
}
~Foo1()
{
delete[] bytes;
}
private:
char* bytes;
};
typedef Dune::Singleton<Foo1> FooSingleton;
Foo* globalFoo = 0;
Foo1* globalFoo1 = 0;
void setFoo()
{
globalFoo = &Foo::instance();
}
void setFoo1()
{
globalFoo1 = &FooSingleton::instance();
}
int testFoo()
{
if(globalFoo != &Foo::instance()) {
std::cerr<<" Foo is not a real singleton!"<<std::endl;
return 1;
}
return 0;
}
int testFoo1()
{
if(globalFoo1 != &FooSingleton::instance()) {
std::cerr<<" Foo is not a real singleton!"<<std::endl;
return 1;
}
return 0;
}
int main()
{
int ret=0;
{
Foo& foo = Foo::instance();
Foo& foo1 = Foo::instance();
if(&foo!=&foo1) {
std::cerr<<" Foo is not a real singleton!"<<std::endl;
++ret;
}
}
setFoo();
ret += testFoo();
{
Foo1& foo = FooSingleton::instance();
Foo1& foo1 = FooSingleton::instance();
if(&foo!=&foo1) {
std::cerr<<" Foo is not a real singleton!"<<std::endl;
++ret;
}
}
setFoo1();
return ret += testFoo1();
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment