parent
44f5171b19
commit
a03968e42e
@ -0,0 +1,41 @@
|
|||||||
|
#ifndef SINGLETON_CALL_ONCE_HPP
|
||||||
|
#define SINGLETON_CALL_ONCE_HPP
|
||||||
|
|
||||||
|
#include <mutex>
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
class Singleton_call_once
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
|
||||||
|
Singleton_call_once() {};
|
||||||
|
virtual ~Singleton_call_once() {};
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
Singleton_call_once( const Singleton_call_once& );
|
||||||
|
Singleton_call_once& operator=( const Singleton_call_once& );
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
static T* getInstance()
|
||||||
|
{
|
||||||
|
std::call_once(m_flag, &Singleton_call_once::do_init);
|
||||||
|
return m_instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
static void do_init()
|
||||||
|
{
|
||||||
|
m_instance = new T();
|
||||||
|
}
|
||||||
|
|
||||||
|
static T* m_instance;
|
||||||
|
static std::once_flag m_flag;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<class T> T* Singleton_call_once<T>::m_instance = 0;
|
||||||
|
template<class T> std::once_flag Singleton_call_once<T>::m_flag;
|
||||||
|
|
||||||
|
#endif // SINGLETON_CALL_ONCE_HPP
|
@ -0,0 +1,35 @@
|
|||||||
|
#include <cxxtest/TestSuite.h>
|
||||||
|
|
||||||
|
#define private public // need to reach Singleton's private m_instance
|
||||||
|
|
||||||
|
#include "Common.hpp"
|
||||||
|
#include "Fixture.hpp"
|
||||||
|
#include "Singleton_call_once.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
class TestSingletonCallOnceSuite : public CxxTest::TestSuite
|
||||||
|
{
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
class BasicSingleton : public Singleton_call_once<BasicSingleton>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
int getSeven()
|
||||||
|
{
|
||||||
|
TRACE;
|
||||||
|
return 7;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
void testBasic( void )
|
||||||
|
{
|
||||||
|
TEST_HEADER;
|
||||||
|
|
||||||
|
TS_ASSERT_EQUALS( BasicSingleton::getInstance()->getSeven(), 7 );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
};
|
Loading…
Reference in new issue