Initializer will initialize several class at once
Former-commit-id: b64c87006e5fd237399b623fca32ec03d0d3d50c
This commit is contained in:
parent
8694f71c2a
commit
91a272482e
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void Uninit()
|
||||||
|
{
|
||||||
|
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 T>
|
template<typename... Args>
|
||||||
bool NzInitializer<T>::IsInitialized() const
|
NzInitializer<Args...>::~NzInitializer()
|
||||||
{
|
{
|
||||||
return T::IsInitialized();
|
if (m_initialized)
|
||||||
|
NzImplInitializer<Args...>::Uninit();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename... Args>
|
||||||
NzInitializer<T>::operator bool() const
|
bool NzInitializer<Args...>::IsInitialized() const
|
||||||
{
|
{
|
||||||
return T::IsInitialized();
|
return m_initialized;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename... Args>
|
||||||
|
NzInitializer<Args...>::operator bool() const
|
||||||
|
{
|
||||||
|
return m_initialized;
|
||||||
}
|
}
|
||||||
|
|
||||||
#include <Nazara/Core/DebugOff.hpp>
|
#include <Nazara/Core/DebugOff.hpp>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue