Fixed singleton implementation to work also when eepp is compiled as a dynamic library.

This commit is contained in:
spartanj@gmail.com
2012-01-21 21:28:48 -03:00
parent 9915d4438b
commit 5b43ec533e
30 changed files with 94 additions and 26 deletions

View File

@@ -150,8 +150,6 @@
#if EE_PLATFORM == EE_PLATFORM_WIN
#ifdef EE_DYNAMIC
#define EE_CALL _stdcall
// Windows platforms
#ifdef EE_EXPORTS
// From DLL side, we must export
@@ -165,20 +163,20 @@
#pragma warning(disable : 4251)
#pragma warning(disable : 4244)
#pragma warning(disable : 4996)
#pragma warning(disable : 4311)
#pragma warning(disable : 4312)
#endif
#else
// No specific directive needed for static build
#ifndef EE_API
#define EE_API
#endif
#define EE_CALL
#endif
#else
// Other platforms don't need to define anything
#ifndef EE_API
#define EE_API
#endif
#define EE_CALL
#endif
#ifndef EE_USE_DOUBLES

View File

@@ -2,6 +2,8 @@
namespace EE { namespace Graphics {
SINGLETON_DECLARE_IMPLEMENTATION(cFontManager)
cFontManager::cFontManager() {
}

View File

@@ -7,8 +7,9 @@
namespace EE { namespace Graphics {
class EE_API cFontManager : public tResourceManager<cFont>, public tSingleton<cFontManager> {
friend class tSingleton<cFontManager>;
public:
SINGLETON_DECLARE_HEADERS(cFontManager)
cFontManager();
virtual ~cFontManager();

View File

@@ -2,6 +2,8 @@
namespace EE { namespace Graphics { namespace Private {
SINGLETON_DECLARE_IMPLEMENTATION(cFrameBufferManager)
cFrameBufferManager::cFrameBufferManager()
{
}

View File

@@ -7,8 +7,9 @@
namespace EE { namespace Graphics { namespace Private {
class EE_API cFrameBufferManager : public tContainer<cFrameBuffer>, public tSingleton<cFrameBufferManager> {
friend class tSingleton<cFrameBufferManager>;
public:
SINGLETON_DECLARE_HEADERS(cFrameBufferManager)
cFrameBufferManager();
virtual ~cFrameBufferManager();

View File

@@ -2,6 +2,8 @@
namespace EE { namespace Graphics {
SINGLETON_DECLARE_IMPLEMENTATION(cGlobalBatchRenderer)
cGlobalBatchRenderer::cGlobalBatchRenderer() {
AllocVertexs( 1024 );
}

View File

@@ -8,8 +8,9 @@ namespace EE { namespace Graphics {
/** @brief The global Batch Renderer class. This class will be used by the engine for the rendering. */
class EE_API cGlobalBatchRenderer : public tSingleton<cGlobalBatchRenderer>, public cBatchRenderer {
friend class tSingleton<cGlobalBatchRenderer>;
public:
SINGLETON_DECLARE_HEADERS(cGlobalBatchRenderer)
cGlobalBatchRenderer();
~cGlobalBatchRenderer();

View File

@@ -3,6 +3,8 @@
namespace EE { namespace Graphics {
SINGLETON_DECLARE_IMPLEMENTATION(cGlobalShapeGroup)
cGlobalShapeGroup::cGlobalShapeGroup() :
cShapeGroup( "global" )
{

View File

@@ -7,8 +7,9 @@
namespace EE { namespace Graphics {
class EE_API cGlobalShapeGroup : public cShapeGroup, public tSingleton<cGlobalShapeGroup> {
friend class tSingleton<cGlobalShapeGroup>;
public:
SINGLETON_DECLARE_HEADERS(cGlobalShapeGroup)
cGlobalShapeGroup();
~cGlobalShapeGroup();

View File

@@ -2,6 +2,8 @@
namespace EE { namespace Graphics {
SINGLETON_DECLARE_IMPLEMENTATION(cShaderProgramManager)
cShaderProgramManager::cShaderProgramManager()
{
}

View File

@@ -7,8 +7,9 @@
namespace EE { namespace Graphics {
class EE_API cShaderProgramManager : public tResourceManager<cShaderProgram>, public tSingleton<cShaderProgramManager> {
friend class tSingleton<cShaderProgramManager>;
public:
SINGLETON_DECLARE_HEADERS(cShaderProgramManager)
cShaderProgramManager();
virtual ~cShaderProgramManager();

View File

@@ -3,6 +3,8 @@
namespace EE { namespace Graphics {
SINGLETON_DECLARE_IMPLEMENTATION(cShapeGroupManager)
cShapeGroupManager::cShapeGroupManager() :
tResourceManager<cShapeGroup>( false )
{

View File

@@ -8,8 +8,9 @@
namespace EE { namespace Graphics {
class EE_API cShapeGroupManager : public tResourceManager<cShapeGroup>, public tSingleton<cShapeGroupManager> {
friend class tSingleton<cShapeGroupManager>;
public:
SINGLETON_DECLARE_HEADERS(cShapeGroupManager)
cShapeGroupManager();
virtual ~cShapeGroupManager();

View File

@@ -4,6 +4,8 @@
namespace EE { namespace Graphics {
SINGLETON_DECLARE_IMPLEMENTATION(cTextureFactory)
cTextureFactory::cTextureFactory() :
mMemSize(0)
{

View File

@@ -14,8 +14,9 @@ class cGlobalBatchRenderer;
/** @brief The Texture Manager Class. Here we do all the textures stuff. (Singleton Class) */
class EE_API cTextureFactory: public tSingleton<cTextureFactory>, protected cMutex {
friend class tSingleton<cTextureFactory>;
public:
SINGLETON_DECLARE_HEADERS(cTextureFactory)
/** Create an empty texture
* @param Width Texture Width
* @param Height Texture Height

View File

@@ -2,6 +2,8 @@
namespace EE { namespace Graphics { namespace Private {
SINGLETON_DECLARE_IMPLEMENTATION(cVertexBufferManager)
cVertexBufferManager::cVertexBufferManager()
{
}

View File

@@ -7,8 +7,9 @@
namespace EE { namespace Graphics { namespace Private {
class EE_API cVertexBufferManager : public tContainer<cVertexBuffer>, public tSingleton<cVertexBufferManager> {
friend class tSingleton<cVertexBufferManager>;
public:
SINGLETON_DECLARE_HEADERS(cVertexBufferManager)
cVertexBufferManager();
virtual ~cVertexBufferManager();

View File

@@ -6,6 +6,8 @@
CP_NAMESPACE_BEGIN
SINGLETON_DECLARE_IMPLEMENTATION(cPhysicsManager)
cPhysicsManager::cPhysicsManager() :
mMemoryManager( false )
{

View File

@@ -11,8 +11,9 @@ class cConstraint;
class cSpace;
class CP_API cPhysicsManager : public tSingleton<cPhysicsManager> {
friend class tSingleton<cPhysicsManager>;
public:
SINGLETON_DECLARE_HEADERS(cPhysicsManager)
class cDrawSpaceOptions {
public:
cDrawSpaceOptions() :

View File

@@ -2,6 +2,8 @@
namespace EE { namespace System {
SINGLETON_DECLARE_IMPLEMENTATION(cLog)
cLog::cLog() :
mSave( false ),
mConsoleOutput( false ),

View File

@@ -8,8 +8,9 @@
namespace EE { namespace System {
class EE_API cLog : public tSingleton<cLog> {
friend class tSingleton<cLog>;
public:
SINGLETON_DECLARE_HEADERS(cLog)
void Save(const std::string& filepath = "" );
void Write(const std::string& Text, const bool& newLine = true);

View File

@@ -2,6 +2,8 @@
namespace EE { namespace System {
SINGLETON_DECLARE_IMPLEMENTATION(cPackManager)
cPackManager::cPackManager() :
mFallback( true )
{

View File

@@ -8,8 +8,9 @@
namespace EE { namespace System {
class EE_API cPackManager : public tContainer<cPack>, public tSingleton<cPackManager> {
friend class tSingleton<cPackManager>;
public:
SINGLETON_DECLARE_HEADERS(cPackManager)
cPackManager();
virtual ~cPackManager();

View File

@@ -2,19 +2,51 @@
#define EE_SYSTEMSINGLETON_H
#include "../base.hpp"
#include <typeinfo>
#define SINGLETON_DECLARE_HEADERS( T ) \
static T * CreateSingleton(); \
\
static T * ExistsSingleton(); \
\
static T * instance(); \
\
static void DestroySingleton();
#define SINGLETON_DECLARE_IMPLEMENTATION( T ) \
template<> T* tSingleton<T>::ms_singleton = NULL; \
\
T* T::CreateSingleton() { \
if ( NULL == ms_singleton ) { \
ms_singleton = eeNew( T, () ); \
} \
\
return ms_singleton; \
} \
\
T * T::ExistsSingleton() { \
return ms_singleton; \
} \
\
T * T::instance() { \
return CreateSingleton(); \
} \
\
void T::DestroySingleton() { \
eeSAFE_DELETE(ms_singleton) ; \
}
namespace EE { namespace System {
/** @brief Template class for only one instance classes. */
template<typename T>
class tSingleton {
static T* ms_singleton;
protected:
static T* ms_singleton;
public:
/** Get the singleton pointer */
static T* CreateSingleton() {
if (ms_singleton == 0) {
if ( NULL == ms_singleton ) {
ms_singleton = eeNew( T, () );
}
@@ -33,13 +65,9 @@ class tSingleton {
/** Destroy the singleton instance */
static void DestroySingleton() {
if( ms_singleton != 0 ) {
eeDelete( ms_singleton );
ms_singleton = 0;
}
eeSAFE_DELETE(ms_singleton);
}
};
template <typename T> T* tSingleton <T>::ms_singleton = 0;
}}
#endif

View File

@@ -3,6 +3,8 @@
namespace EE { namespace UI {
SINGLETON_DECLARE_IMPLEMENTATION(cUIManager)
cUIManager::cUIManager() :
mWindow( NULL ),
mKM( NULL ),

View File

@@ -9,8 +9,9 @@
namespace EE { namespace UI {
class EE_API cUIManager : public tSingleton<cUIManager> {
friend class tSingleton<cUIManager>;
public:
SINGLETON_DECLARE_HEADERS(cUIManager)
cUIManager();
~cUIManager();

View File

@@ -4,6 +4,8 @@
namespace EE { namespace UI {
SINGLETON_DECLARE_IMPLEMENTATION(cUIThemeManager)
cUIThemeManager::cUIThemeManager() :
tResourceManager<cUITheme>( true ),
mFont( NULL ),

View File

@@ -9,8 +9,9 @@ namespace EE { namespace UI {
class cUIControl;
class EE_API cUIThemeManager : public tResourceManager<cUITheme>, public tSingleton<cUIThemeManager> {
friend class tSingleton<cUIThemeManager>;
public:
SINGLETON_DECLARE_HEADERS(cUIThemeManager)
cUIThemeManager();
virtual ~cUIThemeManager();

View File

@@ -32,6 +32,8 @@
namespace EE { namespace Window {
SINGLETON_DECLARE_IMPLEMENTATION(cEngine)
cEngine::cEngine() :
mBackend( NULL ),
mWindow( NULL )

View File

@@ -9,8 +9,9 @@ namespace EE { namespace Window {
/** @brief The window management class. Here the engine start working. (Singleton Class). */
class EE_API cEngine : public tSingleton<cEngine> {
friend class tSingleton<cEngine>;
public:
SINGLETON_DECLARE_HEADERS(cEngine)
~cEngine();
/** Creates a new window.