Initializer will initialize several class at once

Former-commit-id: b64c87006e5fd237399b623fca32ec03d0d3d50c
This commit is contained in:
Lynix 2013-04-03 16:42:54 +02:00
parent 8694f71c2a
commit 91a272482e
2 changed files with 57 additions and 18 deletions

View File

@ -9,16 +9,19 @@
#include <Nazara/Prerequesites.hpp> #include <Nazara/Prerequesites.hpp>
template<typename T> template<typename... Args>
class NzInitializer class NzInitializer
{ {
public: public:
template<typename... Args> NzInitializer(Args... args); NzInitializer();
~NzInitializer(); ~NzInitializer();
bool IsInitialized() const; bool IsInitialized() const;
operator bool() const; operator bool() const;
private:
bool m_initialized;
}; };
#include <Nazara/Core/Initializer.inl> #include <Nazara/Core/Initializer.inl>

View File

@ -2,33 +2,69 @@
// This file is part of the "Nazara Engine - Core module" // This file is part of the "Nazara Engine - Core module"
// For conditions of distribution and use, see copyright notice in Config.hpp // For conditions of distribution and use, see copyright notice in Config.hpp
#include <Nazara/Core/Initializer.hpp>
#include <Nazara/Core/Debug.hpp> #include <Nazara/Core/Debug.hpp>
template<typename T> template<typename...> struct NzImplInitializer;
template<typename... Args>
NzInitializer<T>::NzInitializer(Args... args)
{
T::Initialize(args...);
}
template<typename T> template<typename T, typename... Rest>
NzInitializer<T>::~NzInitializer() struct NzImplInitializer<T, Rest...>
{ {
if (T::IsInitialized()) static bool Init()
{
if (T::Initialize())
{
if (NzImplInitializer<Rest...>::Init())
return true;
else
T::Uninitialize(); T::Uninitialize();
} }
template<typename T> return false;
bool NzInitializer<T>::IsInitialized() const
{
return T::IsInitialized();
} }
template<typename T> static void Uninit()
NzInitializer<T>::operator bool() const
{ {
return T::IsInitialized(); T::Uninitialize();
NzImplInitializer<Rest...>::Uninit();
}
};
template<>
struct NzImplInitializer<>
{
static bool Init()
{
return true;
}
static void Uninit()
{
}
};
template<typename... Args>
NzInitializer<Args...>::NzInitializer()
{
m_initialized = NzImplInitializer<Args...>::Init();
}
template<typename... Args>
NzInitializer<Args...>::~NzInitializer()
{
if (m_initialized)
NzImplInitializer<Args...>::Uninit();
}
template<typename... Args>
bool NzInitializer<Args...>::IsInitialized() const
{
return m_initialized;
}
template<typename... Args>
NzInitializer<Args...>::operator bool() const
{
return m_initialized;
} }
#include <Nazara/Core/DebugOff.hpp> #include <Nazara/Core/DebugOff.hpp>