Bomberman-OverlordEngine-x64 / OverlordEngine / Utils / Singleton.h
Singleton.h
Raw
#pragma once

template<class T>
class Singleton
{
public:

	static T* Create(const GameContext& gameContext)
	{
		if(!m_IsInitialized)
		{
			m_pInstance = new T();
			m_pInstance->m_GameContext = gameContext;
			m_pInstance->Initialize();
			m_IsInitialized = true;
		}

		return m_pInstance;
	}
	
	static T* Get()
	{
		if (!m_IsInitialized) {
			Logger::LogWarning(L"Singleton not yet initialized");
			return nullptr;
		}

		if(!m_pInstance)
		{
			Logger::LogWarning(L"Singleton is initialized but instance in NULL");
		}

		return m_pInstance;
	}
	
	static void Destroy()
	{
		delete m_pInstance;
		m_pInstance = nullptr;
	}

protected:
	virtual void Initialize() = 0;

	static bool m_IsInitialized;
	GameContext m_GameContext{};

private:
	static T* m_pInstance;
};

template<class T> 
T* Singleton<T>::m_pInstance{};

template<class T>
bool Singleton<T>::m_IsInitialized{};